矩阵中的数学旋转公式 转换到 C++中函数 替换DirectX 9.0中D3DXMatrixRotationAxis函数(一)

2014-11-24 08:28:21 · 作者: · 浏览: 0
首先看下数学公式:
由上面的数学公式,我们转换的C++函数:
[cpp]
//-----------------------------------------------------------------------------
// Name: setupRotate()
// Desc: 绕x,y,z轴旋转,axis:1表示绕x轴,2表示y轴,3表示z轴
//-----------------------------------------------------------------------------
VOID setupRotate(D3DXMATRIXA16 *returnMatrix,int axis, float theta)
{ www.2cto.com
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: 绕自定义轴旋转
//-----------------------------------------------------------------------------
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;
returnMatrix->_22 = ay*axis.y + c;
returnMatrix->_23 = ay*axis.z + axis.x*s;
returnMatrix->_24 = 0.0f;
returnMatrix->_31 = az*axis.x + axis.y*s;
returnMatrix->_32 = az*axis.y - axis.x*s;
returnMatrix->_33 = az*axis.z + c;
returnMatrix->_34 = 0.0f;
returnMatrix->_41 = 0.0f;
returnMatrix->_42 = 0.0f;
returnMatrix->_43 = 0.0f;
returnMatrix->_44 = 1.0f;
}
可能会有人对上面函数中的D3DXMATRIXA16和D3DXVECTOR3不理解,他们其实是Direct3D中表示4维矩阵和3维向量的结构体,可是我们数学公式里涉及到