1

(x1、y1、z1)から(x2、y2、z2)に向かう線(実際には立方体)があります。(x3、y3、z3)から(x4、y4、z4)に向かう別の線に沿って整列するように回転させたいと思います。現在、とMath::Atan2一緒に使用していMatrix::RotateYawPitchRollます。これを行うためのより良い方法はありますか?

編集:私はこの投稿を非常にひどく言いました。私が実際に探しているのは、2つのベクトルからの回転行列です。

4

2 に答える 2

4

はい、角度についてまったく考える必要なく、これを行うことができます。

立方体があるので、1 つのコーナーを選択し、そこから放射状に広がる 3 つのエッジをベクトル f0、f1、f2 として定義するとします (これらは、選択したコーナーに対する方向ベクトルです)。それらを正規化し、行列 F の列として記述します

(f0x f1x f2x)
(f0y f1y f2y)
(f0z f1z f2z)

次に、回転させたい立方体のベクトル t0、t1、t2 に対して同じことを行い、それを行列 T と呼びます。

ここで、行列 R = T * Inverse(F) は、最初の立方体の向きから 2 番目の立方体の向きに回転する行列です (逆 F は、たとえば f0 を (1 0 0)' にマップし、次に T は (1 0 0)' から t0) まで。

これが機能する理由を知りたい場合は、座標系の基底ベクトルの観点から考えてください。XY 軸と Z 軸を新しい座標系に回転させたい場合、回転行列の列は必要なベクトルです (1 0 0)'、(0 1 0)' & (0 0 1)' にマップされます。T*Inverse(F) は、立方体を元の向きから軸を揃えてから目的の向きに効果的に回転させます。

(申し訳ありませんが、上記は左側の OpenGL スタイルの列ベクトルと変換です。Direct3D は行ベクトルと右側の変換であることを覚えているようですが、それを切り替える方法は明らかなはずです)。

また、変換コンポーネントを含む 4x4 マトリックスにも同様に適用されます。

于 2008-10-31T14:19:47.977 に答える
0

行列を実際に補間する方法を追加することをお勧めします。ソースとデスティネーションのマトリックスはあなたの答えでは問題ありませんが、逆行列を計算することは無意味です。クォータニオンは最短の回転パスを提供するため、両方のマトリックスで回転3x3マトリックスを取得し、クォータニオンに変換してそれらをlerpします。翻訳用に別のlerpを実行し、再構成します。Googleforquaternion-行列と逆変換およびクォータニオンlerp。

編集:前方および上方ベクトルからの回転行列は自明です。欠落している列は、他の2つのベクトルの外積です。(列を正規化することを忘れないでください)。

于 2008-11-11T06:45:31.730 に答える