2013-01-21 2 views
2

3x3 회전 행렬에 문제가 있습니다. 임의의 기존 회전 행렬을 조정할 수 있습니까? 회전이 수평선에 고정되도록 (롤 없음, 피치 및 턱)? 수평선을 항상 "수평"으로 만들 필요가 있습니다 (예 : 일부 FPS의 카메라 사용).회전 매트릭스를 수평선에 고정하려면 어떻게해야합니까?

+0

'업'축에 대해서만 회전 할 수 있습니까? 질문을 시각화하는 데 문제가 있습니다. 여러분은 현재의 변화에 ​​대한 예제 매트릭스와 다음에하고자하는 것을 제공 할 수 있습니까? – beaker

+0

문제는 "위로"축 주위로 회전 할 필요는 없으며 "우측에서 오른쪽으로"축 주위로도 회전 할 필요가 있다는 것입니다. 행렬은 임의의 직교 회전 행렬입니다. "앞으로/뒤로"축을 중심으로 회전을 "제거"해야합니다. – user1997471

+0

아, 나는 당신이 단지 yaw를 유지하기를 원한다고 생각하는 당신의 질문을 잘못 읽었습니다. 상징적 인 행렬조차도 도움이 될 것입니다. – beaker

답변

1

기존의 회전 행렬을 원하는대로 구속 된 회전 행렬로 변환 할 수 없습니다 (즉, 회전 행렬의 오른쪽 벡터는 항상 월드 좌표계의 위쪽 축에 수직 인 평면에 있음). 명확하게 말하면, 변환이 어떻게 이루어져야 하는지를 지정하시오. 기존의 회전 행렬은 원하는 제약 조건을 얻기 위해 전체 벡터 집합으로 회전 할 수 있지만 모두 다른 결과를 줄 수 있습니다.

아마 가장 자연스럽게 돌아가는 벡터는 기존 회전 행렬의 앞쪽 벡터이지만 세계 좌표계의 앞으로 또는 오른쪽 벡터 일 수도 있습니다.

기존 회전 행렬의 정방향 벡터를 중심으로 회전하는 예를 들어 보겠습니다. 저는 기본 OpenGL 좌표계와 같은 좌표계를 사용하고 있다고 가정 할 것입니다. 여기서 X는 오른쪽, Y는 위로, Z는 뒤에 있습니다. 좌표계가 다르면 조정해야합니다.

당신은 회전 행렬 객체는 다음 세상을 것이다 : 당신의 세계로 표현 각각 당신의 회전 물체의 존재

[r1 u1 b1] 
[r2 u2 b2] 
[r3 u3 b3] 

r*, u*b* 최대 직교 오른쪽, 다시 벡터를 좌표계 좌표 체계.

오른쪽 벡터를 월드 좌표계의 상향 축에 수직 인 평면으로 제한하려는 경우 r2은 항상 0이어야합니다. 이제 r20으로 설정하면 깨끗한 회전 대신 매우 이상한 변형이 생길 수 있습니다. 우리는 회전 할 각도를 찾아야 만 오른쪽 평면에 올바른 벡터를 얻을 수 있습니다. a* 당신의 조정 및 n*입니다

[nr1 nu1 nb1]  [r1 u1 b1]  [ar1 au1 ab1] 
[nr2 nu2 nb2] = [r2 u2 b2] * [ar2 au2 ab2] 
[nr3 nu3 nb3]  [r3 u3 b3]  [ar3 au3 ab3] 

새 회전 행렬이다 : 같은

귀하의 조정이 보일 것이다.

이제 회전 행렬은 기본적으로 r* 벡터를 월드 좌표계의 위쪽 벡터와 직각 인 평면으로 다시 가져 오는 각도 theta의 정방향 벡터 (Z 축) 주위로 회전합니다. 그 시타는 내적 (<r1, r2, r3><r1, 0, r3> 사이)으로 계산할 수 있습니다. 지금 생각해 너무 피곤, 마지막 인수 어쩌면 -1glRotate3f(theta, 0, 0, 1) 적용 또는

dotproduct(<r1, r2, r3>, <r1, 0, r3>) == length(<r1, r2, r3>) * length(<r1, 0, r3>) * cos(theta) 

theta = acos(dotproduct(<r1, r2, r3>, <r1, 0, r3>)/(length(<r1, r2, r3>) * length(<r1, 0, r3>))) 

그런 다음 회전 행렬 a*는 회전 행렬이다.

사용자 입력에서 자신 만의 피치 및 요 애플리케이션을 수행하는 경우 점진적 변환 행렬을 유지하는 대신 객체를 렌더링하는 모든 프레임을 회전 행렬로 계산하는 것이 더 쉽습니다.) 그 경우에는 입력을 사용할 때 피치와 요 수를 조정 한 다음 올바른 순서로 피치와 요를 적용하고 요법을 먼저하고 피치를 적용한 다음 주위를 돌리면 롤을 얻을 수 있습니다 부작용.

+0

답장을 보내 주셔서 감사합니다. 매우 유용했습니다! 그러나 초기 버전에서는 저에게 효과가 없었습니다. 또한, 나에게 가장 가치있는 점은 부정확 한 요요와 피치 순서로 인해 롤 사이드 효과가 나타나는 이유에 대한 참고였다. – user1997471

+0

예, 언급 한 바와 같이 변환 행렬 표현과 선택한 세계 축에 따라 다릅니다. 때로는 오른쪽, 위쪽 및 앞으로/뒤로 벡터가 OpenGL과 같은 열 대신에 행에있는 경우가 있습니다. 때로는 사람들이 반대 축을 사용하기도합니다. 때때로 사람들은 OpenGL에서와 같이 Y 대신 Y를 사용하여 세계 최대 축이됩니다. 당신은 조정할 필요가 있습니다. – wich

+0

그리고 네가 다른 회전 순서를 사용하면 다른 효과를 얻습니다. 실행하는 회전은 그 점까지의 변환과 관련이 있습니다. 따라서 이미 앞쪽으로 투구하면 요는 위쪽 벡터에 해당합니다. 앞으로 기울어 져 있습니다. 세계 좌표계의 상향 벡터가 아니라 암시 적 굴림으로 이어집니다. 당신 주위의 다른 방법은 먼저 원하는 방향을 향하도록 수평으로 회전 한 다음 그 방향으로 앞으로 피치를 올립니다. – wich

관련 문제