真倒霉,昨天下午才写完的东西,没有保存好,就没有了,刚才写完,现在把这一章节的内容放在下面:
1创建场景管理器
mSceneMgr = mRoot->createSceneManager("FooSceneManager");
SceneManager* Ogre::Root::createSceneManager | ( | const String & | typeName, | |
|
| const String & | instanceName = StringUtil::BLANK |
|
| ) |
|
|
|
创建一个给定类型的场景管理器实例
评论:
你可以使用这种方法去创建一个给定类型的场景管理器。你可能知道一些已经存在的类型,或者你可能通过查看getMetaDatalterator的获得相应的类型
注意:
如果类型名不能够找到的话,调用这该方法将会抛出异常
参数:
typeName:一个确定唯一的场景管理器类型的字符串
instanceName:才被创建的新实例的可选名字。如果你给出这个参数的值的话,系统将自动分配一个名字
2得到场景管理器的指针
SceneManager *bar = mRoot->getSceneManager(“FooSceneManager”);
SceneManager* Ogre::Camera::getSceneManager(void) const
返回一个指向场景管理器所渲染摄像机的指针
3. 在场景中添加地面
mSceneMgr->setWorldGeometry( "terrain.cfg" );
virtual void Ogre::SceneManager::setWorldGeometry(
const String & filename
)[virtual]
设置世界三维物体的资源
大的,主要是静态三维物体构成世界的空间和场景
评论:
依赖于场景管理器的类型,你需要通过Root或者SceneManagerEnumerator类,你可以通过传递给该方法一个文件名,它将会尝试着加载将要使用的世界级三维物体。如果你尝试加载一个不合适的世界数据,将会抛出异常。默认的SceneManager不能处理所有的世界上的所有三维物体,因此将会经常抛出异常。像BspSceneManager的子类可以加载一些形如“q3dm1.bsp”的特殊类型的世界三维物体。
4初始化所有的资源组:
ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
virtual BackgroundProcessTicket Ogre::ResourceBackgroundQueue::initialiseAllResourceGroups(
Listener * listener = 0
)[virtual]
virtual BackgroundProcessTicket Ogre::ResourceBackgroundQueue::initialiseAllResourceGroups
(
Listener *
listener = 0
)
[virtual]
初始化那些将要在背景中初始化的所有资源组。
你也可以去查阅ResourceGroupManager::intialiseResourceGroup
参数:
Listener 可选的回调接口,记录头文件中的警告信息,了解他才可以用它
返回:
Ticket 确定回调的接口,使用isProcessComplete()方法去决定是否使用listener完成
5设置天空盒:
mSceneMgr->setSkyBox( true, "Examples/SpaceSkyBox" );
virtual void Ogre::SceneManager::setSkyBox | ( | bool | enable, | |
|
| const String & | materialName, | |
|
| distance = 5000, | ||
|
| bool | drawFirst = true, | |
|
| const Quaternion & | orientation = Quaternion::IDENTITY, | |
|
| const String & | groupName = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME |
|
| ) |
|
|
|
设置天空盒显示与否
和以摄像机观察到天空保持固定距离的6边型盒子
评论:
你可以使用标准的网格和实体去创建一个天空盒,但是它创建了一个摄像机不能接近或者远离的平面,因为他伴随着摄像机一起移动。
你所使用创建天空盒的材质可以包含一些单独材质层,或者他们可以是有6个图像构成的立方体材质,平面的每一个面是立方体。查看更多信息请查阅TextureUnitState类
参数:
enable :True时创建天空盒,false时不创建天空盒
materialName:天空盒所使用的材质名字
distance:摄像机到每个盒子平面在世界坐标系中的距离,默认值通常是OK
drawFirst :如果是ture,盒子在所有的场景中的三维物体之前渲染,不需要更新深度缓存。这是最安全的渲染方法,因为所有的物体都会出项在天空前面。然而如果大部分天空被物体阻挡,
这不是最有效的方法。如果在这种情况下,你可以设置这个参数为false,以为它在所有的三维物体之后渲染,这也是一种最优化方法。然而你要确保距离值应该足够大,一次所有在天空盒里的物体都会被不会超过天空盒的范围
Orientation:明确天空盒方向的可选参数。默认情况下,盒子的顶部不认为是Y轴的正方向,盒子的前部被认为是-Z轴方向。你可以用这个参数去确定天空的位置。
groupName:分配给plane网格的资源组名字
6 天空穹
mSceneMgr->setSkyDome( true, "Examples/CloudySky", 5, 8 );
virtual void Ogre::SceneManager::setSkyDome | ( | bool | enable, | |
|
| const String & | materialName, | |
|
| curvature = 10, | ||
|
| tiling = 8, | ||
|
| distance = 4000, | ||
|
| bool | drawFirst = true, | |
|
| const Quaternion & | orientation = Quaternion::IDENTITY, | |
|
| int | xsegments = 16, | |
|
| int | ysegments = 16, | |
|
| int | ysegments_keep = -1, | |
|
| const String & | groupName = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME |
|
| ) |
|
|
|
设置天空穹的现实与否
一个曲线天空的假象
评论:
天空穹实际是是有立方体的5个面组成。伴随着纹理坐标的生成,产生一个弯曲的穹顶。当你需要一个没有雾的逼真的场景,而且总是地面来防止观察者看到地平线的时候,天空穹是一个不错的选择。如果你需要一个一个完整的包裹背景的话,使用setSkyBox代替。实际上,你可以采用结合天空盒和天空穹的方法,产生一个有云层覆盖的弯曲天空穹。
天空穹可以和产生形如云的重复纹理的2D一起运行。你可以通过更改曲率来适应场景的需要。然而高曲率更适合于FPS层,在这个层,你不能一次看到需到天空,夸张的曲线看起来不错。
参数:
enable :True时创建天空穹,false时不创建天空穹
materialName:天空穹所使用的材质名字
curvature:天空穹的曲率。值最好设子在2到65之间。大值弯曲的更狠可以产生比较光滑的效果,小值弯曲的不太明显,这也意味着水平方向的曲率越大,远距离效果会更好
tiling: 贴图重复的次数
distance:摄像机到每个盒子平面在世界坐标系中的距离,默认值通常是OK
drawFirst :如果是ture,盒子在所有的场景中的三维物体之前渲染,不需要更新深度缓存。这是最安全的渲染方法,因为所有的物体都会出项在天空前面。然而如果大部分天空被物体阻挡,
这不是最有效的方法。如果在这种情况下,你可以设置这个参数为false,以为它在所有的三维物体之后渲染,这也是一种最优化方法。然而你要确保距离值应该足够大,一次所有在天空盒里的物体都会被不会超过天空盒的范围
Orientation:明确天空盒方向的可选参数。默认情况下,盒子的顶部不认为是Y轴的正方向,盒子的前部被认为是-Z轴方向。你可以用这个参数去确定天空的位置。
groupName:分配给plane网格的资源组名字
7.天空面
Plane plane;
plane.d = 1000;
plane.normal = Vector3::NEGATIVE_UNIT_Y;
mSceneMgr->setSkyPlane( true, plane, "Examples/SpaceSkyPlane", 1500, 75 );
virtual void Ogre::SceneManager::setSkyPlane | ( | bool | enable, | |
|
| const Plane & | plane, | |
|
| const String & | materialName, | |
|
| scale = 1000, | ||
|
| tiling = 10, | ||
|
| bool | drawFirst = true, | |
|
| bow = 0, | ||
|
| int | xsegments = 1, | |
|
| int | ysegments = 1, | |
|
| const String & | groupName = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME |
|
| ) |
|
|
|
决定天空面的显示与否
评论:
你可以使用标准的网格和实体去创建一个天空面,但是它创建了一个摄像机不能接近或者远离的平面,因为他伴随着摄像机一起移动。
注意:
可以使用TextureUnitStata类的方法使天空材质缩放,宣传等
参数:
enable :True时创建天空面,false时不创建天空面
plane:天空面的具体细节问题,比如说它离摄像机的距离
materialName:天空穹所使用的材质名字
scale:应用在天空面上的缩放比例,大值意味着一个比较大的天空面,你可以基于plane。d和场景的一些其他参数去调整这个值
tiling: 贴图重复的次数
distance:摄像机到每个盒子平面在世界坐标系中的距离,默认值通常是OK
drawFirst :如果是ture,盒子在所有的场景中的三维物体之前渲染,不需要更新深度缓存。这是最安全的渲染方法,因为所有的物体都会出项在天空前面。然而如果大部分天空被物体阻挡,
这不是最有效的方法。如果在这种情况下,你可以设置这个参数为false,以为它在所有的三维物体之后渲染,这也是一种最优化方法。然而你要确保距离值应该足够大,一次所有在天空盒里的物体都会被不会超过天空盒的范围
bow : 如果值为0,那么天空面将是很平整的,如果值大于0,天空面将有曲度,这种情况下允许天空低于摄像机层。弯曲的天空面和天空穹相似,但是更适合使用雾化效果
xsegments,ysegments:x和y的线段数量,当你使天空面弯曲的时候,这个值非常重要,但是如果你想用天空面的一部分来展示每个顶点的效果的时候,这个值很有用
Orientation:明确天空盒方向的可选参数。默认情况下,盒子的顶部不认为是Y轴的正方向,盒子的前部被认为是-Z轴方向。你可以用这个参数去确定天空的位置。
groupName:分配给plane网格的资源组名字
8设置背景颜色
ColourValue fadeColour(0.9, 0.9, 0.9);
mWindow->getViewport(0)->setBackgroundColour(fadeColour);
void Ogre::Viewport::setBackgroundColour | ( | const ColourValue & | colour | ) |
在渲染前设置视口的初始化背景颜色
9设置雾化效果
mSceneMgr->setFog(FOG_LINEAR, fadeColour, 0.0, 10, 150);
virtual void Ogre::AutoParamDataSource::setFog | ( | mode, | ||
|
| const ColourValue & | colour, | |
|
| expDensity, | ||
|
| linearStart, | ||
|
| linearEnd |
| |
| ) |
|
|
|
注:API中没有相应的解释
OGRE---旺
记于2009-12-1晨