0

では、three.js マスター向けのベクトル、行列、回転、四元数の質問です。

position(0,0,275)with direction(0,0,-1)、 +y up 、 .に親オブジェクトがありrotation(0,0,0)ます。

親に関連付けられているのは、次の関係を持つ子オブジェクトです。

 rel_position(.5, 0, 0)
 rel_rotation(0, 0, 0)

シーンにはターゲットもあります。

 position(0, 100, 0)

ピッチ、ヨー、ロールを持つ船(親)を考えてみましょう。ピッチとヨーのタレット(子)があります。タレットは、指定された回転速度 (rad/s) でターゲットを追跡する必要があります。

適切な追跡アルゴリズムを取得するために 5 日間を費やしました。私ができる最善のことは、行列を手動で更新する親と子の matrixAutoUpdate 機能を削除することです。次に、child.matrixWorld を使用して、現在の子の回転の回転行列またはクォータニオンを作成します。次に、子の位置からターゲットを見るセカンダリ Object3D を作成できます。子とセカンダリ Object3D の違いを取り、ラジアン/秒ベースでクォータニオンをスラープできます。ただし、親に回転を追加するか、ターゲットが八分円の外側で回転すると(+, +, +)、子の回転 (またはクォータニオン) の計算がクラッシュし、乱暴な回転が発生します。

子 Object3D の追跡アルゴリズムに関する指示は、非常に高く評価されます。あなたの努力は私の次のプロジェクトで引用されます。

お時間をいただきありがとうございます!

4

2 に答える 2

3

だからここに答えがあります!@Stemkoski、方向性をありがとう。昨日明らかになった最終的な解決策についても、同様のアプローチを取りました。行列を反転するため、計算能力が少し高くなりますが、うまく機能します。まず、次のように新しいマトリックスを作成します。

var m = new THREE.Matrix4().getInverse(parent.matrix).multiply(target.matrix);  

これにより、XYZ 軸の参照フレームが、親オブジェクトの回転に基づいて新しい座標 X'Y'Z' に回転します。結果は、X'Y'Z' の参照フレーム内のターゲットの Object3D マトリックスです。ここで、行列「m」から新しい Vector3 を作成することで、以下を使用して相対位置を取得できます。

var rel_pos = new THREE.Vector3().getPositionFromMatrix(m, 'XYZ');

ここで、子 (タレット) の位置からターゲットを直接見る Faux オブジェクトを作成します。

var child_faux = new THREE.Object3D();  //can be created outside the loop
child_faux.position.copy(child.position);   //copy the child local position
child_faux.lookAt(rel_pos);     //look at the target 
child_faux.updateMatrix();     //Update the Matrix4 element for use in a second

最後に、child_fuax を lookAt オブジェクトに設定することで、child_faux.rotation を自動的に設定しました。以下を使用して、現在の child.rotation と child_faux.rotation の間の相対回転を取得できます。

var diff = turret_target.rotation.sub(turret.rotation);

ここから、差分 (x と y) が 0 になるまでタレット (+ または -)(x と y) を回転させる簡単なアルゴリズムを設定できます。

var trackrate = .2 * delta;
var diff = turret_target.rotation.sub(turret.rotation);
turret.rotation.x += diff.x/Math.abs(diff.x) * trackrate;
turret.rotation.y += diff.y / Math.abs(diff.y) * trackrate;
turret.updateMatrix();

これで、親グループ内で回転する子オブジェクトのターゲット トラッキング アルゴリズムが完成しました。読んでくれてありがとう!

于 2013-03-28T14:04:21.283 に答える
1

おそらく、lookAtworldToLocalメソッドのいくつかの組み合わせが機能するでしょうか? ターゲット オブジェクトの位置を砲塔のローカル座標に変換し、それに応じて砲塔の回転を変更する必要があるため、次のようにします。

turret.lookAt(  turret.worldToLocal( target.position.clone() )  )
于 2013-03-28T04:07:22.870 に答える