场景管理器的使用
最常使用的坐标系统空间(同时也是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) 2 { 3 // Create the SceneManager, in this case a generic one 4 mSceneMgr = mRoot->createSceneManager(ST_GENERIC, "ExampleSMInstance");//创建 5 } 6 virtual void createCamera(void) 7 { 8 // Create the camera 9 mCamera = mSceneMgr->createCamera("PlayerCam");// 10 // Position it at 500 in Z direction 11 mCamera->setPosition(Vector3(0,0,500));// 12 // Look back along -Z 13 mCamera->lookAt(Vector3(0,0,-300));// 14 mCamera->setNearClipDistance(5);// 15 mCamera->setFarClipDistance(1000);// 16 }
创建实体和灯光
1 void createScene(void) 2 { 3 // Set ambient light 4 mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));//设置环境光源 5 // Create a point light 6 Light* l = mSceneMgr->createLight(“MainLight”); //创建点光源 7 // Accept default settings: point light, white diffuse, just set position 8 // NB I could attack the light to a SceneNode if I wanted it to move 9 // automatically with other objects, but I don’t 10 l->set Position(20,80,50); //设置位置 11 Entity * ent = mSceneMgr->createEntity(“head”, “ogrehead.mesh”);//创建实体 12 // Set material loaded from Example.material 13 Ent->setMaterialName(“Examples/EnvMappedRustySteel”);// 14 // Add entity to the root scene node 15 mSceneMgr->gerRootSceneNode()->createChildSceneNode()->attachObject(ent);//将实体添加到场景节点 16 }
场景节点的移动和旋转
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:
1 // 对象绕自己的Y轴旋转一弧度,大约57角度 2 mSceneNode->yaw(Ogre::Radian(1.0));// 3 // 对象绕父节点的X轴旋转一弧度,大约57角度 4 mSceneNode->pitch(Ogre::Radian(1.0), TS_PARENT);// 5 // 对象绕世界的Z轴旋转一弧度,大约57角度 6 mSceneNode->roll(Ogre::Radian(1.0),TS_WORLD);//
缩放不需要关系空间;它在节点本身执行,同时影响节点的所有子节点。
mSceneNode->scale(2.0, 1.0, 1.0);// 在X轴缩放两倍,其他轴不缩放