矩阵中的数学旋转公式 转换到 C++中函数 替换DirectX 9.0中D3DXMatrixRotationAxis函数(三)
//-----------------------------------------------------------------------------
// Name: Cleanup()
// Desc: Releases all previously initialized objects
//-----------------------------------------------------------------------------
VOID Cleanup()
{
if( g_pVB != NULL )
g_pVB->Release();
if( g_pd3dDevice != NULL )
g_pd3dDevice->Release();
if( g_pD3D != NULL )
g_pD3D->Release();
if(Objects != NULL)
Objects->Release();
}
//-----------------------------------------------------------------------------
// Name: setupRotate()
// Desc: 绕x,y,z轴旋转,axis:1表示绕x轴,2表示y轴,3表示z轴
//-----------------------------------------------------------------------------
VOID setupRotate(D3DXMATRIXA16 *returnMatrix,int axis, float theta)
{
float s, c;
s = sin(theta),c=cos(theta);
switch (axis) {
case 1: // Rotate about the x-axis
returnMatrix->_11 = 1.0f; returnMatrix->_12 = 0.0f; returnMatrix->_13 = 0.0f; returnMatrix->_14 = 0.0f;
returnMatrix->_21 = 0.0f; returnMatrix->_22 = c; returnMatrix->_23 = s; returnMatrix->_24 = 0.0f;
returnMatrix->_31 = 0.0f; returnMatrix->_32 = -s; returnMatrix->_33 = c; returnMatrix->_34 = 0.0f;
returnMatrix->_41 = 0.0f; returnMatrix->_42 = 0.0f; returnMatrix->_43 = 0.0f; returnMatrix->_44 = 1.0f;
break;
case 2: // Rotate about the y-axis
returnMatrix->_11 = c; returnMatrix->_12 = 0.0f; returnMatrix->_13 = -s; returnMatrix->_14 = 0.0f;
returnMatrix->_21 = 0.0f; returnMatrix->_22 = 1.0f; returnMatrix->_23 = 0.0f; returnMatrix->
_24 = 0.0f;
returnMatrix->_31 = s; returnMatrix->_32 = 0.0f; returnMatrix->_33 = c; returnMatrix->_34 = 0.0f;
returnMatrix->_41 = 0.0f; returnMatrix->_42 = 0.0f; returnMatrix->_43 = 0.0f; returnMatrix->_44 = 1.0f;
break;
case 3: // Rotate about the z-axis
returnMatrix->_11 = c; returnMatrix->_12 = s; returnMatrix->_13 = 0.0f; returnMatrix->_14 = 0.0f;
returnMatrix->_21 = -s; returnMatrix->_22 = c; returnMatrix->_23 = 0.0f; returnMatrix->_24 = 0.0f;
returnMatrix->_31 = 0.0f; returnMatrix->_32 = 0.0f; returnMatrix->_33 = 1.0f; returnMatrix->_34 = 0.0f;
returnMatrix->_41 = 0.0f; returnMatrix->_42 = 0.0f; returnMatrix->_43 = 0.0f; returnMatrix->_44 = 1.0f;
break;
default:
// bogus axis index
assert(false);
}
}
//-----------------------------------------------------------------------------
// Name: setupRotate()
// Desc: 绕自定义轴旋转,类似DirectX中的函数D3DXMatrixRotationAxis
//-----------------------------------------------------------------------------
VOID setupRotate(const D3DXVECTOR3 &axis, D3DXMATRIXA16 *returnMatrix, float theta)
{
//要旋转的向量轴必须是单位向量,不然物体会变形
//assert(fabs(axis*axis - 1.0f) < .01f);
float s, c;
s = sin(theta),c=cos(theta);
// 计算出一些重复利用的子表达式。
float a = 1.0f - c;
float ax = a * axis.x;
float ay = a * axis.y;
float az = a * axis.z;
returnMatrix->_11 = ax*axis.x + c;
returnMatrix->_12 = ax*axis.y + axis.z*s;
returnMatrix->_13 = ax*axis.z - axis.y*s;
returnMatrix->_14 = 0.0f;
returnMatrix->_21 = ay*axis.x - axis.z*s;