问一下这个函数到底是如何旋转矩阵的??
是在三个轴上分别旋转,那先后顺序呢??谢谢
inline D3DXMATRIX* SetRotation(D3DXMATRIX* pOut,float fX, float fY, float fZ)
{
#ifdef DEBUG
if(!pOut)
{
assert(0);
return NULL;
}
#endif
D3DXMatrixIdentity(pOut);
double cx = cos(fX);
double sx = sin(fX);
double cy = cos(fY);
double sy = sin(fY);
double cz = cos(fZ);
double sz = sin(fZ);
pOut->_11 = (float)(cy * cz);
pOut->_12 = (float)(cy * sz);
pOut->_13 = (float)(-sy);
pOut->_21 = (float)(sx * sy * cz - cx * sz);
pOut->_22 = (float)(sx * sy * sz + cx * cz);
pOut->_23 = (float)(sx * cy);
pOut->_31 = (float)(cx * sy * cz + sx * sz);
pOut->_32 = (float)(cx * sy * sz - sx * cz);
pOut->_33 = (float)(cx * cy);
}
[解决办法]
这是制作旋转矩阵的公式啊
[解决办法]
默认的顺序无关紧要,因为每个轴的旋转量可以按任何次序合并,唯一的例外是gimbal lock,所以才又去用四元数做旋转。
[解决办法]
就是这个公式:
cos(a)cos(c) - cos(b)sin(a)sin(c) -cos(b)cos(c)sin(a) - cos(a)sin(c) sin(a)sin(b) 0
cos(c)sin(a) + cos(a)cos(b)sin(c) cos(a)cos(b)cos(c) - sin(a)sin(c) -cos(a)sin(b) 0
sin(b)sin(c) cos(c)sin(b) cos(b) 0
0 0 0 1
大概就是这样的格式。
[解决办法]
cos(a)cos(c) - cos(b)sin(a)sin(c) -cos(b)cos(c)sin(a) - cos(a)sin(c) sin(a)sin(b) 0
cos(c)sin(a) + cos(a)cos(b)sin(c) cos(a)cos(b)cos(c) - sin(a)sin(c) -cos(a)sin(b) 0
sin(b)sin(c) cos(c)sin(b) cos(b) 0
0 0 0 1
[解决办法]
D3DXQUATERNION q4Rotation;
D3DXQuaternionRotationAxis(&q4Rotation,&v3Axle,fRadian);//取得按轴旋转得到的四元数
//取出平移量
D3DXVECTOR3 v3Pos =D3DXVECTOR3(_mxWorld._41,_mxWorld._42,_mxWorld._43);
D3DXMatrixTransformation(&_mxWorld,NULL,NULL,NULL,&v3Org,&q4Rotation,&v3Pos);
喵,四元组原理很让人头痛,但有函数可以从转角取四元组。
dana9919@163.com