四元数旋转:OGRE中的4元数和旋转疯狂代码http://CrazyCoder.cn/ĵ:http:/CrazyCoder.cn/GameDevelopment/Article36062.html想象个物体在3D空间中移动过程该物体必然会涉及到旋转例如个怪物他运动方向会改变要改变其方向只需要对其进行旋转即可旋转方式大致分为3种:Euler旋转矩阵旋转以及4元数旋转这里稍微记录下我目前对于4元数旋转理解对于4元数方面数学以及其原理这里不关心只需要学会如何使用即可无论是哪种旋转物体和该物体局部坐标系的间相对位置相对方位都是不会改变因此在进行两个局部旋转(即相对于局部坐标系)时要注意结果可能不是你预期对于Euler旋转OGRE中为SceneNode提供了yaw,pitch,roll的类接口这些接口默认都是参照局部坐标系旋转可以通过第2个参数来指定例如yaw(Degree(90),SceneNode::TS_WORLD);OGRE中Quaternion类用于4元数处理该类(也可以说是4元数本身)有4个成员:x,y,z,w这4个数分别代表什么?在OGRE论坛上我找到了些可以让人很容易理解信息:Quaternionscanseemprettydauntingbecauseoftheuseof\'imaginary\'numbers.It\'smucheasiertounderstandyoujustignorethisconceptcompletely.Thebasicformulaforcreatingaquaternionfromangle/axisis:Q=cos(angle/2)+i(x*sin(a/2))+j(y*sin(a/2))+k(z*sin(a/2))orCode:Q.w=cos(angle/2)Q.x=axis.x*sin(angle/2)Q.y=axis.y*sin(angle/2)Q.z=axis.z*sin(angle/2)稍微忽略下那些复数的类概念使用角度/轴方式创建4元数公式为:Q=cos(angle/2)+i(x*sin(a/2))+j(y*sin(a/2))+k(z*sin(a/2))对应代码为:Q.w=cos(angle/2)Q.x=axis.x*sin(angle/2)Q.y=axis.y*sin(angle/2)Q.z=axis.z*sin(angle/2)再看下OGRE中有关Quaternion个构造4元数源代码:voidQuaternion::FromAngleAxis(constRadian&rfAngle,constVector3&rkAxis){//assert:axisisunitlength////Thequaternionrepresentingtherotationis//q=cos(A/2)+sin(A/2)*(x*i+y*j+z*k)RadianfHalfAngle(0.5*rfAngle);RealfSin=Math::Sin(fHalfAngle);w=Math::Cos(fHalfAngle);x=fSin*rkAxis.x;y=fSin*rkAxis.y;z=fSin*rkAxis.z;[Page]}虽然可以说4元数中w代表旋转量x,y,z代表对应轴但是这也不全正确我们看到对于真正旋转量啊的类数据是需要进行有些公式变换后才得到w,x,y,z但是即使如此我们还是可以这样简单地构造个4元数用于旋转:Quaternionq(Degree(-90),Vector3::UNIT_X);该构造第个参数指定旋转角度第2个参数指定旋转轴(可能不是)上面代码就表示饶着X轴(正X方向)旋转-90度将该4元数用于个SceneNode旋转:sceneNode->rotate(q);即可实现该node饶X轴旋转-90度效果再看下OGREtutorial中段代码:Vector3src=mNode->getOrientation*Vector3::UNIT_X;Ogre::Quaternionquat=src.getRotationTo(mDirection);mNode->rotate(quat);SceneNodegetOrientation获得该node方位用个4元数来表示什么是方位?这里我也不清楚但是对于个4元数它这里表示是种旋转偏移偏移于朝向OGRE论坛上有这么段话:Thereasonthere\'snootherwaytoconvertaquaterniontoavectorisbecauseaquaternionisrelative.Ithasnodirection.Withadirection(likeavector)youcouldsay\"facenortheast\".Butwithaquaternion,yousay\"face45degreesclockwisefromwhateverdirectionyouarealreadyfacing\"(verysimpliedexample).Withoutknowingwhichwaytheobjectisalreadyfacing,aquaternionisvirtuallymeaninglesswithrespecttoorientation.Sowejustdefaultittosomeinitialdirection,likeUnitZ,andmakeallorientationsrelativetothat.然后getOrientation*Vector3::UINT_X又会得到什么?我可以告诉你第句代码整体作用就是获取该物体当前面向方向有关4元数和向量相乘如图所示:可以进步看出4元数表示了个旋转偏移它和个向量相乘后就获得了另个向量该结果向量代表了这个旋转偏移所确定方向那么第句代码中为什么要乘上UNIT_X呢?这里所代表物体朝向就是正X方向第2句话由向量构造个4元数它表示从当前朝向旋转到目朝向所需要个4元数第3句话就直接使用该4元数来旋转该node但是有时候似乎旋转不正确(在我实验中我使用模型其朝向是负Y方向在化时我又将...