ogre3D学习基础6---场景管理器的使用

时间:2024-01-05 13:07:02

场景管理器的使用

  最常使用的坐标系统空间(同时也是Ogre程序所能提供的)即是世界空间(World)、父节点空间(Parent)以及本地空间(Local)。

1、世界空间

  就是物体所存在的地方,当我们把一个模型放进世界模型里面去,那么它就有了一个世界坐标,这个世界坐标是用来标记世界中不同的模型所处的位置的。在世界空间里,世界的中心就是远点(0,0,0)。而在ogre中,这个也相当于场景根节点的位置,所以世界空间在ogre中也可以理解为“相对于场景根节点”。世界空间也意味着用全局的X,Y,Z坐标。

  父节点空间变换是相对于一个节点的父节点,也就是把父节点的坐标作为变换空间的矩阵原点。本地空间变换是相对于对象绑定的节点本身。大多数情况下,物体的移动是在父空间里面进行,旋转和缩放是在本体空间里面做,这也是ogre中所默认的操作方式。

2、物体空间

  你所创建的物体最终都要放到世界空间里。而所谓物体空间是指相对于物体本身的坐标系。

3、本地空间

  本地空间   ----   就是绕着自己的轴旋转,相对于自己的中心进行缩放。

4、父节点空间(Parent Space)

  父节点空间变换就是相对于父节点的变换。

5、场景中的活动物体(Movable Scene Object

  活动物体(Movable Object)由场景管理器创建,并且绑定到场景节点上,最后再由场景管理器销毁。

  以资源为基础的物体(Resource-Based Objects)

  在Ogre中有相当多的场景内容是根据磁盘的信息来创建的,在这里把它们称为以资源为基础(也可称为磁盘基础)的活动物体,其中最常见的莫过于模型本身以及相应的骨骼数据。

  以四边形为基础的物体(Qurd-Based Objects)

  在活动物体中有很多的以四边形(Quad)为基础的实体,其中包括了粒子系统(Particle System)、公告栏(Billboards)、跟踪轨迹(Ribbon Trail)、表层(Overlay)和天空盒(Skybox,以及相关的天空面Skyplane和穹顶Skydemo)。

  天空面、天空盒和穹顶之间的区别

  其中最大的共同点是它们总是和摄像机保持着固定距离;其次,它们要么是在所有场景物体渲染之前渲染(这也是默认的情况),要么是在所有场景物体渲染之后渲染;

  天空面(Skyplane)  

  天空面就是用来模拟现实世界中天空的一个平面。和ogre中所有其他的平面一样,通过法线和距离来确定在场景中放置位置。

  穹顶(Skydome)

  穹顶技术使用了五个平面来来构造天空,它是一个顶和四个侧面组成的半盒,就是没有底额盒子。天空半盒的每一个面都和摄像机保持固定的距离。这个距离可以交给具体应用来配置。

  天空盒(Skybox)

  首先要注意的是,天空盒并不是简单的在穹顶技术上增加一个底部平面。而是使用了标准的UV坐标变换映射的方法来处理相应纹理,进而只有天空盒才能使用立方体纹理(Cubic Texture)技术来实现天空的细节。

  渲染对象(Rendering Object)

  渲染对象是指用来帮助场景图进行渲染功能的对象,而不是渲染到屏幕的物体。在场景中两个最重要的对象是摄像机和灯光,其中摄像机帮助我们拍摄场景中的物体,而活动的灯光则是你的场景显得更立体和真实。

  摄像机(Camera)

  定义产生一个视截体用来处理渲染工作,有一个近截面和一个远截面。

  灯光(Light)

  分三种,点光源,聚光灯光源,有向光源。

 场景管理器例子:

  使用过程:首先要建立一个场景管理器的实例,然后至少还要构建一个摄像机,并执行“放置一个实体到场景中”的操作。

  建立一个场景管理器和摄像机

 1   virtual void chooseSceneManager(void)
{
// Create the SceneManager, in this case a generic one
mSceneMgr = mRoot->createSceneManager(ST_GENERIC, "ExampleSMInstance");//创建
}
virtual void createCamera(void)
{
// Create the camera
mCamera = mSceneMgr->createCamera("PlayerCam");//
// Position it at 500 in Z direction
mCamera->setPosition(Vector3(0,0,500));//
// Look back along -Z
mCamera->lookAt(Vector3(0,0,-300));//
mCamera->setNearClipDistance(5);//
mCamera->setFarClipDistance(1000);//
}

  创建实体和灯光

 void createScene(void)
{
// Set ambient light
mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));//设置环境光源
// Create a point light
Light* l = mSceneMgr->createLight(“MainLight”); //创建点光源
// Accept default settings: point light, white diffuse, just set position
// NB I could attack the light to a SceneNode if I wanted it to move
// automatically with other objects, but I don’t
l->set Position(,,);  //设置位置
Entity * ent = mSceneMgr->createEntity(“head”, “ogrehead.mesh”);//创建实体
// Set material loaded from Example.material
Ent->setMaterialName(“Examples/EnvMappedRustySteel”);//
// Add entity to the root scene node
mSceneMgr->gerRootSceneNode()->createChildSceneNode()->attachObject(ent);//将实体添加到场景节点
}

  场景节点的移动和旋转

  mSceneNode->translate(100.0, 10.0, 0.0);//场景节点在默认的情况下变换空间为父节点空间(TS_PARENT)

  mSceneNode->translate(100.0, 10.0, 0.0, TS_WORLD);//如果在世界空间进行节点变换,就这样调用

  mSceneNode->translate(0.0,0.0,100.0,TS_LOCAL);//对于本体空间的变换也是类似,本例是将一个节点沿着它朝向的方向“向前”移动100个单位

  对于旋转场景节点而言,默认的变换空间为本地空间(TS_LOCAL);如果你需要不同的旋转空间,必须明确的告知Ogre:

 // 对象绕自己的Y轴旋转一弧度,大约57角度
mSceneNode->yaw(Ogre::Radian(1.0));//
// 对象绕父节点的X轴旋转一弧度,大约57角度
mSceneNode->pitch(Ogre::Radian(1.0), TS_PARENT);//
// 对象绕世界的Z轴旋转一弧度,大约57角度
mSceneNode->roll(Ogre::Radian(1.0),TS_WORLD);//

  缩放不需要关系空间;它在节点本身执行,同时影响节点的所有子节点。

  mSceneNode->scale(2.0, 1.0, 1.0);// 在X轴缩放两倍,其他轴不缩放