I like to implement some length measurement by selecting 2 points on objects and using raycasting to get the points.
The basics are working but i have a annoying offset between real mouseposition and the shown intersection. This picture explain it the best:
This is my code (the comments are tried without success):
function onPointerMove(event) {
// var rect = webglRenderer.domElement.getBoundingClientRect();
// pointer.x = ( ( event.clientX - rect.left ) / rect.width ) * 2 - 1;
// pointer.y = - ( ( event.clientY - rect.top ) / rect.height ) * 2 + 1;
// pointer.set((event.clientX / window.innerWidth) * 2 - 1, -(event.clientY / window.innerHeight) * 2 + 1);
// pointer.x = ( event.offsetX / webglRenderer.domElement.width ) * 2 - 1;
// pointer.y = -( event.offsetY / webglRenderer.domElement.height ) * 2 + 1;
// var rect = webglRenderer.domElement.getBoundingClientRect();
// pointer.x = ( ( event.clientX - rect.left ) / ( rect.width - rect.left ) ) * 2 - 1;
// pointer.y = - ( ( event.clientY - rect.top ) / ( rect.bottom - rect.top) ) * 2 + 1;
// raycaster.params.Line.threshold = 0.01;
// raycaster.params.Points.threshold = 0.01;
// var size = webglRenderer.getSize();
// pointer.x = ( event.offsetX / webglRenderer.domElement.width ) * 2 - 1;
// pointer.y = - ( event.offsetY / webglRenderer.domElement.height ) * 2 + 1;
// var canvasPosition = webglRenderer.domElement.getBoundingClientRect();
//
// var mouseX = event.offsetX - canvasPosition.left;
// var mouseY = event.offsetY - canvasPosition.top;
//
// pointer = new THREE.Vector2(
// 2 * (mouseX / webglRenderer.domElement.width) - 1,
// 1 - 2 * (mouseY / webglRenderer.domElement.height));
var rect = webglRenderer.domElement.getBoundingClientRect();
pointer.x = ( ( event.clientX - rect.left ) / ( rect. right - rect.left ) ) * 2 - 1;
pointer.y = - ( ( event.clientY - rect.top ) / ( rect.bottom - rect.top) ) * 2 + 1;
raycaster.setFromCamera(pointer, camera);
var intersects = raycaster.intersectObjects(objects, true);
if (intersects.length > 0) {
var intersect = intersects[ 0 ];
rollOverMesh.position.copy(intersect.point).add(intersect.face.normal);
}
render();
}
some more style infos:
webglRenderer.domElement.style.position = "relative"; webglRenderer.domElement.className = "viewer";
<body>
<div class="container-fluid main-wrapper">
<div id="viewer">
</div>
</div>
</body>
.main-wrapper {
height: 100vh;
width: 100vw;
padding-left: 0 !important;
padding-right: 0 !important;
}.viewer{
display: block;
top: 0;
left: 0;
height: 100%;
width: 100%;
z-index:1;
position: absolute;
}