|
|

楼主 |
发表于 2006-9-25 16:39:00
|
显示全部楼层
Re:怎样用四元素实现模型旋转?
一起读一读Samples的例子好吗?
EffectParam.cpp:
class CMeshArcBall : public CD3DArcBall
{
public:
void OnBegin( int nX, int nY, D3DXMATRIXA16 *pmInvViewRotate )//(主要功能是取得与鼠标对应的三维向量)
{
m_bDrag = true;//(bool m_bDrag; // Whether user is dragging arc ball)
m_qDown = m_qNow;//(D3DXQUATERNION m_qDown; // Quaternion before button down,m_qNow;// Composite quaternion for current drag;单位四元素(0, 0, 0, 1))
m_vDownPt = ScreenToVector( (float)nX, (float)nY );//( D3DXVECTOR3 m_vDownPt;// starting point of rotation arc,return D3DXVECTOR3( x, y, z );)
D3DXVECTOR4 v;
D3DXVec3Transform( &v, &m_vDownPt, pmInvViewRotate );//(用矩阵把向量(x, y, z, 1)进行变换)
m_vDownPt = (D3DXVECTOR3)v;//(真是奇怪,好不容易变为四维的,又要变回,甚至物归原主)
}
void OnMove( int nX, int nY, D3DXMATRIXA16 *pmInvViewRotate )//(四元素相乘结果如何)
{
if (m_bDrag)
{
m_vCurrentPt = ScreenToVector( (float)nX, (float)nY );//(取向量)
D3DXVECTOR4 v;
D3DXVec3Transform( &v, &m_vCurrentPt, pmInvViewRotate );
m_vCurrentPt = (D3DXVECTOR3)v;//(转换向量)
m_qNow = m_qDown * QuatFromBallPoints( m_vDownPt, m_vCurrentPt );//(向量经过点乘、叉乘获得四元素,四元素相乘得四元素)
}
}
LRESULT HandleMessages( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, D3DXMATRIXA16 *pmInvViewRotate )
{
// Current mouse position
int iMouseX = (short)LOWORD(lParam);
int iMouseY = (short)HIWORD(lParam);
switch( uMsg )
{
case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK:
SetCapture( hWnd );
OnBegin( iMouseX, iMouseY, pmInvViewRotate );
return TRUE;
case WM_LBUTTONUP:
ReleaseCapture();
OnEnd();
return TRUE;
case WM_CAPTURECHANGED:
if( (HWND)lParam != hWnd )
{
ReleaseCapture();
OnEnd();
}
return TRUE;
case WM_MOUSEMOVE:
if( MK_LBUTTON&wParam )
{
OnMove( iMouseX, iMouseY, pmInvViewRotate );
}
return TRUE;
}
return FALSE;
}
};
很难明白其中的奥妙. |
|