游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4347|回复: 3

Pro.OGRE.3D.Programming第五章学习笔记

[复制链接]

1

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2007-5-1 19:35:00 | 显示全部楼层 |阅读模式
声明:下文是自己学习过程中的记录,版权归原作者所有。如果对ogre感兴趣,请购买原版书。


所有的3d引擎库都采用场景图来组织其中可渲染的实体。其主要目的有两个:1,提供用户快速的查询能力。2 允许用户根据需要查找,排序和裁剪多边形。还有一个目的是用来做碰撞检测。有时,场景图也用来为其它的子模块提供服务,包括语音模块和物理模块。
Ogre的场景图功能和其它的图形引擎是一样的。但是在实现上,ogre和其它的引擎库不同。Ogre采用插件的模式来实现不同的场景图。SceneManager类提供了所有具体场景图的接口。Torque, Unreal, CryENGINE等等都是采用继承的模式,从一个Scene node 来实现所有的功能。当需要支持像语音和物理模块的时间,你会发现这种设计方法是十分笨拙的。
Ogre 从开始就将场景图的内容当作核心的内容来设计,这样就不必采用继承的结构实现场景图和其中的数据节点。只要提供一个很小的接口实现就可以支撑多种场景图的变化和数据类型的改变。从某种意义上来说,ogre的场景图设计是组合模式,而不是继承模式。
Ogre的设计具有深远的意义:你可以在同时在同一场景采用多个不同的场景图模式。这是多年以来一直期望的目标。不管你是采用多场景模式来实现一个场景还是不依赖于应用程序的设计,你都会看到这是对 portalling最好的答案。Portal说的是将一个复杂场景和另一个场景做分割。比如从室内场景通过窗户看室外场景。这是非常难解决的问题。还有许多人仍然在考虑这个问题的答案。但是本书的目的。。。。。。。。。
Scene Manager(以下简写为SM)
在ogre中SM完成以下功能:
1 在场景中创建可移动实体,灯光,摄像机等。而且提供有效的方式对它们进行随意的操作。
2 加载和组合地理信息。地理信息不同于可移动实体。
3 提供场景查询。比如都有哪些实体在一个特定的球体内等。
4 裁剪不可见实体,并将可见实体加入到渲染队列。
5 计算当前渲染实体的光照。
6 设置和渲染场景内的所有阴影。
7 设置和渲染场景中的所有实体,包括背景和天空盒等。
8 传输渲染实体到渲染系统进行渲染
        Scene Manager Types
        在ogre的论坛中经常会有一个问题是为什么叫场景类型?答案么就是ogre以插件形式实现SM,你可以加载多个插件来为你的应用程序服务。比如说吧,你的游戏可能有两个场景,一个是室内,一个是室外,每一个都可以有一个单独的SM来进行优化管理。每个SM都会在ogre中注册一个以字符串名字区分的SM相关的类厂实例。你可以自己指定SM的名称或者让ogre来指定一个。一般来说,你可以在程序中存储一个SM的指针,所以SM的名字不是很重要。
        Ogre中的OTSM插件提供两个SM,分别有不同的用途。(这个地方原文有点混乱)。
Scene Object Creation
对程序员来说一般采用SM来创建移动和静止的实体。包括灯光,摄像机,物体,粒子系统,布告栏,天空盒,和地理信息等。这就必须允许开发者来定制特定实体的操作流程。
这里,操作指的是SM中实体的整个生命周期,包括创建,获取,销毁,全部销毁等。对实体而言,生是SM的人,死是SM的鬼。也就是说,对你而言,实体是场景的,你只有使用权,而没有所有权。如果你想手动清理实体,只能去请求SM。一般情况下,这些事情都是交给Root干的。
        SCENE Nodes
        SM还是定义场景图结构的节点的老爸。在SM中节点是采用继承模式(注意区分和c++语言的不同,这里是节点可以有孩子节点,还可以有父节点,说白了就是单亲树)。你可以将节点挂接到SM或者解挂。但是呢,你不能销毁节点,只能让SM来干。你可以将root节点解挂,这样的话,你整个渲染系统都玩完了就。另外渲染期间,不要随意销毁节点,不然上帝会发怒的。
        SM会负责创建一个没有爹的节点,它就是root了。你不能销毁root。这个东西非常有用处。它是所有节点的老祖宗,同时也是挂接静态实体和地理信息的所在。同时root是沉稳不动的,虽然你是上帝但是也不能随便你挪动root的屁股。
        下面的图说明了节点挂接的方式。

SM不会往节点上挂接任何实体。这些事情就交给你做了。另外,即使在节点上挂接了实体,节点也不是非要去找个爹。(注:要区分节点挂接和实体挂接。)一个节点在任何时刻任何状态都可以挂接0-计算机允许的实体个数。同时,一个实体只能挂接到一个节点上面,不然ogre就哭了。
        所有对实体进行的平移,旋转和缩放都是对节点有效,而不是实体。实体只是挂接到上面。(注:这里将具体数据和操作分离。类似于代理模式。这种设计在我看来,真的是很棒。)
        Scene Queries
        SM经常干的第二件事情就是提供查询能力,射线检测,球体检测,包围盒检测,包围面检测和碰撞检测。射线检测说的是场景中有一个线,都有哪些实体被这条线给干了。球体检测说的是场景中的一个球,都有哪些实体被这个球给包裹了。包围盒检测说的是一个和世界坐标平行的三个向量构成的角落,都哪些实体被它给容纳了。包围面检测说的是都哪些实体在由一些列面组成的结构中。碰撞检测说的是实体A在那忙碌,实体B过去搞了一下下,这种情况下,ogre就出面告诉你实体B不老实啊。在ogre中,这些检测可以重用,平且非常灵活。想象一下,在游戏中一个玩家从天而降,ogre会告诉它你什么时间碰地了。这个就是做这个用的。在ogre中,所有的这些检测都做到最优化。所有的检测都有标识符(注:下面会详细介绍)。
        Spatial Relationships and 3D Transforms
        对3d编程新手来说,理清楚3d空间实体和实体之间,节点和实体之间的关系往往需要很多时间。下面呢,我们就简单介绍一哈子。
        Spatial Transforms
        在3d数学中,实体的位置,方向,大小变换都可以表达成特定空间中4x4的变换矩阵形式。在ogre中特定的变换空间有三个,分别是世界空间,父空间和本地空间。世界空间变换是相对于全局的(0,0,0)进行的变换,从某种意义上说是相对于节点root进行的变化。父空间变换是指子节点在其父亲节点的空间中进行的变换。大多数情况下,你在父空间进行平移变换。在本地空间进行缩放和旋转变换。其实,所有的操作你都不需要去关心,ogre已经为你处理好了一切。
        Object Space
        当你创建一个实体的时间,ogre已经将实体的顶点设置到了世界空间。举例说明:你在3dmax中创建了一个1x1x1大小的立方体,其中心点在(0.5,0.5,0.5),这些信息在实体空间中永远不变。如下图所示:

当这个实体被挂接到一个节点上的时间,世界空间变换矩阵会将实体的顶点信息转换到世界空间。如下图所示:

        在图a中,实体中心在世界空间的(0,0,0),图b中实体被移到了世界空间的(10,10,10)。
        通常情况下,你可能认为图形工具产生的实体坐标和ogre里面的坐标会有不同的地方。实际情况是:保证没有问题。放心大胆的去用ogre吧。
Local Space
        变换一般来说,是指对相关的某个地方的变换。比如,在3d节点中,变换指的是对节点的父节点或者是时间空间原点的变换。实际上,你可以使一个节点对自身进行变换。对旋转和缩放来说,都是在本地空间或者是实体空间进行旋转或者是缩放。如下图所示:


首先,我们说明的是旋转和缩放都是对节点进行的。实际上,节点本身没有任何变化,节点本身是不可见和不能被选人的。当对节点进行缩放操作的时间,挂接到节点上的实体是直接作用的目标。如上图所示。网格增大或者缩小,并且所有的网格上顶点的法向量也进行相应的变化。对节点而言,唯一变化的就是要反应挂接到上面的实体的变化。同理,旋转也是这样,节点只不过是反应方向或者是位置变化。
Parent Space
        父空间变换如下图所示:

图a中,父节点在世界空间的坐标为(5,5,0)。父空间的坐标轴和世界空间平行。子节点在父空间的坐标为(2,-1,0)。当父节点的世界坐标变化作用到子节点的时间,子节点在世界空间的坐标为(7,4,0)。在图b中,子节点在父空间中移动了(-1,-1,-1),结果根据其和父节点的关系,在世界空间中其坐标变换为(6,3,-1)。
下图说明了父子空间中父子节点变换的关系。重要的一点是,变换是往下累积的。

World Space
Ogre会在节点变换的时间,计算节点及其子节点的世界空间的坐标,并将其保存。世界空间是渲染和投影作用的空间。一般情况下,在ogre中不需要和世界坐标打交道,除了对地理信息的处理。

22

主题

309

帖子

353

积分

中级会员

Rank: 3Rank: 3

积分
353
QQ
发表于 2007-5-3 12:13:00 | 显示全部楼层

Re:Pro.OGRE.3D.Programming第五章学习笔记

文章很好啊...为什么没人看...

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2009-1-13 13:39:00 | 显示全部楼层

Re:Pro.OGRE.3D.Programming第五章学习笔记

很好,谢谢!

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2009-1-13 13:41:00 | 显示全部楼层

Re:Pro.OGRE.3D.Programming第五章学习笔记

有没有办法动态的改变实体的大小呢,如高度、宽度等啊?????????????
谢谢!

fuhui_21@163.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 12:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表