1

我正在尝试使用游戏手柄在 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);
    }
}
4

2 回答 2

2

使用的方法PointerLockControls是创建对象的层次结构:yawObjectcontains pitchObjectcontains camera。然后水平鼠标(或操纵杆)移动会改变 yaw 对象的 Y 轴旋转,垂直鼠标(或操纵杆)移动会改变俯仰对象的 X 轴旋转,并且相机的旋转将保持在默认的(0, 0, -1). 这只是手动模拟欧拉YXZ排序,但它可能更适合您。如果您需要获得整体轮换,它确实会产生一些尴尬。

在我最近编写的自定义控制器中,我通过add()将相机设置为单个父对象并将父对象的欧拉顺序设置为YXZ. 我不记得为什么这比直接在相机上设置效果更好,但确实如此。

于 2013-09-07T08:30:12.887 回答
0

我自己也遇到了这个问题,我想出了一个简单的解决方案。在执行 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;
}
于 2013-12-17T18:52:52.457 回答