gluDisk()
シーンで使用してフラットディスクを描画しています。gluDisk()
正のZ軸に面するディスクを描画しますが、私が持っている任意の法線に面するようにします。
明らかにglRotate()
、ディスクを正しく向き付けるために使用する必要がありますが、回転はどうあるべきですか?これはクォータニオンを使用して計算できることを覚えていますが、数学を思い出せないようです。
3 に答える
解決策は非常に単純で、クォータニオンを必要としないはずです。
Normal1からNormal2に到達するための回転軸は、両方に直交している必要があるため、ベクトルの外積を取ります。
回転量は、それらの内積から簡単に導き出されます。この値は|A|。|B| .cos(theta)ですが、2つの法線ベクトルを正規化する必要があるため、cos(theta)が得られるため、逆コサインを使用して回転量を取得します。
結果のベクトルと角度は、の必須パラメータですglRotate()
。実際の回転行列を自分で計算する必要はありません。
glRotate()
psは、度単位の角度が必要であることを忘れないでください。ただし、通常のC三角関数はラジアンで機能します。
任意の軸を中心とした回転:ラジアン単位の角度rと単位ベクトルu = ai + bj + ckまたは[a、b、c]を指定して、次のように定義します。
q0 = cos(r/2)
q1 = sin(r/2) a
q2 = sin(r/2) b
q3 = sin(r/2) c
これらの値から回転行列を作成します。
( q0^2+q1^2 - q2^2 - q3^2 | 2*(q1*q2 - q0*q3) | 2*(q1*q3 + q0*q2) )
Q =( 2*(q2*q1 + q0*q3) | (q0^2 - q1^2 + q2^2 - q3^2) | 2*(q2*q3 - q0*q1) )
( 2*(q3*q1 - q0*q2) | 2*(q3*q2 + q0*q1) | q0^2 - q1^2 - q2^2 + q3^2 )
実行する必要のある回転を見つけるために、現在のベクトルとターゲットベクトルの間の外積を計算できます。直交ベクトル(クォータニオンを作成するための回転ベクトルになります)を取得します。このベクトルの長さは、開始ベクトルとターゲットベクトルが重なるように補正する必要のある角度のsinです。
クォータニオンは、軸を中心とした回転を表します。ベクトルの大きさと大きさのバランスに応じて<w,x,y,z>
、軸を中心に<x,y,z>
ある程度回転します。w
<cos θ/2, x*sin θ/2, y*sin θ/2, z*sin θ/2>, where |<x, y, z>| = 1
たとえば、正のY軸を向くように回転させる場合は、X軸を中心に90°回転させる必要があります。ベクトルは<0, 1, 0>
、であり、クォータニオンは<cos 90°, 0, sin 90°, 0>
=<0, 0, 1, 0>
です。
図形を正のZ軸の向きからベクトルの向きに回転させるには<x,y,z>
、回転ベクトルと回転角を見つける必要があります。回転軸を見つけるために、現在のベクトルの外積と、それをどこに置きたいかを知ることができます。
正のZ軸を向いている場合、現在のベクトルはになります<0, 0, 1>
。向きにしたい場合<x,y,z>
は、回転軸は<0, 0, 1> x <x, y, z> = <-y, x, 0>
、、角度は。になりますarctan(sqrt(x^2+y^2),z)
。クォータニオンは
<cos(θ/2), -y*sin(θ/2), x*sin(θ/2), 0>, where θ = arctan(sqrt(x^2+y^2), z)