회전을위한 Quaternion 수학?
-
11-09-2019 - |
문제
나는 플랫 디스크를 사용하여 그리고있다 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)