[GPG 2 글 4.2] 젬스 2권의 4.2절 소스를 보다가 궁금한것이 있어서 질문드립니

GPG 시리즈 관련 질답, 논의 공간.

Moderator: 류광

비회원

젬스 2권의 4.2절 소스를 보다가 궁금한것이 있어서 질문드립니

Post by 비회원 »

질문내용은 다음과 같습니다.

1. D3DUtil.cpp의 CD3DArcBall::HandleMouseMessages 함수에 보면 다음과 같은 부분이 있습니다.

D3DXQUATERNION qConj;
D3DXQuaternionConjugate( &qConj, &m_qNow );

D3DXMatrixRotationQuaternion( &m_matRotationDelta, &qConj );
D3DXMatrixTranspose( &m_matRotationDelta, &m_matRotationDelta );
D3DXMatrixMultiply( &m_matRotation, &m_matRotation, &m_matRotationDelta );

마우스 왼쪽 버튼을 누른채로 드래그를 하면 세계가 회전하도록하기위한 회전 행렬을 구하는것 같은데,
왜 공액사원수를 구해서 그걸 회전행렬로 바꾸고 다시 역행렬을 구하는건지 이해가 가지를 않습니다. 위의 소스를 그냥
D3DXMatrixRotationQuaternion( &m_matRotationDelta, &m_qNow );
D3DXMatrixMultiply( &m_matRotation, &m_matRotation, &m_matRotationDelta );
이렇게 하면 안되나요?

2. SimpleTerrain.cpp의 FrameMove함수에 보면 다음과 같은 부분이 있습니다.
// Setup world matrix
D3DXMATRIX matWorld;
D3DXMATRIX matRotationInverse;
D3DXMatrixTranslation( &matWorld, -m_vObjectCenter.x,
-m_vObjectCenter.y,
-m_vObjectCenter.z );
D3DXMatrixInverse( &matRotationInverse, NULL, m_ArcBall.GetRotationMatrix() );
D3DXMatrixMultiply( &matWorld, &matWorld, &matRotationInverse );
D3DXMatrixMultiply( &matWorld, &matWorld, m_ArcBall.GetTranslationMatrix() );
m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );

위의 소스에서 D3DXMatrixInverse( &matRotationInverse, NULL, m_ArcBall.GetRotationMatrix() ); 이부분에서 왜 역행렬을 구하는건지 잘 모르겠습니다. 회전행렬은 위의 1번질문에서 나온 소스처럼 구해지는데 마우스왼쪽 버튼을 누른채로 아래로 드래그하면 반시계방향으로 회전하는 회전행렬이 나올텐데 왜 이 행렬의 역행렬을 월드행렬에 곱하는건지;;;
쩝 아직 이런 기조적인 지식들이 부족해서 소스분석시 어려움을 겪네요 ㅜ.ㅜ 부탁드립니다.
류광
Posts: 3805
Joined: 2001-07-25 09:00
Location: GPGstudy
Contact:

Post by 류광 »

소위 트랙볼 구현인가요? 어디선가 이야기된 적이 있는 것 같은데 일단 viewtopic.php?t=234 을 한 번 보시길..
비회원

^^감사합니다 잘봤습니다.. 그런데..

Post by 비회원 »

정확한 이해가 좀 부족해서인지.. 소스코드를 다시 봐도 잘 모르겠네요 ㅜ.ㅜ (나 바보인가봐 ㅜ.ㅜ)

임의의 축에 대한 회전변환 부분은 그냥 아크볼에서 쿼터니온 계산으로 대치되는건가요? 그렇다면.. 나머지 행렬들을 월드행렬에 곱해주는이유가 뭔지..; 그리고 왜 아크볼의 회전행렬의 역행렬을 곱해주는건지 도무지 이해가 잘;;; 그냥 넘어가서는 안되는 부분같아서 죄송하지만 이렇게 다시 질문을 올립니다.

D3DXMATRIX matWorld;
D3DXMATRIX matRotationInverse;
D3DXMatrixTranslation( &matWorld, -m_vObjectCenter.x,
-m_vObjectCenter.y,
-m_vObjectCenter.z );
D3DXMatrixInverse( &matRotationInverse, NULL, m_ArcBall.GetRotationMatrix() );
D3DXMatrixMultiply( &matWorld, &matWorld, &matRotationInverse );
D3DXMatrixMultiply( &matWorld, &matWorld, m_ArcBall.GetTranslationMatrix() );
m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
Post Reply