毕业论文论文范文课程设计实践报告法律论文英语论文教学论文医学论文农学论文艺术论文行政论文管理论文计算机安全
您现在的位置: 毕业论文 >> 论文 >> 正文

三文动画在OGRE中应用的研究 第6页

更新时间:2008-4-19:  来源:毕业论文

三文动画在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类其实就是一棵树型结构;现在我们看看OgreBone的定义:

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;

这里的skeletoncounter 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图如下所示,在骨骼动画中,其实可以把骨骼数据单独存放起来,这样就可以减少很多空间,只是外表不同,骨骼动画还是相同的。在图中的三个类AnimationAnimation TrackKey Frame相当于MDL文件中的ModelSequenceFrameSkeleton的代码前面看过了,现在看Animation的定义:

class _OgreExport Animation

{

protected:

/// Tracks, indexed by handle

TrackList mTrackList;

String mName;

Real mLength;

InterpolationMode mInterpolationMode;

static InterpolationMode msDefaultInterpolationMode;

Animation中保存了Track List(相当于Sequence动作),以及一些插值器,用当前TrackKey Frame之间进行插值。

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ... 下一页  >> 

三文动画在OGRE中应用的研究 第6页下载如图片无法显示或论文不完整,请联系qq752018766
设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©751com.cn 辣文论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。