24

私はhtml5とTHREE.jsを使用してゲームを作成しており、オイラーの順序が「YXZ」で回転するカメラを持っています。

これは、カメラが頭のように上下左右に回転するようにするためです。一人称視点のように。

このオイラー順序では、camera.rotationのzプロパティは使用されません(常に0)。xはラジアンでピッチまたは緯度を指定するために使用され、yは経度を表すために使用されます。

カメラが常にこの球の中心にある状態で、ユーザーの周りを球形に移動する多数のターゲットがあります。球の半径が1000であるとしましょう。

私の目的は、カメラが見ている場所とターゲットがいる場所の間の角度を計算することです。

2つのベクトル間の角度を計算する次のコードを作成しました。

var A = new THREE.Vector3(1,0,0);
var B = new THREE.Vector3(0,1,0);

var theta = Math.acos( A.dot(B) / A.length() / B.length() );

// theta = PI/2;

ターゲットのベクトル(targets [0] .position)があります。

問題は、カメラが見ている場所のベクトルを取得する方法がわからないことです。

Vector3.applyProjectionメソッドとapplyEulerメソッドを調べてみましたが、それでも良い結果を得ることができません。

予測を行う前に、オイラーの順序を最初に「XYZ」に戻す必要があると思いますか?私は試しましたが、これを行う方法がわかりません。ドキュメントを理解するのはかなり難しいです。

カメラが直接右を向いている場合、現在の回転方向で中心からRADIUS距離のベクトルを取得する必要があるとします。

したがって、計算を実行できる2つのベクトルになります。

4

4 に答える 4

46

カメラは内部の負のz軸を見下ろしています。したがって、負のz軸を指すベクトルを作成します。

var vector = new THREE.Vector3( 0, 0, - 1 );

次に、カメラに適用されるベクトルに同じ回転を適用します。

vector.applyQuaternion( camera.quaternion );

次のように、ターゲットに対するラジアン単位の角度を取得できます。

angle = vector.angleTo( target.position );

編集:これで、カメラが次のように見える方向を取得できます。

var vector = new THREE.Vector3(); // create once and reuse it!
...
camera.getWorldDirection( vector );

注:vector結果を格納する場所を渡すことによりTHREE.Vector3、メソッドが呼び出されるたびにメソッドが新しいインスタンスを作成する必要がなくなります。

three.jsr.107に更新

于 2013-02-11T16:33:01.020 に答える
16

キャプテンの明らかな質問を理解しようと長い時間を費やしました。

これが最終的に私にとってどのように機能したかです:

    vector = camera.getWorldDirection();
    theta = Math.atan2(vector.x,vector.z);

シータはラジアンです。これは、カメラが向いているのと同じ方向を向くようにゲームのキャラクターを向ける方法です。getWorldDirection()は、カメラのかなり新しいオプションです。

于 2015-12-17T08:29:29.913 に答える
0

コメントはできませんが、ふわふわバニーの答えは完璧に機能します。getWorldDirection()次に、そのベクトルをラジアンに変更するのが方法です。

于 2016-08-01T22:16:50.500 に答える
0

ふわふわバニーはそれを釘付けにしました。彼の素晴らしいアイデアに少し変更を加えるだけで、度単位で回転を取得できます。

var vector = camera.getWorldDirection();
angle = THREE.Math.radToDeg( Math.atan2(vector.x,vector.z) );  
于 2018-03-20T21:44:12.193 に答える