Javascript 夹紧摄像机旋转3.js

Javascript 夹紧摄像机旋转3.js,javascript,camera,rotation,three.js,clamp,Javascript,Camera,Rotation,Three.js,Clamp,经过一个漫长的四元数之夜,我终于让mouselook在使用three.js的测试游戏中正常工作 但我注意到,如果我继续向上看,相机会翻转过来。我匆忙地将一些代码放在一起,当用户相对悠闲地滚动时,这些代码可以很好地工作,但当用户快速滚动时,这些代码显然不起作用。我可能没有正确夹紧相机旋转,那么我该怎么做呢?还是我走对了方向,只是错过了一些明显的东西 指向项目的链接(源内联): 我的相机旋转功能: //Rotates camera horizontally y-=mouseMove.x*.02;

经过一个漫长的四元数之夜,我终于让mouselook在使用three.js的测试游戏中正常工作

但我注意到,如果我继续向上看,相机会翻转过来。我匆忙地将一些代码放在一起,当用户相对悠闲地滚动时,这些代码可以很好地工作,但当用户快速滚动时,这些代码显然不起作用。我可能没有正确夹紧相机旋转,那么我该怎么做呢?还是我走对了方向,只是错过了一些明显的东西

指向项目的链接(源内联):

我的相机旋转功能:

//Rotates camera horizontally
y-=mouseMove.x*.02;
//rotates camera vertically
//checks to see if it's moving camera up or down
if(mouseMove.y<0){
    //checks that it's not at the bottom or top
    if(Math.abs(camera.rotation.y*(180/Math.PI))>2 || camera.rotation.x<=0){
        x-=mouseMove.y*.02;
    }
} else if(mouseMove.y>0) {
    if(Math.abs(camera.rotation.y*(180/Math.PI))>2 || camera.rotation.x>=0){
        x-=mouseMove.y*.02;
    }
}
function updateCamera(){
    camera.lastRotation=camera.quaternion.clone();
    var euler = new THREE.Euler( 0, 0, 0, 'YXZ' );
    euler.x = x;
    euler.y = y;
    euler.z = z;
    mouseMove.x=0;
    mouseMove.y=0;
    camera.quaternion.setFromEuler( euler );
}

问题的图像:

摄像机的快速移动使我的眼睛受伤!我觉得这可能有点太敏感了。除此之外,对四元数的研究令人印象深刻。我自己从来都不太了解它们。这就是我喜欢相机运动的方式。反应迅速。在实际的游戏中,我会为它添加一个滑块,但在这个游戏中,它只是一个全局变量。我花了整整一天的时间试图弄明白如何使用四元数,但我仍然不完全理解,但我知道的数量相当可观。就夹持而言,我很难堪。降低旋转速度可以做到这一点,但有些人喜欢更快的旋转,我也必须对此做出解释。这与问题无关,但我注意到,播放器移动的速度与相机视图和平面之间的角度的余弦成正比,而不仅仅是常数。我不确定你是否注意到了。是的,我注意到了,但一次一个问题太复杂了。您可以简化相机更新,如下所示:
camera.rotation.order='YXZ'
<代码>函数updateCamera(){camera.rotation.set(x,y,z);},但您所做的可能不正确。(2) 使用
PointerLockControls
代替,如中所述,或复制其中使用的方法。