Ogre渲染简单的几何物体的方法

转载请注明出处!http://www.cnblogs.com/pulas/

在Ogre里有两种方法来创建自定义网格。第一种是继承SimpleRenderable,并直接提供给它顶点和索引缓存。这是最直接的创建方式,但也是最不直观的。为了使事情更简单,Ogre提供了一个更棒的接口叫做ManualObject,它能让你用一些简单的函数来定义一个网格,而不用往缓存里写原始数据。仅仅调用"position"和"colour"等函数即可,而不用往缓存里丢位置、颜色等数据。

使用ManualObject或者其派生类渲染简单的几何物体的步骤如下:

1. 新建一个ManualObject对象

mManualObj = mSceneManager->createManualObject ("SimpleStuff");

2. 设置该ManualObject的参数(可以不设置以使用默认参数)

- 设置其渲染队列所在的组

mManualObj->setRenderQueueGroup(RENDER_QUEUE_OVERLAY);

- 使用单元投影矩阵和单元视图矩阵, 这两个默认为false, 即使用相机的视图矩阵和投影矩阵

mManualObj->setUseIdentityProjection(true);

mManualObj->setUseIdentityView(true);

使用这两个函数之后, 所绘制的物体坐标范围位于(-1, -1, -1)至(1, 1, 1)之间

- 设置查询参数

mManualObj->setQueryFlags(0);

3. 调用绘制函数

mManualObj->clear();

mManualObj->begin("", RenderOperation::OT_LINE_STRIP);

for (int i = 0; i < 5; i++)

{

        mManualObj->position(pos[i]);

}

mManualObj->end();

4. 创建场景节点挂接该对象

mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(mManualObj);

注意:

- 若在绘制前能确定顶点或索引的个数,则应先调用estimateVertexCount(size_t vcount)和estimateIndexCount(size_t icount)方法。虽然这不是必需的,但是这可以避免在定义顶点时重新分配内存以提高效率。

- 对于每个顶点,可以调用position(), normal(), textureCoord(), colour()等方法定义顶点数据,注意,每次调用position()即开始了一个新的顶点,第一个顶点的数据结构决定了所有顶点的数据结构,不能再在后续顶点定义中添加新类型分量。

- 通过调用index(uint32 idx)使用索引,或者调用triangle(uint32 i1, uint32 i2, uint32 i3)对三角形使用索引,或者调用quad (uint32 i1, uint32 i2, uint32 i3, uint32 i4) 对四边形使用索引。顶点的顺序:逆时针为正面。

- 如果想使用不同的渲染操作类型或材质构造更多的几何体,可使用多个begin-end块。这个类在内部通过一个Renderable列表来组织维护数据,一个begin-end块对应一个Renderable。

- 可以使用beginUpdate()方法动态改变几何体,要想这样做,必须在第一次调用begin()前调用setDynamic(true)方法,并且考虑使用estimateVertexCount(size_t vcount)和estimateIndexCount(size_t icount )方法,使之在顶点数增长时以增量式分配内存,而不是再重新构造一个新的内存块。

Ogre场景的组成

总体上来看,场景中的Objects可分为可动实体和不可动实体。其中,Entities、Cameras和Lights属于Movable Objects,World Geometry属于Immovable Objects。Materials依附于别的Objects之上,无所谓动与不动。

OGRE把离散的,相对较小的,可移动的物体定义为Ogre::MovableObject。其派生出来的类如下图所示。

clip_image002

Camera属于Frustum的子类:

clip_image004

从另一个角度看,物体有可渲染和不可渲染之分。OGRE中能被渲染的Objects都继承于Ogre::Renderable类:

clip_image006

比较MovableObject和Renderable可以发现, Entity属于MovableObject但却不属于Renderable:

clip_image008

Renderable有一个SubEntity的子类,而Entity是由SubEntity组成的:

typedef std::vector<SubEntity*> SubEntityList;

SubEntityList mSubEntityList;

由此可以断定,Entity是被分解为SubEntity完成渲染的。

clip_image010

原文地址:https://www.cnblogs.com/pulas/p/2368230.html