質問

私は自分のシーンでgluDisk()を使用して平らな円盤を描いています。 gluDisk()は正のZ軸が直面しているディスクを描画しますが、私はそれは私が持っているいくつかの任意の正常に直面することにしたい。
明らかに私は適切に面したディスクを取得するためにglRotate()を使用する必要があるが、どのような回転がすべきですか?私は、これは四元数を用いて算出することができるが、私は数学を覚えているように見えることはできません覚えています。

役に立ちましたか?

解決

ソリューションは非常に簡単であるべきであり、quarternionsを必要とすべきではない。

NORMAL1からNORMAL2に到達する回転軸の両方に直交でなければならないので、ちょうど彼らののベクトルクロス乗積するを取る。

回転の量を容易にするそのの内積から誘導されます。 A | |。| B |この値がある。.cos(シータ)が、二つの法線ベクトルが、それはこれだけ回転量を得るために、逆余弦を取り、COS(シータ)を与える正規化されるべきである。

得られたベクターとの角度はglRotate()のために必要なパラメータです - 実際の回転行列を自分で計算する必要はありません。

p.s。そのglRotate()は度の角度が必要ですが、通常のCの三角関数はラジアンで働くことを忘れないでください。

他のヒント

任意の軸周りの回転:ラジアン単位ベクトルuで与えられた角度rは= + BJ + CKまたはaiは[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 )

あなたがする必要があるの回転を見つけるには、あなたは現在のベクトルとターゲットベクトルとの外積を計算することができます。あなたは(四元数を作成するためにあなたの回転ベクトルになります)直交ベクトルを取得し、このベクトルの長さは、あなたがそう開始し、ターゲットベクトルの重なりことを補償しなければならない角度の罪です。

四元は、軸周りの回転を記述する。 <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>されるであろう。

あなたは回転ベクトルと回転の角度を見つける必要があり、ベクトル<x,y,z>に直面し、正の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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top