ベクトルV=(x、y、z)が与えられた場合、Vで軸を構成する2つのベクトルを見つけるにはどうすればよいですか?つまり、一方は垂直で同じ平面にあり、もう一方はこれら2つのベクトルに垂直です。
OpenGLで素晴らしいカメラマネージャーを実装するためにこれが必要です。
与えられたベクトルは1つだけで、それに垂直なベクトルは無限にあります。特に、このベクトルのセットは、与えられたベクトルがに垂直である平面を形成します。
最初のベクトルと同一直線上にないベクトルが与えられた場合、グラムシュミット直交化を適用することで垂直(=直交)ベクトルを見つけることができます。最初のベクトルを↑vとし、↑uは↑u = / = l↑vとなるようなベクトルであり、次に垂直化された↑u_ =↑u-↑v(↑u・↑v)
この質問はStackOverFlowのトピックから外れていますが、少し時間があります。あなたは直交ベクトルのトライアドを形成することを求めています。そのうちの2つはあなたの与えられたベクトルに直交しています。これを行う最も簡単な方法は、QR分解を使用することです。
線形代数をうまく実行するMATLABで実行します。任意の列ベクトルvから始めます。
v = [1 2 3]'
v =
1
2
3
1つの列を持つその配列のQR分解は、行列QとRのみを生成します。必要なのはQだけです。
[Q,R] = qr(v);
Qの列は、必要なものを提供します。
Q =
-0.267261241912424 -0.534522483824849 -0.801783725737273
-0.534522483824849 0.774541920588438 -0.338187119117343
-0.801783725737273 -0.338187119117343 0.492719321323986
最初の列が単純にvであり、「単位」ベクトルになるようにスケーリングされていることを確認してください。生成される方向が気に入らない場合は、任意の軸の一連の軸で任意に-1を掛けることもできます。この行列の2番目と3番目の列は、指定されたベクトルに直交する単位ベクトルです。
もちろん、これはあなたがそれをしたかもしれない唯一の方法ではありません。たとえば、他の2つのランダムなベクトルを選択し、グラムシュミットを使用して3つのベクトルのセットを直交化することができます。開始時に線形従属集合であるいくつかのベクトルがランダムな偶然によって生成されない限り、これは有効なスキームです。したがって、そのアルゴリズムが失敗する可能性はありますが、非常にまれです。
別のスキームは、クロス積のペアをはるかに超えて効果的に使用しません。したがって、いくつかのベクトルv1が与えられます。
v2をランダムに選択します。
外積を使用して、v3 = cross(v1、v2)を設定します。ベクトルv3のノルムがゼロの場合は、ステップ1に戻ります。これは、ベクトルv1とv2が同一線上にあることを意味します。
v2 = cross(v1、v3)に設定します。
このアルゴリズムは単純なものであり、実際にはグラムシュミット直交化といくつかの類似点がありますが、記述はかなり簡単です。数値が正確にゼロであるかどうかをテストすることは良い考えではないため、ステップ2のテストには注意する必要があります。数値の問題を解決するために、ベクトルを計算するときに単位ノルムを持つようにベクトルをスケーリングすることもできます。
結局のところ、QR分解の使用は単純であり、「ゼロ」のテストを必要とせず、したがって明示的な許容誤差は必要ないため、私は依然としてQR分解の使用を好みます。