三文动画在OGRE中应用的研究 第6页
我们已经知道,每块骨头都有自己的位置和旋转方向,而这些骨头以树的形式组织起来构成骨骼。例如:腕关节是肘关节的子节点,肘关节又是肩关节的子节点。肩关节旋转会自动带动肘关节运动,腕关节同样也会运动。
那么怎么使一个网格产生动作效果呢?我们可以使网格上的每个顶点都对应于一块或多块骨头,当这些骨头移动时便会影响网格的位置。如果一个点与多块骨关联,则必须通过指定权重来决定每块骨头对此顶点的影响程度(一个顶点对应一块骨头时,该点的权重为1.0 )。
与关键帧动画相比,使用骨骼动画有很多优点。首先,骨骼动画需要保存的动作数据量非常小。其次,通过指定不同的权重,可以很容易的将多个动作绑定在一起形成新的动作。还可以实现动作间的平滑过渡等等。
当然骨骼动画的实现中,骨骼本身的运动还是需要关键帧来完成,但信息量已经很小了。
先看Ogre中骨骼(Skeleton)方面的相关类的UML图:
Node Node* mParent ChildNodeMap mChildren ChildUpdateSet mChildrenToUpd… Quaternion mOrientation Vector3 mPosition Vector3 mScale Vector3 mlnitialPosition Quaternion mlnitialOrientation Vector3 mlnitialScale Bone Matrix4 mBindDerivedInverseTran… TagPoint Entity* mParentEntity MovableObject* mChildObject Skeleton BoneList mBoneList BoneListName mBoneListByName TagPointList mTagPointList Entity* mCurrentEntity AnimationList mAnimationsList AnimationStateSetmLastAnimationStae
图中的Node类其实就是一棵树型结构;现在我们看看Ogre中Bone的定义:
class _OgreExport Bone : public Node
{
/// Pointer back to creator, for child creation
/// (central memory allocation)
Skeleton* mCreator;
/// The inversed derived transform of the bone in the binding pose
Matrix4 mBindDerivedInverseTransform;
这里的skeleton同counter strike中的区别是,counter strike中的skeleton是隐式的(通过bone的相互指针来表现),而Ogre中独立的定义了一个结构;而bone中还是保存了一个矩阵(同cs中是相同的);
现在我们看看Tag Point的定义:
class TagPoint : public Bone
{
private:
Entity *mParentEntity;
MovableObject *mChildObject;
mutable Matrix4 mFullLocalTransform;
};
这个tag point的主要作用可能就是用于Attachment,例如:背包、枪支等。 下面看Skeleton的定义:
class _OgreExport Skeleton : public Resource
{
SkeletonAnimationBlendMode mBlendState;
/// Storage of bones, lookup by bone handle
typedef std::map<unsigned short, Bone*> BoneList;
BoneList mBoneList;
/// Lookup by bone name
typedef std::map<String, Bone*> BoneListByName;
BoneListByName mBoneListByName;
/// Storage of tagPoints, lookup by handle
typedef std::map<unsigned short, TagPoint*> TagPointList;
TagPointList mTagPointList;
/// Entity that is currently updating this skeleton
Entity *mCurrentEntity;
/// Pointer to root bone (all others follow)
mutable Bone *mRootBone;
/// Bone automatic handles
unsigned short mNextAutoHandle;
/// TagPoint automatic handles
unsigned short mNextTagPointAutoHandle;
/// Storage of animations, lookup by name
typedef std::map<String, Animation*> AnimationList;
AnimationList mAnimationsList;
/// Saved version of last animation
AnimationStateSet mLastAnimationState;
上面的代码中有同Skeleton相关类的成员变量,也有同下面要分析的Animation相关的类的成员变量。前面我们分析过Animation,这里将结合源代码分析。
Animation(动画)相关类UML图如下所示,在骨骼动画中,其实可以把骨骼数据单独存放起来,这样就可以减少很多空间,只是外表不同,骨骼动画还是相同的。在图中的三个类Animation、Animation Track、Key Frame相当于MDL文件中的Model、Sequence和Frame。Skeleton的代码前面看过了,现在看Animation的定义:
class _OgreExport Animation
{
protected:
/// Tracks, indexed by handle
TrackList mTrackList;
String mName;
Real mLength;
InterpolationMode mInterpolationMode;
static InterpolationMode msDefaultInterpolationMode;
在Animation中保存了Track List(相当于Sequence动作),以及一些插值器,用当前Track的Key Frame之间进行插值。
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>