2010-03-07 6 views
4

안녕 얘들 아,이 사람이 내 밤새 먹고있어. 그리고 마침내 도움을 청해. 기본적으로, 당신이 카메라 업데이트를 할 직후보기 매트릭스에서 피치 및 요를 계산하기 위해 매우 간단합니다 :Direct3D - 뷰 매트릭스에서 롤을 계산하려면 어떻게합니까?

D3DXMatrixLookAtLH(&m_View, &sCam.pos, &vLookAt, &sCam.up); 
pDev->SetTransform(D3DTS_VIEW, &m_View); 

// Set the camera axes from the view matrix 
sCam.right.x = m_View._11; 
sCam.right.y = m_View._21; 
sCam.right.z = m_View._31; 
sCam.up.x = m_View._12; 
sCam.up.y = m_View._22; 
sCam.up.z = m_View._32; 
sCam.look.x = m_View._13; 
sCam.look.y = m_View._23; 
sCam.look.z = m_View._33; 

// Calculate yaw and pitch and roll 
float lookLengthOnXZ = sqrtf(sCam.look.z^2 + sCam.look.x^2); 
fPitch = atan2f(sCam.look.y, lookLengthOnXZ); 
fYaw = atan2f(sCam.look.x, sCam.look.z); 

그래서 내 문제는 : 어떻게 유사 라디안 롤을 얻을 수있는 방법이 있어야합니다 Pitch와 Yaw는 코드 끝에 있습니다. 나는 나에게 의미가있는 것으로 보이는 수십 개의 알고리즘을 시도했지만 아무도 원하는 결과를 얻지 못했다. 많은 개발자들이이 값을 추적하지 못한다는 사실을 알고 있지만, 값을 기반으로 몇 가지 리 센터링 루틴과 클리핑 설정을 작성하고 있으며, 혼합 행렬을 View Matrix에 적용 할 때 수동 추적이 중단됩니다. 그래서, 누구든지 View Matrix에서 롤을 라디안 (또는도, 나는 상관하지 않음)으로하는 공식을 가지고 있습니까? 감사!

답변

0

Euler angles에 대한 위키 피 디아 기사는 찾고자하는 공식을 포함하고 있습니다.

+0

뒤늦은 지혜에 대한 설명은 전방 벡터에 따라 기본 위쪽 벡터를 아래로 기울일 필요가 있다는 사실을 완전히 잊어 버렸으므로 내 설명이 완전히 엉망이었습니다. – Goz

3

우후, 알 겠어! Wikipedia의 Euler Angles 항목에 대한 스태커에 감사드립니다. 결국 감마 수식이 실제로 올바른 해결책이었습니다! 오일러는 지적

fRoll = atan2f(sCam.up.y, sCam.right.y) - D3DX_PI/2; 

, 당신은 (까지) Y의 아크 탄젠트를 찾고 : 그래서,는 "수직 평면"에서 라디안 롤을 계산하기 위해 나는 C++ 코드의 다음 줄을 사용하고 있습니다 (오른쪽) 행렬의 Z 값에 대한 행렬의 Z 값 -이 경우 Z 값을 시도했지만 원하는 결과를 얻지 못해서 Y 값을 변덕스럽게 시도했지만 + PI에 의해 벗어난 값을 얻었습니다/2 라디안 (원하는 값에 직각)이며, 이는 쉽게 보상됩니다. 마지막으로 필자는 자체 보정 기능이있는 gryscopically 정확하고 안정적인 3D 카메라 플랫폼을 보유하고 있습니다. =)