3Dジオメトリ:1つのペアのポイントを別のペアに平行に整列するように変換する

StackOverflow https://stackoverflow.com/questions/253546

質問

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

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

役に立ちましたか?

解決

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

キューブがあるので、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マトリックスにも同様に適用されます。

他のヒント

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top