对于OGRE四元数原理的理解,其实我也并非很清楚,但在我的使用过程中,
我逐渐的认知到了其实际是对于一种空间偏移,可以是绕轴旋转theta的偏移,
也可以理解为对w, x, y, z一种相对抽象表示的偏移。
(在OGRE中默认的相对轴好像是OGRE::Vector3::NEGATIVE_UNIT_Z吧...)
如果我的理解有误,也可以请各位大侠斗胆指出,小生不吝求教,
或许我也该找个时间好好看看《计算机图形学》了,毕竟知道原理才是根本呀!!
好了,多余的话也不说了,下面我写出一些在实践过程中使用OGRE四元数的经验,
也好让那些同样使用OGRE图形引擎的童鞋门有个好的参考:
1.OGRE中四元数中轴axis,弧度角rad和四元数quat的基本转换
(这里只是指出基本的转换原理,没有具体的代码实践, 不要骂我变量没有初始化=。=)
( Ogre::Quaternion quat;
Ogre::Vector3 axis;
Ogre::Radian rad; //类型表示 )
quat.w = cos (rad / 2) ;
quat.x = axis.x * sin (rad / 2) ;
quat.y = axis.y * sin (rad / 2) ;
quat.z = axis.z * sin (rad / 2);
2.已知源模型的朝向,要使其向着世界空间特定方向的旋转。
(这里我以一个雷龙AI的对象为例举例说明,
m_DragonNode表示雷龙AI被添加到的场景节点,m_Direction表示域使其面向的方向,
这个向量是通过m_DragonNode与攻击对象的场景节点位置作差计算出来的)
//设置雷龙AI的朝向(其默认局部空间的X轴为其正向朝向)
Ogre::Vector3 src = m_DragonNode->getOrientation()* Ogre::Vector3::UNIT_X;
//雷龙AI的X轴到目标方向的旋转
Ogre::Quaternion quat = src.getRotationTo(m_Direcion);
m_DragonNode->rotate(quat, Ogre::Node::TS_WORLD);