/* Note:Your choice is C IDE */ void cGenericObject::ComputeGlobalPosition(cVector3d& a_globalPos, cVector3d& a_glonalRot) { //update global position vector and global rotation matrix m_globalPos = cAdd(a_globalPos,cMul(a_globalRot,m_localPos)); m_globalRot = cMul(a_globalRot,m_localRot); for(int i=0;i<m_children.size()li++) { m_children[i]->computeGlobalPosition(m_globalPos,m_globalRot); } } cVector3d m_localPos //在上一个节点坐标系下的对象坐标系位置 cVector3d m_globalPos //在世界坐标系下的对象坐标系的位置 cMatrix3d m_localRot //将当前对象坐标系下的坐标转换到上一个节点坐标系下的旋转矩阵 cMatrix3d m_globalRot //将当前对象坐标系下的坐标转换到世界坐标系下的旋转矩阵
比如现在有三个坐标系A,B,C。其中A是世界坐标系;B是逆时针旋转45度,然后平移位置(1,1,0)后建立的坐标系;C是在B坐标系下平移(1,0,0)位置后的坐标系。它们的实际位置如图所示,现在求C坐标系在世界坐标系下的位置。
使用上面的函数,先求B坐标系的m_globalPos、m_globalRot,然后求C的m_globalPos、m_globalRot。因为C的m_localPos为(1,0,0),m_localRot为单位矩阵。
m_globalPos = cAdd(a_globalPos,cMul(a_globalRot,m_localPos));上面的代码就是将C的原点坐标转化到世界坐标系下的坐标,就表示为将B坐标系下C坐标转化到世界坐标系下,就是坐标p*坐标系的变换矩阵M(局部坐标系下的坐标转化为世界坐标系下的坐标,先旋转,后平移);