场景管理器:在屏幕上显示的所有东西都是由场景管理器来管理。当您在
场景中添加物体时,场景管理器会记录这些物体的位置。当您添加摄像机
来观看某个场景时,场景管理器会记录摄像机的位置。当您添加平面、广
告牌、灯光时,场景管理器同样会管理他们。 OGRE里有很多种场景管理
器。有的场景管理器渲染地面,有的场景管理器渲染BSP表等等。
场景节点:场景节点将持续跟踪与它绑在一起的实体的方位。当你创建了一
个实体时,它直到与一个场景节点绑定后才会被渲染。同样,一个场景节点
也不能单独的在屏幕上显示出来,只有与一个实体绑定后才能在屏幕上显示。
场景节点可以绑定多个实体。例如在屏幕上有在行走的一个人物对象,并且
希望这个对象产生发光效果,要实现这些,首先你需要创建一个场景节点,
然后再创建一个人物对象的实体并与场景节点绑定在一起,之后你还需要创
建一个光照模型也与这个场景节点绑定在一起。场景节点同样可以与其它场景
节点绑定以描述更完整的对象。
在场景中,场景节点的位置总是与它的父节点相关。每一个场景管理器都包含一个根节点。
实体:一个实体是可以在场景中渲染的物体之一。您可以把实体理解为任何
一个3D模型。一个机器人可以是一个实体,一条鱼可以是一个实体,大地草
原可以是一个非常大的实体。灯光,摄像机,粒子,广告牌等不能成为实体。
但在 Ogre 中你不能够直接将一个实体放入到场景中,而是将实体与场景节
点绑在一起,这个场景节点则包括了实体的方位信息。
01.
为整个场景设置环境光,这样才可以看到要显示的内容,通过调用
setAmbientLight函数并指定环境光的颜色就可以做到这些。指
定的颜色由红、绿、蓝三种颜色组成,且每种色数值范围
在 0 到 1 之间。
mSceneMgr->setAmbientLight( ColourValue( 1, 1, 1 ) );
02.
创建一个 Entity ,通过调用 SceneManager 的 createEntity 方法来创建:
Entity *ent1 = mSceneMgr->createEntity( "Robot", "robot.mesh" );
03.
创建一个场景节点来与它绑定在一起。既然每个场景管理器都有一个根节点,那我们就在根节点下创建一个场景节点。
SceneNode *node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "RobotNode" );
04.
将实体与场景节点绑定在一起
node1->attachObject( ent1 );
实体常用函数:
Entity::setVisible
Entity::isVisible
Entity::getName
Entity::getParentSceneNode
场景节点深入了解:
场景节点类同样相当复杂。场景节点能实现很多事情,所以我们只了解一些常用的。
你可以利用getPosition或setPosition得到或者设定场景节点的位置 (总是和父节
点相对的)。你可以利用translate函数来移动对象。
场景节点不仅仅决定一个对象的位置,它还可以控制一个对象的缩放比例和旋转角
度。你可以用scale函数来设置一个对象的缩放比例,还可以用yaw, roll, pitch函
数来旋转对象。你可以用resetOrientation来还原你对对象进行的所有旋转。你还
可以用setOrientation, getOrientation和rotate函数对对象进行高级旋转。四元
数会在后面的教程里对大家讲解。
你现在已经见过attachObject函数了。当你想对绑定到场景节点上的对象进行操作
时,这些函数会很有帮助:numAttachedObjects, getAttachedObject(这个函
数有很多版本), detachObject(同样很多版本), detachAllObjects。还有一大堆
函数是来处理父节点和子节点的。
由于所有的移动都是相对于父节点的,我们可以很容易的使两个节点一起移动。我
们现在已经有这些代码在我们的程序里: