문제

나는 플랫 디스크를 사용하여 그리고있다 gluDisk() 내 장면에서. gluDisk() 양의 z 축을 향한 디스크를 그립니다.
분명히 사용해야합니다 glRotate() 디스크를 제대로 향하게하려면 회전은 무엇입니까? 나는 이것이 Quaternions를 사용하여 계산 될 수 있지만 수학을 기억할 수는 없습니다.

도움이 되었습니까?

해결책

솔루션은 매우 간단해야하며 쿼터온이 필요하지 않아야합니다.

정상 1에서 Normal2로 얻을 수있는 회전 축은 둘 다에 직교해야하므로 벡터 교차 제품.

회전의 양은 그것들에서 쉽게 파생됩니다 도트 제품. 이 값은 | a |.

결과 벡터와 각도는 필요한 매개 변수입니다. glRotate() - 실제 회전 매트릭스를 직접 계산할 필요가 없습니다.

추신 : 그것을 잊지 마십시오 glRotate() 각도는 각도가 필요하지만 일반 C 트리그 함수는 라디안에서 작동합니다.

다른 팁

임의 축 주위의 회전 : 라디안 및 단위 벡터 u = ai + bj + ck 또는 [a, b, c]의 각도 R이 주어진 다음 : 정의합니다.

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 )

필요한 회전을 찾으려면 현재 벡터와 대상 벡터 사이의 교차 제품을 계산할 수 있습니다. 직교 벡터 (쿼터니언을 만들기 위해 회전 벡터가 될 것임)를 얻게 되며이 벡터의 길이는 시작 및 대상 벡터가 겹치도록 보상 해야하는 각도의 죄입니다.

Quaternions는 축에 대한 회전을 설명합니다. <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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top