0

最小距離を使用して 2 つのベクトル間の回転を計算する方法を見つけようとして、ここ数時間オンラインで多くの質問をしました。また、Atan2 を使用する場合と内積を使用する場合の違いは何ですか? 私はそれらを最も頻繁に見ます。

目的は、X/Z 位置の違いのみに基づいて y 軸で回転することです (3D ワールドでのトップダウン回転を考えてください)。

  1. オプション 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);
    

これは問題なく動作しますが、ある時点でジッタリングが始まり、その後反対方向にスイングします。

  1. ドット積を使用します。うまく機能していないようです。常に同じ方向に回転します。最小方向にスイングさせることは可能ですか? 範囲が 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);
    

ありがとう、ジェームズ

4

1 に答える 1

0

2 つの異なる角度を計算します。

視覚化

角度 alpha は atan2 で計算された角度です (これは に等しくなりopposite side / adjacent sideます)。角度ベータは内積で計算されたものです。

次のドット積を使用して、(atan と同様に) 同様の結果を得ることができます。

angle = acos(dot(normalize(target - source), -z))

(-zは負の z 方向の単位ベクトル)

ただし、サインを失います。

于 2013-05-14T19:07:36.527 に答える