7

私が達成しようとしているのは、2つの制御モード、つまりフリーの「フライング」モードとオブジェクト中心のモード(トラックボール)を用意し、ボタンを押すだけでそれらをシームレスに切り替えることです。

私は最初にTrackBallControlsとFlyControlsを試しました。これら2つの問題は、TrackballControlsがオイラー角に基づいているのに対し、FlyControlsはQuartenionsに基づいていることです。次のようにして、camera.rotationベクトルをクォータニオンに変換してみました。

quaternion.setFromEuler( target ); //where target, a Vector3 that contains degrees

そして、手動で位置を設定し(同じ位置オブジェクトを使用しているため)、それが機能しているように見えながら、カメラを少し回転させ、コントロールを切り替えると、ひどく間違った結果が得られ始めました。また、クォータニオン(setEulerFromQuaternion)からオイラー角を取得すると、誤ったデータが生成されました。

そのため、それらを切り替えることはできましたが、回転座標を同期させることができなかったため、カメラの位置が正しいときに「スイッチをオン」にすると、回転が間違っています。

PS。FirstPersonControls(オイラー角も)でいくつかの結果が得られましたが、使用している画面の緯度と経度の方法は非常にエラーが発生しやすく、Z軸の回転があると完全に失敗します。

4

2 に答える 2

14

このようなものはどうですか?

function onClick() {

    var prevCamera = camera;

    camera = new THREE.PerspectiveCamera(...);
    camera.position.copy( prevCamera.position );
    camera.rotation.copy( prevCamera.rotation );

    var MODE = { TRACKBALL: 0, FLY: 1 };

    switch( mode ) {

        case MODE.FLY:

            controls = new THREE.TrackballControls( camera );

            mode = MODE.TRACKBALL;

            break;

        case MODE.TRACKBALL:

            controls = new THREE.FlyControls( camera );

            mode = MODE.FLY;

            break;

    }

}
于 2012-07-03T10:59:58.793 に答える