2009-04-18 5 views
8

내 장면에 gluDisk()을 사용하여 평면 디스크를 그립니다. gluDisk()은 디스크가 양의 Z 축 방향을 향하게하지만 나는 임의의 정상적인 방향에 직면하고 싶습니다.
분명히 디스크를 올바로 마주 치게하려면 glRotate()을 사용해야하지만 회전해야하는 것은 무엇입니까? Quaternions를 사용하여 계산할 수 있지만 수학을 기억할 수는 없다는 것을 기억합니다.회전에 대한 쿼터니언 수학?

답변

16

솔루션은 상당히 단순해야하며 쿼런 티온이 필요하지 않습니다.

Normal1에서 Normal2로 회전하는 축은 양쪽 모두와 직각이어야하므로 벡터 교차 제품을 사용하십시오.

회전 량은 내적 물에서 쉽게 파생됩니다. 이 값은 | A |. | B | .cos (theta)입니다. 그러나 두 법선 벡터를 정규화해야하므로 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

회전된다 :

q0 = cos(r/2) 
q1 = sin(r/2) a 
q2 = sin(r/2) b 
q3 = sin(r/2) c 

하고 : 라디안 단위 벡터 U 각도 R 주어를 = + BJ + CK 또는 [A, B가 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) 

은 당신이 할 필요가 회전을 찾으려면을, 현재 벡터와 목표 벡터의 외적을 계산할 수 있습니다. 직교 벡터 (쿼터니온을 생성하기위한 회전 벡터)를 얻을 수 있으며이 벡터의 길이는 시작점과 대상 벡터가 겹치도록 보정해야하는 각도의 죄입니다.

관련 문제