8

gluDisk()シーンで使用してフラットディスクを描画しています。gluDisk()正のZ軸に面するディスクを描画しますが、私が持っている任意の法線に面するようにします。
明らかにglRotate()、ディスクを正しく向き付けるために使用する必要がありますが、回転はどうあるべきですか?これはクォータニオンを使用して計算できることを覚えていますが、数学を思い出せないようです。

4

3 に答える 3

17

解決策は非常に単純で、クォータニオンを必要としないはずです。

Normal1からNormal2に到達するための回転軸は、両方に直交している必要があるため、ベクトルの外積を取ります。

回転量は、それらの内積から簡単に導き出されます。この値は|A|。|B| .cos(theta)ですが、2つの法線ベクトルを正規化する必要があるため、cos(theta)が得られるため、逆コサインを使用して回転量を取得します。

結果のベクトルと角度は、の必須パラメータですglRotate()。実際の回転行列を自分で計算する必要はありません。

glRotate()psは、度単位の角度が必要であることを忘れないでください。ただし、通常のC三角関数はラジアンで機能します。

于 2009-04-18T22:48:55.577 に答える
6

任意の軸を中心とした回転:ラジアン単位の角度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です。

于 2009-04-18T22:39:18.343 に答える
3

クォータニオンは、軸を中心とした回転を表します。ベクトルの大きさと大きさのバランスに応じて<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)
于 2009-04-18T22:21:03.707 に答える