three.js r91中PointerLockControls相机非原点时旋转异常求助
解决PointerLockControls相机旋转异常问题
我来帮你排查这个旋转异常的问题——核心原因是你没搞清楚PointerLockControls的层级结构:
PointerLockControls内部是这样的:controls.getObject()是一个空的Object3D容器,相机默认是作为这个容器的子对象,且位置在容器的原点(0,0,0)。当你开启指针锁定后,鼠标控制的是这个容器的旋转,而非相机本身。
你现在的代码里同时设置了camera.position.set(100, 0, 0)和controls.getObject().position.set(100, 0, 0),这相当于把相机在容器里也偏移了100单位,此时容器旋转时,相机就会绕容器的原点(而不是自身中心)做圆周运动,这就是你看到的“围绕其他点旋转”的问题。
正确的解决方案
只需要保留对controls.getObject()的位置设置,同时把相机的位置重置回容器原点,确保相机是在容器中心被旋转:
// 不要直接设置camera的position,把它重置回容器原点 camera.position.set(0, 0, 0); controls = new THREE.PointerLockControls(camera); // 只需要设置容器的位置,相机作为子对象会跟着移动 controls.getObject().position.set(100, 0, 0); scene.add(controls.getObject());
这样调整后,鼠标环视时,容器带着相机旋转,相机自身在容器中心,旋转就会是围绕自身的正常效果了。
内容的提问来源于stack exchange,提问作者zwcloud




