OGRE骨骼动画与四元数旋转

来源:互联网 发布:dwg view for mac 编辑:程序博客网 时间:2024/04/29 11:11

一、操纵骨骼点的骨骼动画

最近在用OGRE库做三维模型动画,根据OGRE动画类型的具体分类,我做的是骨骼动画,而不是节点动画、定点动画等类型。

此外对于骨骼动画,一般常见的方式是将创作好的动画帮顶到骨骼节点上,再为每个骨骼创建关键帧,然后刷新显示。具体的实现代码,网上有现成的博客里有,我也学习到很多。但是我其实需要的动画,只是人为的在每帧去控制骨骼点进行旋转、平移等操作,以此实现骨骼动画,每一帧的骨骼操作动作是通过一定的算法方式,如将一个骨骼节点每秒绕坐标轴y旋转1度,这样运行起来之后,这个骨骼点就会一直旋转下去。

具体步骤:

1. 加载mesh文件,一般还需要mesh文件对应的skeleton文件,skeleton跟mesh文件放到一个文件夹下。

2. 创建根节点的子节点,创建mesh的场景并绑定到此节点上,并设定节点的位置与姿态(旋转角)。

3.利用模型的场景指针中的getSkeleton()方法并赋给SkeletonInstance,如SkeletonInstance * skel= ent->getSkeleton();

4.此时利用骨骼句柄指针,去获取骨骼中的特点关节点,返回Bone *,代表当前骨骼关节点(此块骨头)的指针。如:Bone *manuallyControlledBone = skel->getBone(0);并将此骨骼节点设为可以手动控制,如:manuallyControlledBone->setManuallyControlled(true);关于获取每个骨头,getBone()传入的为骨骼节点的编号,一般都为整数,从0开始,而不是所谓的骨头的名称。

5.此时就可控制每一帧时对此骨骼点要进行的操作,如在帧开始的时候,在重写的frameStarted()函数里,可以对此骨骼节点进行旋转,平移等操作。此时显示起来就是动画效果。

   如果只是想静态显示所操作的变换,那么在frameStarted()里对此关节点进行reset(),此时的模型只是静态的,反应一帧里所进行的变换操作。

二、关于四元数与旋转

四元数的具体定义和资料网上很多,大多数都是公式推导,这里我就不罗列了。在OGRE中,在旋转一个节点时,除了常见的pitch()、roll()、和yaw()等绕局部坐标轴进行旋转的参数外,还有就是通过四元数的参数。一开始只是知道四元数代表一种旋转规则,也就是一个线段、向量A绕B(nx,ny,nz)这个向量旋转a度(弧度制),一般都是逆时针旋转为正,从而计算出这个四元数q(w,x,y,z),计算公式为;

具体见

http://www.ogre3d.org/tikiwiki/Quaternion+and+Rotation+Primer

因此在对某个节点进行旋转时,可以通过确定旋转前和旋转后的一个向量,然后利用getRotationTo获取这个操作对应的四元数,也可以通过自己要进行旋转的轴与旋转角度,构造出四元数,即可进行这个节点的旋转变换,一般都是局部坐标系的变换。

此外对于一个节点(场景节点、骨骼节点等),getOrientation获取的是四元数,表示此节点对父节点所经过的旋转操作。而_getDerivedOrientation()才能返回此节点对应世界坐标系的旋转变换,这跟getPosition()与_getDerivedPosition()很相似,一个是获取此节点在局部坐标系下的位置,另一个是获取其在世界坐标系下的位置。这种坐标系之间的关系,在未理解之前还是挺复杂的,理解之后就明白多了。




0 0
原创粉丝点击