最小距離を使用して 2 つのベクトル間の回転を計算する方法を見つけようとして、ここ数時間オンラインで多くの質問をしました。また、Atan2 を使用する場合と内積を使用する場合の違いは何ですか? 私はそれらを最も頻繁に見ます。
目的は、X/Z 位置の違いのみに基づいて y 軸で回転することです (3D ワールドでのトップダウン回転を考えてください)。
オプション 1: Atan2 を使用します。ラジアンを正から負に切り替える場合を除いて、非常にうまく機能しているようです。
float radians = (float)Math.Atan2(source.Position.X - target.Position.X, source.Position.Z - target.Position.Z); npc.ModelPosition.Rotation = new Vector3(0, npc.ModelPosition.Rotation.Y + (radians), 0);
これは問題なく動作しますが、ある時点でジッタリングが始まり、その後反対方向にスイングします。
ドット積を使用します。うまく機能していないようです。常に同じ方向に回転します。最小方向にスイングさせることは可能ですか? 範囲が 0 から pi であることは理解していますが、これを使用できますか?
float dot = Vector3.Dot(Vector3.Normalize(source.Position), Vector3.Normalize(target.Position)); float angle = (float)Math.Acos(dot); npc.ModelPosition.Rotation = new Vector3(0, npc.ModelPosition.Rotation.Y + (angle), 0);
ありがとう、ジェームズ