web-dev-qa-db-ja.com

three.jsは、カメラの外観ベクトルを設定して読み取ります

Camera.rotationまたはlookAt()関数を使用してカメラを回転させる代わりに、ルックベクトルをカメラに直接渡したい...カメラルックベクトルを直接設定することは可能ですか?ルックを読み取ることは可能ですか?カメラからのベクトル?

11
Dev

カメラには「ルックベクトル」がないため、設定できません。

ただし、カメラの位置にルックベクトルを追加してから呼び出すことで、見るためのpointを作成できます。

camera.lookAt( point );

カメラに親がない(シーン以外)と仮定して、カメラが見ている方向を決定する方法は次のとおりです。

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

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

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

vector.applyQuaternion( camera.quaternion );

結果のベクトルは、カメラが見ている方向を指します。

または、次の方法を使用することもできます。これは、カメラが別のオブジェクトの子である場合でも機能します。

camera.getWorldDirection( dirVector );

three.js r.73

30
WestLangley

上記の回答はユーティリティとしてラップされています。これは、3つのユーティリティで行うことです。

_THREE.Utils = {
    cameraLookDir: function(camera) {
        var vector = new THREE.Vector3(0, 0, -1);
        vector.applyEuler(camera.rotation, camera.eulerOrder);
        return vector;
    }
};
_

THREE.Utils.cameraLookDir(camera);で呼び出します

8
mattdlockyer

これらの他の答えは非常に洞察に満ちていますが、完全に正しいわけではありません。このコードは、カメラが指しているのと同じ方向を指すベクトルを返します。それは素晴らしいスタートです!

ただし、カメラが原点(0、0、0)にある(または、原点を超えずに回転したベクトルポイントを接続する線分上にあるため、ポイントがカメラの後ろにある)場合を除き、カメラは動作しません。その点を見ている。明らかに-常識-カメラの位置も、どのポイントを見ているかに影響します。考えてみてください!!

カメラメソッドlookAt()は、カメラの場所に関係なく、3D空間内のポイントを調べます。したがって、カメラが見ているポイントを取得するには、次のように呼び出してカメラの位置を調整する必要があります。

vec.add( camera.position );

また、カメラが1つのポイントではなく、カメラからの距離が異なる無限の数のポイントの線を見下ろしていることにも言及する価値があります。正規化されたz軸ベクトル(0、0、-1)にクォータニオンを適用すると別の正規化されたベクトル(異なる方向)が返されるため、他の回答のコードは正確に1単位の長さのベクトルを返します。カメラから任意の距離xにあるポイントのルックを計算するには、次を使用します。

THREE.Vector3( 0, 0, -x ).applyQuaternion( camera.quaternion ).add( camera.position );

これは、原点から距離xのz軸に沿った点を取り、それをカメラの方向に回転させ、カメラの位置を追加して「ワールドポイント」を作成します。 camera.lookAt()も「ワールドポイント」をパラメータとして受け取るため、「ワールドポイント」(「カメラポイントに対する相対」だけでなく)が必要です。

6
chorpita