OGRE乱记三

1. 摄象机与Entity不一样,Entity是完全不具有调整自身位置的能力,所以只能将自己挂接到场景节点上,通过对场景节点的位置调整来达到调整自身位置的目的,但摄象机有这个能力,所以可以独立控制。当然将摄象机挂接到场景节点上可以带来很多方便。如果要将摄象机和光挂接到场景节点上,方法与挂接Entity没什么区别,都是通过节点的attachObject函数来完成。attachObject函数的参数是MovableObject类型的,而MovableObject类是Entity、Camera和Light类的基类,所以attachObject函数可以接收Entity、Camera和Light类型的参数。

2. 在creatScene中再设用一次mCamera = mSceneMgr->createCamera( "PlayerCam" );,就会把原来的camera给盖住了,等于所该mCamera指向了一个新的camera, 而不是原来所在的那个能配合键盘鼠标移动的camera. 然后就不能用移动方向. mCamera->setPosition( Vector3( 0, 0, 200 ) );
mCamera->lookAt( Vector3( 0, 0, 300 ) ); 这个和OPENGL中的LOOKAT函数类似,只不过它是一个函数, 这里是二个函数, camera的position和lookat的坐标连向的向量就是camera所转向的方向.决定一个摄像机有三组参数,第一组是它的位置坐标position, 第二组是它的查看方向lookat, 第三组是在这个视线方向上的摄像机的旋转方向.

3. plane.normal = Vector3::UNIT_Y; // 法线方向
plane.d = 100; // 距世界原点的距离
由平面的法向可以定出和这个平面平行的所有位置, 再由这些平面组中到原点的距离定出这个平面的真正位置.


4. 在普通情况下使用的是普通场景管理器。如果要使用特殊的场景管理器,通过mRoot->getSceneManager()函数做出选择就可以了。在OGRE的SceneManager类中有这样的一个函数setWorldGeometry,它的作用是读入世界信息(复杂场景中的大楼、野外地形等不变场景内容,区别于程序员手工加入的可以控制的场景元素),并将其管理起来。对于普通场景管理器来讲,没有“World Surface(Terrain,Room...)”这个概念,调用这个函数将只会抛出一个"World geometry is not supported by the generic SceneManager.的异常。而OGRE在其引擎提供Plugin_BSPSceneManager.dll中提供了通过BSP算法实现的ST_INTERIOR室内场景管理器,它重新实现了setWorldGeometry函数,使其可以读入一个.bsp的室内场景文件并管理之。.bsp是QUAKE和CS等室内游戏使用的场景文件类型。OGRE还在其引擎提供的Plugin_OctreeSceneManager.dll中提供了通过八叉树算法实现ST_EXTERIOR_CLOSE室外封闭场景管理器,它同样重新实现了setWorldGeometry函数,使其可以读入一个.cfg室外场景配置文件,并载入以灰度图形式表达的地形高程图。需要注意的是特殊场景管理器不仅可以管理复杂场景中那些属于“World Surface”(复杂场景中的大楼、野外地形等不变场景内容)的场景内容,它也具有普通场景管理器的全部功能。所以在应用时,通过setWorldGeometry函数载入“不变世界”之后依然可以向场景中加入SceneNode和Entity等其它场景元素,依然可以通过FrameLisener来控制这些普通场景元素的运动。只不过它们将在一个具有楼房或山坡的场景中运动了。

5. OGRE除了我们已经见过的普通场景以外还支持大型复杂的场景,如:宽阔的野外地形和复杂的大楼和迷宫。3D引擎支持大型复杂场景的主要难度在于对场景的组织和裁减。一个大型场景的三角型数量极其庞大,如果没有有效的场景组织和裁减方法,计算机在渲染的时候效率会很低。解决大办法就是用BSP或八叉树等数据结构将场景组织起来,利用与这些数据结构相关的快速检索算法将摄象机看到的内容拣选出来,再送到渲染器进行渲染,这样图形处理器的负载才会减小。
在OGRE中场景管理器的类型有四种:
ST_GENERIC,普通场景
ST_EXTERIOR_CLOSE,室外封闭场景
ST_EXTERIOR_FAR,室外无限场景
ST_INTERIOR室内场景
除了第一种普通场景外,其它几种都是处理复杂场景的专用场景管理器。OGRE引擎中有一个SceneManagerEnumerator类,它的作用是管理已实现的场景管理器。在OGRE的Root类里就就聚合了一个SceneManagerEnumerator对象,已供选择需要的场景管理器。

你可能感兴趣的:(数据结构,游戏,算法,配置管理)