解决threejs模型非全屏下raycaster选中偏移问题(非复制粘贴)

问题

最近做项目遇到threejs的一个问题,我在全屏(容器坐标(0,0))状态下使用射线选中没有问题,但是容器如果不是在(0,0)坐标下就会发现选不中了,见下图:


image.png

threejs鼠标拾取方法见官网demo代码贴一下:

var raycaster = new THREE.Raycaster();
var mouse = new THREE.Vector2();

function onMouseMove( event ) {

    // 将鼠标位置归一化为设备坐标。x 和 y 方向的取值范围是 (-1 to +1)

    mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
    mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;

}

function render() {

    // 通过摄像机和鼠标位置更新射线
    raycaster.setFromCamera( mouse, camera );

    // 计算物体和射线的焦点
    var intersects = raycaster.intersectObjects( scene.children );

    for ( var i = 0; i < intersects.length; i++ ) {

        intersects[ i ].object.material.color.set( 0xff0000 );

    }

    renderer.render( scene, camera );

}

window.addEventListener( 'mousemove', onMouseMove, false );

window.requestAnimationFrame(render);

解决方法

    mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
    mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;

这里的window.innerWidth和window.innerHeight其实是容器的宽高,并且默认按照(0,0)来计算的,需要考虑偏移的位置(px,py)

    mouse.x = ( (event.clientX - px)  / renderer.domElement.clientWidth) * 2 - 1;
    mouse.y = - ( (event.clientY - py) / renderer.domElement.clientHeight) * 2 + 1;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容