OGRE中 场景管理器,场景节点和实体

场景管理器:在屏幕上显示的所有东西都是由场景管理器来管理。当您在

场景中添加物体时,场景管理器会记录这些物体的位置。当您添加摄像机

来观看某个场景时,场景管理器会记录摄像机的位置。当您添加平面、广

告牌、灯光时,场景管理器同样会管理他们。 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。还有一大堆

函数是来处理父节点和子节点的。

由于所有的移动都是相对于父节点的,我们可以很容易的使两个节点一起移动。我

们现在已经有这些代码在我们的程序里:

 

 

原文地址:https://www.cnblogs.com/stefan/p/1754270.html