请教下如何实现3D的任意方向旋转问题,我的实现问题出在那
这个是有问题的部分
static Vertex_pt ptVertext[4] = { {{ -1.0f, 1.0f, 0.0f}, {0.0f, 1.0f}},
{{ 1.0f, 1.0f, 0.0f},{ 1.0f, 1.0f}},
{{-1.0f, -1.0f, 0.0f}, {0.0f ,0.0f}},
{{1.0f, -1.0f, 0.0f}, {1.0f, 0.0f}}};
for(int i=0;i<4;i++)
{
CGFX_PACK16 CMatrix4X4 mx;
CGFX_PACK16 CVector4 vt(ptVertext[i].m_Position[0],ptVertext[i].m_Position[1],ptVertext[i].m_Position[2],0.0f);
CGFX_PACK16 CVector4 vtRotate(1.0f,1.0f,0.0f,0.0f);
mx.Rotate(vtRotate,0.1f);
vt = vt * mx;
ptVertext[i].m_Position[0] = vt.m_fi[0];
ptVertext[i].m_Position[1] = vt.m_fi[1];
ptVertext[i].m_Position[2] = vt.m_fi[2];
}
现象是模型已经按(1.0f,1.0f,0.0f,0.0f)旋转了,但不断在变大
相关的定义以及旋转的实现代码如下
#define CGFX_PACK16 __declspec(align(16))
typedef struct _Vertex_pt
{
float m_Position[3]; // 顶点位置
float m_Texcoord[2]; // 贴图坐标
}Vertex_pt;
// 饶任意轴线旋转
// vt为旋转轴向量
// fRadian为旋转角度
inline void Rotate(const CVector4& vt,Float fRadian)
{
// 任意轴线q(q1,q2,q3),求向量p(x,y,z)饶q旋转变换后新向量p'
// p' = p * T
// p'(x',y'z',1),p(x,y,z,1)为向量p',p的4D齐次坐标表示
// T为旋转矩阵,c为旋转角度的余弦,s为旋转角度的正弦值,t = 1 - c,
//
// t*q1*q1 + c, t*q1*q2 + s*q3, t*q1*q3 - s*q2 , 0
// t*q1*q2 - s*q3, t*q2*q2 + c, t*q2*q3 + s*q1, 0
// T = [ t*q1*q3 + s*q2, t*q2*q3 - s*q1, t*q3*q3 + c, 0 ]
// 0, 0, 0, 1
float fSin, fCos;
SinCos(fRadian,fSin, fCos);
float fOneMinusCos = 1.0f - fCos;
CVector4 xxxx(vt.m_fx);
CVector4 yyyy(vt.m_fy);
CVector4 zzzz(vt.m_fz);
CVector4 SinVector(fSin);
CVector4 v_Mul_Sin = vt * SinVector;
CVector4 multipler = fOneMinusCos * vt;
multipler.m_fw = 0.0f;
CVector4 add;
CMatrix4X4 mx;
add.Set(fCos, v_Mul_Sin.m_fz, -v_Mul_Sin.m_fy, 0.0f);
mx.m_vt0 = xxxx * multipler + add;
add.Set(-v_Mul_Sin.m_fz, fCos, v_Mul_Sin.m_fx, 0.0f);
mx.m_vt1 = yyyy * multipler + add;
add.Set(v_Mul_Sin.m_fy, -v_Mul_Sin.m_fx, fCos, 0.0f);
mx.m_vt2 = zzzz * multipler + add;
*this = mx * (*this);
}