2017-03-02 1 views
1

2つの単位ベクトルの間でx、y、zの回転値を取得するにはどうすればよいですか?ドットプロダクトを使うことはできません。なぜならそれは私に1つの価値しか与えないからです。私は回転行列を各軸上で回転させ、それらのためには各軸上に角度差が必要です。 私は2つのコンポーネントのドットプロダクトを試しましたが、ちょっと混乱しました。 これを行うためのすばやく簡単な方法はありますか?たぶん私は2つのコンポーネントのことで間違っていたが、私は知らない。 誰かがこの正確なことをするglslメソッドを知っていればベストだろう!ベクトル間のxyz角度を取得しますか?

答えて

2

2つのベクトルの間にx、y、zの角度を取得する場合は、2つのベクトルの投影の内積を、目的の軸の直交面にとります。

つまり、2つのベクトルの間にz角度が必要な場合は、オリジナルのxy平面ベクトルを作成します。これを行うには、ベクトルのz成分を無視するベクトルを作成します。

vec3 u = vec3(...); // your input vector 
vec3 v = vec3(...); // your other input vector 
float x_angle = acos(dot(u.yz, v.yz)); 
float y_angle = acos(dot(u.xz, v.xz)); 
float z_angle = acos(dot(u.xy, v.xy)); 

あなたは内積を使用することになるので、あなたがu.xzu.zxを使用している場合、それは問題ではないことに注意してください。ドットプロダクト内の両方のベクトルに同じ順序を使用するようにしてください。また、ここでコードの3行目から5行目には、式にベクトル長が記述されていないため、単位ベクトルが仮定されています。

acosを使用すると、引数の値が小さい場合にエラーが発生する可能性があることにも注意してください。これを避けるために、2D投影ベクトルの差をとって、atan2関数で使用することができます。

編集

究極の目標は、同じ形質を有する他のベクターを再配向するように回転行列を構築することであることを提案で、私は(そうでなければ、任意の軸回転としても知られる)軸角アプローチを使用して示唆しています。この方法は、2つのベクトル(ドット積)と、この角度が掛け合わされる適切な回転軸(交差積)との間の角度を求めることを含む。

最初のステップでは、ドットプロダクトを使用して2つのベクトルの間の角度を求めます。

float angle = acos(dot(u, v)); // for unit vectors 

次に、回転軸を見つけるには、クロス積を使用してください。クロス積がuvの両方に垂直なベクトルを生成することがわかっている場合、それらをいずれかの順序で交差させると、適切な軸が得られます。

vec3 axis = cross(u, v); // again, for unit vectors 
// normalize this if need be 

使用したいと思うでしょう行列の形は、このWikipedia articleの軸と角度から回転行列の見出しの下に見つけることができます。計算をより速く実行するために、一時的な値を保存することをお勧めします。

この行列が構築されたら、それを任意のベクトルで乗算して元の変換を再適用するだけです。

+0

これはうまくいきませんでした。私はuとvを同じベクトルにしてベーシックオールアウトしました(out =(0、0、1)、in =(0、0、1)) 。それはまた、他のvectrosとの仕事をしなかった –

+0

新しいベクトルを得るための全体的なプロセスは何ですか?私はあなたの究極の目標が何かを知りたいのです。また、上記のように、あなたがacosを使用している場合は、同じベクトルを持ついくつかの違和感があるかもしれません。たとえば、Luaでは、結果としてNaNを取得しないように入力を固定する必要がありました。 – Nathan

+0

そして、私の目標は、回転軸の回転の違いを取得することです、私は回転行列にこれらの値を挿入し、notherベクトルを回転するためにこれらを使用することができます。回転したベクトルy軸は他のベクトルに揃えられます。 –

関連する問題