2009-04-18 12 views
8

私は自分のシーンでgluDisk()を使ってフラットディスクを描いています。 gluDisk()は、ディスクが正のZ軸に向くように描画しますが、それは私が持っている任意の法線に直面してほしいです。
明らかに、ディスクが正しく向き合うようにするには、glRotate()を使用する必要がありますが、回転は何ですか?私はこれがクォータニオンを使用して計算できることを覚えていますが、私は数学を覚えているようには見えません。回転のための四元数演算?

答えて

16

解決策はかなり簡単で、四角形を必要としません。

ノーマル1からノーマル2への回転軸は、両方とも直交している必要がありますので、のベクトル積をとしてください。

回転量は、ドットプロダクトから容易に得られます。この値は| A |。| B | .cos(theta)ですが、2つの法線ベクトルを正規化しなければならないので、cos(theta)を与えますので、逆余弦を取って回転量を取得してください。

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

p.s. glRotate()には角度が必要であることを忘れないでください。しかし、通常のC trig関数はラジアンで機能します。

+0

ありがとうございます。それは完璧に働いた。 – shoosh

3

クォータニオンは、軸を中心とした回転を表します。 <w,x,y,z>は、wの大きさとベクトルの大きさとの間のバランスに応じて、ある程度の量の軸の周りを軸として<x,y,z>を回転します。

<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) 
6

回転なる:ラジアン単位ベクトルに角Rを考えるuが= + 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) 

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

関連する問題