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

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 に答える