three.js:限制摄像头';s旋转

three.js:限制摄像头';s旋转,three.js,quaternions,Three.js,Quaternions,我正在使用three.js,试图为真实世界的相机建模。因此,我想将它的旋转轴限制为沿x轴和y轴旋转90度 有没有简单的方法可以做到这一点?我当前的代码运行得不是特别好(当你试图同时将相机移过X和Y边界时,它会发疯) if(xRot!=null&&xRot!=未定义){ 相机。旋转(xRot); } if(yRot!=null&&yRot!=未定义){ 旋转摄影机(yRot); } if(camera.rotation.xmaxCameraRotX){ camera.rotation.x=max

我正在使用three.js,试图为真实世界的相机建模。因此,我想将它的旋转轴限制为沿x轴和y轴旋转90度

有没有简单的方法可以做到这一点?我当前的代码运行得不是特别好(当你试图同时将相机移过X和Y边界时,它会发疯)

if(xRot!=null&&xRot!=未定义){
相机。旋转(xRot);
}
if(yRot!=null&&yRot!=未定义){
旋转摄影机(yRot);
}
if(camera.rotation.xmaxCameraRotX){
camera.rotation.x=maxCameraRotX;
}     
if(camera.rotation.ymaxCameraRotY){
camera.rotation.y=maxCameraRotY;

}
实际上,我通过检查Three.js演示中的一些现有代码,找到了一个名为PointerLock的库的解决方案。其思想是将多个对象实际堆叠在彼此内部:从水平移动的对象(偏航对象)开始,将另一个对象放置在垂直移动的偏航对象(俯仰对象)内部,然后将实际摄影机放置在俯仰对象内部

然后,只沿各自的轴旋转外部对象(偏航和俯仰),因此如果同时旋转这两个对象,它们将自动更正。例如,如果沿y轴将偏航旋转45度(使其向右旋转),然后将俯仰旋转45度(使其向下旋转),则俯仰将从偏航已旋转的位置向下旋转45度。

鉴于相机位于两者内部,它只指向偏航和俯仰指向的任何地方

这是密码

/*
*摄像机设置
*
*根对象是偏航对象(控制水平移动)
*偏航对象包含俯仰对象(控制垂直移动)
*俯仰对象包含摄影机(允许查看场景)
*
*整个装置的工作原理就像一架带有
*嵌入推进器的摄像机。。。
*
*/
//偏航物体
var yawObject=new THREE.Object3D();
//俯仰物体
var pitchObject=new THREE.Object3D();
//摄影机对象
var摄像机=新的三个透视摄像机(视野、方位、近距离、远距离);
//最大摄像机角度(弧度)
var minCameraRotX=0.5;
var maxCameraRotX=0.5;
var minCameraRotY=1;
var maxCameraRotY=1;
//设置
添加(pitchObject);
pitchObject.add(摄影机);
场景。添加(yawObject);
...
var rotateCamera=函数(xRot、yRot、zRot){
y+=yRot;
pitchObject.rotation.x+=xRot;
//强制执行X轴边界(绕y轴旋转)
y=Math.max(minCameraRotY,Math.min(maxCameraRotY,yawObject.rotation.y));
//强制Y轴边界(绕x轴旋转)
pitchObject.rotation.x=Math.max(minCameraRotX,Math.min(maxCameraRotX,pitchObject.rotation.x));

}
您是否尝试过以下方法:(仅在不处于限制角度时旋转凸轮)if(camera.rotation.xmaxCameraRotX){camera.rotation.x=maxCameraRotX;}else如果(xRot!=null&&xRot!=未定义){camera.rotateX(xRot);}请注意,在固定(y)绕x轴旋转90度的相机系统中,通常会出现伪影(即,将组成并向前移动同一轴,需要特殊处理),您可能希望将其限制在89度左右。因此,我在某个时候尝试了这两种变体,但问题是当我沿着两个轴(特别是X轴和Y轴)旋转时发生了什么。我确实找到了一个解决方案,我很快就会发布出来……你只是想模拟一个摄像头吗?你的目标是什么?你的场景里有什么?你能为它编一把小提琴吗?我很感兴趣。你是在旋转一个像那个平面一样的物体,还是在试图创建一个移动的摄像机?幸运的是,我不能为代码本身创建一个小提琴——NDA的,等等;)简而言之,我正在模拟一个实际的相机(包括有限的运动范围),它可以围绕一个固定的模型平移和旋转。因此,相机在场景中移动,就像它在一个可旋转的机器人手臂上一样,但无法旋转超过我设置的限制(垂直135度和水平180度左右),如果是固定模型,可能threejs OrbitControls更适合您。这里有一个例子。下面是我用它做的:不幸的是,我尝试了轨道控制,但它并不能完全满足我的需要。规范要求外部控制方案,无需鼠标输入即可进行视图调整。