10/15/2011

Ogre(2)



Ogre的总体架构如下图,它主要是三个部分:
1. Scene Management,管理整个场景,包括模型如何组织,camera怎么放
2. Resource Management,管理资源,包括模型、纹理、字体等等,负责资源的加载、重用及释放
3. Rendering,对底层的rendering pipeline的包装,scene management用它来渲染场景内的内容。

对用户而言,root是他们所关心的,一切的开发从root开始。

另外,Ogre还有很多的plugin,可以根据需要来加载。


images/uml-overview
具体地看SceneManager

SceneManager管理着场景中的几乎所有东西:模型及其位置、camera、光、粒子等等。SceneManager还有很多种,如专门渲染地形的,渲染BSP maps的,等等(这里有详细列表)。

场景内的物体叫Entity,就是一些3D mesh。不过它只是单独的模型而已,并没有位置和朝向信息;所以Entity是不能直接加到场景里的,必须通过SceneNode. 

一个场景里可以有多个SceneNode,这些SceneNodes可以形成树状(parent node, child node,以及顶部的root node)。一个SceneNode可以attach多个Entity,也可以attach light object。但一个Entity attached 到一个SceneNode时,这个Entity才被渲染出来。注意,SceneNode的位置都是相对于parent SceneNode来的。




First Ogre application中一些代码的解释


mSceneMgr->setAmbientLight(Ogre::ColourValue(1.0, 1.0, 1.0)); //Ogre颜色采用RGB,每个值的范围在[0, 1]

Ogre::Entity* ogreHead = mSceneMgr->createEntity("Head", "ogrehead.mesh");//创建Entity,第一个参数是Entity的名称,必须是唯一的。第二个参数是要加载的mesh,这里用的是SDK中的资源

Ogre::SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("HeadNode");//创建一个childSceneNode,参数是SceneNode的名称,同样必须是唯一的

headNode->attachObject(ogreHead); //将Entity attached 到 SceneNode上
翻译自Ogre Basic Tutorial 1

Ogre(1)

Computational geometry需要花很多时间,因为项目需要,先看Ogre这个3d渲染引擎。

在选择这个引擎之前,将几个三维渲染引擎比较了一下,主要有OpenSourceGraph, Open Inventor, Visualization ToolKit, Unity3D, OpenSim等。最后选择了Ogre,主要因为它的资源比较多,代码复杂性小。Unity3D和OpenSim虽然可以联网操作,但前者性能较差,无法支持大量数据;后者数据结构复杂,不够灵活,不支持particle systems等。

Ogre从2001年起,逐渐成为最受欢迎的开源三维渲染引擎之一。它主要有这些特点:

1. 采用面向对象的设计原则,为开发者省去了底层的三维API操作;
2. 相比OSG只支持OpenGL,它同时支持Direct3D,为今后的扩展提供了可能;
3. 采用C++语言,支持跨平台
4. 虽然较多地用于游戏开发,但也可以用作科学可视化,尤其是可以与VTK(包含了许多计算机几何学的算法)结合。
5. Ogre的社区非常活跃,有大量的toturial,论坛里也有很多大牛。

基于以上原因,我打算尝试Ogre。