Ogre 1.8 Entity

Ogre中很多重要的元素,涉及到一个人(或者是一个动物啥的,反正能动的),在SceneManager里面都表现为一个节点(SceneNode),而绑定到这个Node上的必须是Entity,那么也就是说人物的骨骼、动画、材质这种信息就必须要由Entity维护(其实底层还有个Mesh,不过也由Entity封装了)了。做一个人物相关游戏人物驱动起来是头等大事。这时,是自己实现一个人物,还是继承一个Entity?

得先明白Entity有什么,能干什么。下文就是干这个活的。

OgreEntity.h

首先要明白Ogre的可以渲染的物体有两种,一种大的不可以动的(Terrain),一种相对小的可以动的(Entity)

这个文件就定义了Entity。

很大程度上,Entity是对Mesh类的封装。所以有必要先介绍一下Mesh

OgreMesh.h

定义了Mesh类。一个Mesh由很多SubMesh组成,这就决定了Mesh的细节部分应该交给SubMesh管理(比如某个部分的材质)。在Mesh层面上管理属于整体的接口和属性。

想啊:

首先是通用属性:

一个Mesh肯定要从某个Mesh文件读来吧?文件是抽象成文件流的,所以有mFreshFromDisk:DataStreamPtr

既然由很多SubMesh组成,那得有这些SubMesh的列表啊:mSubMeshNameMap:SubMeshNameMap,mSubMeshList:SubMeshList

既然是实体,得有碰撞检测用的形状(把Mesh套起来,用来检测碰撞):mAABB:AxisAlignedBox(正方体,传说中的AABB),Real mBoundRadius(球半径)

然后是特殊属性(根据不同种类的Mesh而不同的)

如果是骨骼Mesh的话,得有骨骼吧。mSkeleton:SkeletonPtr,mSkeletonName:String

是骨骼Mesh的话,Mesh的顶点们要以不同的权重绑定到不同的Bone上吧?mBoneAssignments: VertexBoneAssignmentList 

如果是顶点动画的话,就得直接存储Animation了。包括morph和pose两种。(相关属性略)

所以注意了,Mesh里对Animation的直接调用,例如getNumberAnimation()函数,都是针对顶点动画的。骨骼动画由Skeleton类维护,也由skeleton提供调用接口。

如果要用到LOD的话,得存储相关信息。(相关属性略)

要知道计算机是有CPU和GPU的,两个可以独立处理。Mesh的顶点信息可以加载到GPU里直接做渲染,也可以到CPU做处理。GPU和CPU的均衡是一门大学问,这里不多加讨论。知道Mesh提供了相关接口就行。

如果用到影子,Mesh也有相关属性和操作支持。不过这里暂时不讨论。


那好,现在Mesh差不多了,得回到Entity了。

不用问了,肯定得内含个Mesh对象和SubEntity列表。(一个SubEntity对应一个SubMesh,SubMesh由Mesh管理,SubEntity就要由Entity管理了)mMesh:MeshPtr,mSubEntityList:SubEntityList

甭管是骨骼动画还是顶点动画,控制它们的都是AnimationState。所以对应于Mesh的所有动画,有一个mAnimationState:AnimationStateSet。这里得想一下,Mesh里面只有动画的管理,是一种的静态的资源管理,而Entity里面存的却是对这种资源的操作。从这个意义上讲Entity更多的是Mesh的控制器。


如果是骨骼动画的话,你看,Entity作为在场景中会实际存在的实体,对于一个Skeleton可能会有多个Entity使用,所以这方面的属性肯定要有。但是Mesh和Skeleton之间已经具备了这种映射,而Entity和Mesh是一一对应的,那么Entity和Skeleton也就已经满足了这种多对一的关系,不需要直接维护一个指向Skeleton的指针。那么需要维护啥?一个指向使用同样Skeleton的Entity的EntitySet的指针。EntitySet* mSharedSkeletonEntities;  但是在Skeleton那片文章我讲过,Skeleton只是一种资源端的类,而在场景端,应该用SkeletonInstance类(Skeleton的子类),所以Entity也应该维护一个指向SkeletonInstance的指针SkeletonInstance* mSkeletonInstance;


当然每一个Entity可以有绑定到这个Entity上的子Entity,Entity也会维持这么一个指针,以及一个AABB


另外,针对顶点数据存在CPU和GPU也有一些相应的属性和方法。


最后,Entity可其他的类一样,都是用AbstractFactory创建的,要调用SceneManager的相关函数创造(createEntity)。








 

你可能感兴趣的:(游戏,String,存储,animation)