Javascript 3.js相机旋转顺序

Javascript 3.js相机旋转顺序,javascript,rotation,three.js,euler-angles,gamepad-api,Javascript,Rotation,Three.js,Euler Angles,Gamepad Api,我正在尝试使用gamepad在Three.js中旋转相机,使用第一人称射击风格的控件 浏览器检测到游戏板并识别其输入,但相机的旋转顺序是错误的。当我在摄影机的局部Y轴上旋转时,它也会考虑局部X旋转,这是不需要的 我想要的是: 正在发生的事情: 我似乎遇到了与相同的问题,但他的问题是使用Three.js r54解决的,而我使用的是r60。他设置了camera.eulerOrder=“YXZ”使其工作,但当前等效的camera.rotation.order=“YXZ”似乎对我不起作用 我知道Th

我正在尝试使用gamepad在Three.js中旋转相机,使用第一人称射击风格的控件

浏览器检测到游戏板并识别其输入,但相机的旋转顺序是错误的。当我在摄影机的局部Y轴上旋转时,它也会考虑局部X旋转,这是不需要的

  • 我想要的是:
  • 正在发生的事情:
我似乎遇到了与相同的问题,但他的问题是使用Three.js r54解决的,而我使用的是r60。他设置了camera.eulerOrder=“YXZ”使其工作,但当前等效的
camera.rotation.order=“YXZ”似乎对我不起作用

我知道Three.js的内置“FirstPersonControls”类,但它不适合我,因为它不接受控制器输入,而且以后在其中插入其他非移动控件会很麻烦。我也知道gamepad.js,对使用它没有兴趣

有人能帮忙吗

我的轮换代码:

function pollGamepad()
{
    gamepad = navigator.webkitGetGamepads()[0];

    //Rotation
    if(gamepad.axes[3] > 0.20)
    {
        camera.rotateX(-gamepad.axes[3] * 0.02);
    }
    if(gamepad.axes[3] < -0.20)
    {
        camera.rotateX(-gamepad.axes[3] * 0.02);
    }

    if(gamepad.axes[2] < -0.20)
    {
        camera.rotateY(-gamepad.axes[2] * 0.02);
    }
    if(gamepad.axes[2] > 0.20)
    {
        camera.rotateY(-gamepad.axes[2] * 0.02);
    }
}
函数pollGamepad()
{
gamepad=navigator.webkitGetGamepads()[0];
//轮换
如果(gamepad.axes[3]>0.20)
{
相机旋转(-gamepad.axes[3]*0.02);
}
如果(游戏板轴[3]<-0.20)
{
相机旋转(-gamepad.axes[3]*0.02);
}
如果(游戏板轴[2]<-0.20)
{
相机旋转(-gamepad.axes[2]*0.02);
}
如果(gamepad.axes[2]>0.20)
{
相机旋转(-gamepad.axes[2]*0.02);
}
}
使用的方法是创建对象的层次结构:
yawObject
contains
pitchObject
contains
camera
。然后水平移动鼠标(或操纵杆)将改变偏航对象的Y轴旋转,垂直移动鼠标(或操纵杆)将改变俯仰对象的X轴旋转,相机的旋转将保持固定在默认的
(0,0,-1)
。这只是手动模拟Euler
YXZ
排序,但它可能更适合您。如果需要获得整体旋转,它确实会造成一些尴尬


在我最近编写的一个自定义控制器中,我通过
add()
将摄影机设置为单个父对象,并将父对象的Euler顺序设置为
YXZ
获得了相同的结果。我不记得为什么这比直接在相机上设置效果更好,但它做到了。

我自己也遇到了这个问题,我想出了一个简单的解决方案。在执行y旋转之前,始终将相机的x旋转重置为零。然后,恢复x旋转。因此:

// Rotate camera Fps style
function rotateCamera(dx,dy){
    //store previous x rotation
    var x = camera.rotation.x;

    //reset camera's x rotation.
    camera.rotateX(-x);

    //rotate camera on y axis
    camera.rotateY(dy);

    //check if we are trying to look to high or too low
    if ( Math.abs( dx + x ) > Math.Pi/2 - 0.05) {
        camera.rotateX(x);
    else
        camera.rotateX(x+dx);

    //reset z rotation. Floating point operations might change z rotation during the above operations.
    camera.rotation.z = 0;
}

谢谢Icemonster,这帮了我很大的忙。我只是把我的相机放在一个父对象中,并应用了所有的平移和偏航,然后将任何俯仰应用到相机本身,看起来效果非常好,同时保持一切简单。谢谢!!!我一直在努力旋转我的yawObject(从3天开始)。我使用了PointerLockControls,其中我的相机是“锚定”对象(一个简单的3D对象)的父对象,因此每当我移动鼠标时,对象都会随着相机的旋转而旋转。然后,我为WASD移动添加了按键事件,并在requestAnimationFrame()中更新了角色网格的位置。所以现在当我在按下WASD键的同时尝试沿Y方向旋转角色网格时,我无法旋转超过这个范围(-90到90)。我的角色面对一个万向节锁。因此,我更改了锚点的euler顺序。此外,在三个js的较新版本中,object.eulerOrder设置为object.rotation.order