//
voidrotAxis3D_Tech_Matrix(floattheta,floatnx,floatny,floatnz,float(&ptIn)[3],float(&ptOut)[3])
{
floatlen=sqrtf(nx*nx+ny*ny+nz*nz);//normalizevector
nx/=len;ny/=len;nz/=len;
ptOut[0]=ptIn[0]*(cosf(theta)+nx*nx*(1-cosf(theta)))+//transformbymatrix
ptIn[1]*(nx*ny*(1-cosf(theta))-nz*sinf(theta))+
ptIn[2]*(nx*nz*(1-cosf(theta)+ny*sinf(theta)));
ptOut[1]=ptIn[0]*(nx*ny*(1-cosf(theta))+nz*sinf(theta))+
ptIn[1]*(ny*ny*(1-cosf(theta))+cosf(theta))+
ptIn[2]*(ny*nz*(1-cosf(theta))-nx*sinf(theta));
ptOut[2]=ptIn[0]*(nx*nz*(1-cosf(theta)-ny*sinf(theta)))+
ptIn[1]*(ny*nz*(1-cosf(theta))+nx*sinf(theta))+
ptIn[2]*(nz*nz*(1-cosf(theta))+cosf(theta));
}
直接给出个算法吧,这个算法直接用矩阵作的,在一般情况下也就不用四元数了.
晕,哥哥看错了,你是问OpenGL,那把上面公式中的矩阵提取出来,注意到这个矩阵是三阶的,最后一行是给你设置平移参数的.可以简单设置为0001
构造好矩阵之后,调用glLoadMatrixf设置ModelView矩阵就OK了,
上面矩阵如何提取?
(cosf(theta)+nx*nx*(1-cosf(theta)))
(nx*ny*(1-cosf(theta))-nz*sinf(theta))
(nx*nz*(1-cosf(theta)+ny*sinf(theta)))这是第一列,其他两列也这么提取就可以了
当然这是假设没有平移和缩放变换的