- 浏览: 139094 次
- 性别:
- 来自: 北京
文章分类
最新评论
Ogre引擎源码——场景查询
http://blog.csdn.net/hunter8777/article/details/6249630
作为一个3D绘制引擎,3D场景的管理至关重要。最近在看这部分的源码,发现内容很多,打算从简单入手,逐一击破。
本文就来解读下场景查询SceneQuery。
相关头文件是OgreSceneQuery.h
先附上该类的UML图
Ogre中将场景查询做成了一个单独的类,提供给SceneManager做相应的查询。
从UML图中可以看到,场景查询的基类是SceneQuery。它有三个直接子类,也就是Ogre直接的查询方式:区域查询、光线查询和求交查询。每种查询都有相应的查询结果结构,结果信息一般分为两类:objects和world geometry。前者是场景中可移动的物体元素(MovableObject),后者是世界信息(复杂场景中的地形等不变的元素)。由于场景管理方式可以不同(八叉树、BSP),所以同种查询在不同的场景管理器下,得到的结果也是不一样的。
(1)SceneQuery
该类成员变量如下:
- SceneManager*mParentSceneMgr;
- uint32mQueryMask;
- uint32mQueryTypeMask;
- set<WorldFragmentType>::typemSupportedWorldFragments;
- WorldFragmentTypemWorldFragmentType;
- SceneManager*mParentSceneMgr;
- uint32mQueryMask;
- uint32mQueryTypeMask;
- set<WorldFragmentType>::typemSupportedWorldFragments;
- WorldFragmentTypemWorldFragmentType;
mParentSceneMgr用来指向当前使用该查询的场景管理器。
mQueryMask/mQueryTypeMask是一个32位掩码,用来过滤查询结果。前者对应单一场景元素,后者对应一类场景元素。
mSupportedWorldFragments表示该查询类支持的世界信息查询。
mWorldFragmentType表示当前世界信息的查询类型。
WorldFragmentType是一个枚举。
- enumWorldFragmentType{
- ///Returnnoworldgeometryhitsatall
- WFT_NONE,
- ///Returnpointerstoconvexplane-boundedregions
- WFT_PLANE_BOUNDED_REGION,
- ///Returnasingleintersectionpoint(typicallyRaySceneQueryonly)
- WFT_SINGLE_INTERSECTION,
- ///CustomgeometryasdefinedbytheSceneManager
- WFT_CUSTOM_GEOMETRY,
- ///GeneralRenderOperationstructure
- WFT_RENDER_OPERATION
- };
- enumWorldFragmentType{
- ///Returnnoworldgeometryhitsatall
- WFT_NONE,
- ///Returnpointerstoconvexplane-boundedregions
- WFT_PLANE_BOUNDED_REGION,
- ///Returnasingleintersectionpoint(typicallyRaySceneQueryonly)
- WFT_SINGLE_INTERSECTION,
- ///CustomgeometryasdefinedbytheSceneManager
- WFT_CUSTOM_GEOMETRY,
- ///GeneralRenderOperationstructure
- WFT_RENDER_OPERATION
- };
这里的类对应不同查询类型的返回结果。
WFT_PLANE_BOUNDED_REGION对应查询类型中的区域查询;WFT_SINGLE_INTERSECTION对应求交查询;WFT_CUSTOM_GEOMETRY则是用户自定义的类型。
SceneQuery类的成员函数全是成员变量的getter/setter,都是虚函数。
(2)SceneQueryListener/RaySceneQueryListener/IntersectionSceneQueryListener
抽象类,负责场景查询时回调。
协作过程是将相应的Listener传入场景查询类,在查询类中完成回调。(一般查询类自身都继承Listener,所以在查询类中的执行函数execute也提供将自己作为Listener参数进行传递的重载)
这3个Listener分别对应三种查询:区域、光线、求交。其实这3个类提供的接口名称是一样的。
以SceneQueryListener为例:
- /**CalledwhenaMovableObjectisreturnedbyaquery.*/
- virtualboolqueryResult(MovableObject*object)=0;
- /**CalledwhenaWorldFragmentisreturnedbyaquery.*/
- virtualboolqueryResult(SceneQuery::WorldFragment*fragment)=0;
- /**CalledwhenaMovableObjectisreturnedbyaquery.*/
- virtualboolqueryResult(MovableObject*object)=0;
- /**CalledwhenaWorldFragmentisreturnedbyaquery.*/
- virtualboolqueryResult(SceneQuery::WorldFragment*fragment)=0;
提供两个接口分别对应的就是两种不同的查询结果:可移动的物体元素和世界信息。
分别对三种查询提供三种Listener的原因是后两种需要一些附加的信息。RaySceneQueryListener需要返回Ray上的距离信息;IntersectionSceneQueryListener则是以相交的成对场景元素返回。
(3)SceneQueryResult/RaySceneQueryResultEntry/IntersectionSceneQueryResult
结构体,用来作为查询结果返回。以SceneQueryResult为例:
- ///Listofmovableobjectsinthequery(entities,particlesystemsetc)
- SceneQueryResultMovableListmovables;
- ///Listofworldfragments
- SceneQueryResultWorldFragmentListworldFragments;
- ///Listofmovableobjectsinthequery(entities,particlesystemsetc)
- SceneQueryResultMovableListmovables;
- ///Listofworldfragments
- SceneQueryResultWorldFragmentListworldFragments;
如前多次所述,所有的查询结果都分为两类:可移动的物体元素和世界信息。
分别对应三种查询提供三种结果结构,理由和Listener一样。
(4)RegionSceneQuery/RaySceneQuery/IntersectionSceneQuery
抽象类,继承自相应的SceneQuery和Listener类。该类主要有两个作用:保存查询结果、提供外部执行查询的接口。
以RegionSceneQuery为例:
它所对应的查询结果是SceneQueryResult,成员变量也就仅此一个。
- SceneQueryResult*mLastResult;
- SceneQueryResult*mLastResult;
最重要的两个执行函数就是
- /**Executesthequery,returningtheresultsbackinonelist.*/
- virtualSceneQueryResult&execute(void);
- /**Executesthequeryandreturnseachmatchthroughalistenerinterface.*/
- virtualvoidexecute(SceneQueryListener*listener)=0;
- /**Executesthequery,returningtheresultsbackinonelist.*/
- virtualSceneQueryResult&execute(void);
- /**Executesthequeryandreturnseachmatchthroughalistenerinterface.*/
- virtualvoidexecute(SceneQueryListener*listener)=0;
这才是真正做查询的接口。
第二个execute函数一般会将查询类自身作为参数传入(因为查询类继承自Listener)。无参数的exectue函数通常会调用有参数的execute重载版本。
RegionSceneQuery还分别派生了AxisAlignedBoxSceneQuery/SphereSceneQuery/PlaneBoundedVolumeListSceneQuery。
这三个类中还会保存有相应的区域结构(如AAB就存有一个AxisAlignedBox类等),用来设定相应的区域。
http://blog.csdn.net/hunter8777/article/details/6249630
作为一个3D绘制引擎,3D场景的管理至关重要。最近在看这部分的源码,发现内容很多,打算从简单入手,逐一击破。
本文就来解读下场景查询SceneQuery。
相关头文件是OgreSceneQuery.h
先附上该类的UML图
Ogre中将场景查询做成了一个单独的类,提供给SceneManager做相应的查询。
从UML图中可以看到,场景查询的基类是SceneQuery。它有三个直接子类,也就是Ogre直接的查询方式:区域查询、光线查询和求交查询。每种查询都有相应的查询结果结构,结果信息一般分为两类:objects和world geometry。前者是场景中可移动的物体元素(MovableObject),后者是世界信息(复杂场景中的地形等不变的元素)。由于场景管理方式可以不同(八叉树、BSP),所以同种查询在不同的场景管理器下,得到的结果也是不一样的。
(1)SceneQuery
该类成员变量如下:
- SceneManager*mParentSceneMgr;
- uint32mQueryMask;
- uint32mQueryTypeMask;
- set<WorldFragmentType>::typemSupportedWorldFragments;
- WorldFragmentTypemWorldFragmentType;
- SceneManager*mParentSceneMgr;
- uint32mQueryMask;
- uint32mQueryTypeMask;
- set<WorldFragmentType>::typemSupportedWorldFragments;
- WorldFragmentTypemWorldFragmentType;
mParentSceneMgr用来指向当前使用该查询的场景管理器。
mQueryMask/mQueryTypeMask是一个32位掩码,用来过滤查询结果。前者对应单一场景元素,后者对应一类场景元素。
mSupportedWorldFragments表示该查询类支持的世界信息查询。
mWorldFragmentType表示当前世界信息的查询类型。
WorldFragmentType是一个枚举。
- enumWorldFragmentType{
- ///Returnnoworldgeometryhitsatall
- WFT_NONE,
- ///Returnpointerstoconvexplane-boundedregions
- WFT_PLANE_BOUNDED_REGION,
- ///Returnasingleintersectionpoint(typicallyRaySceneQueryonly)
- WFT_SINGLE_INTERSECTION,
- ///CustomgeometryasdefinedbytheSceneManager
- WFT_CUSTOM_GEOMETRY,
- ///GeneralRenderOperationstructure
- WFT_RENDER_OPERATION
- };
- enumWorldFragmentType{
- ///Returnnoworldgeometryhitsatall
- WFT_NONE,
- ///Returnpointerstoconvexplane-boundedregions
- WFT_PLANE_BOUNDED_REGION,
- ///Returnasingleintersectionpoint(typicallyRaySceneQueryonly)
- WFT_SINGLE_INTERSECTION,
- ///CustomgeometryasdefinedbytheSceneManager
- WFT_CUSTOM_GEOMETRY,
- ///GeneralRenderOperationstructure
- WFT_RENDER_OPERATION
- };
这里的类对应不同查询类型的返回结果。
WFT_PLANE_BOUNDED_REGION对应查询类型中的区域查询;WFT_SINGLE_INTERSECTION对应求交查询;WFT_CUSTOM_GEOMETRY则是用户自定义的类型。
SceneQuery类的成员函数全是成员变量的getter/setter,都是虚函数。
(2)SceneQueryListener/RaySceneQueryListener/IntersectionSceneQueryListener
抽象类,负责场景查询时回调。
协作过程是将相应的Listener传入场景查询类,在查询类中完成回调。(一般查询类自身都继承Listener,所以在查询类中的执行函数execute也提供将自己作为Listener参数进行传递的重载)
这3个Listener分别对应三种查询:区域、光线、求交。其实这3个类提供的接口名称是一样的。
以SceneQueryListener为例:
- /**CalledwhenaMovableObjectisreturnedbyaquery.*/
- virtualboolqueryResult(MovableObject*object)=0;
- /**CalledwhenaWorldFragmentisreturnedbyaquery.*/
- virtualboolqueryResult(SceneQuery::WorldFragment*fragment)=0;
- /**CalledwhenaMovableObjectisreturnedbyaquery.*/
- virtualboolqueryResult(MovableObject*object)=0;
- /**CalledwhenaWorldFragmentisreturnedbyaquery.*/
- virtualboolqueryResult(SceneQuery::WorldFragment*fragment)=0;
提供两个接口分别对应的就是两种不同的查询结果:可移动的物体元素和世界信息。
分别对三种查询提供三种Listener的原因是后两种需要一些附加的信息。RaySceneQueryListener需要返回Ray上的距离信息;IntersectionSceneQueryListener则是以相交的成对场景元素返回。
(3)SceneQueryResult/RaySceneQueryResultEntry/IntersectionSceneQueryResult
结构体,用来作为查询结果返回。以SceneQueryResult为例:
- ///Listofmovableobjectsinthequery(entities,particlesystemsetc)
- SceneQueryResultMovableListmovables;
- ///Listofworldfragments
- SceneQueryResultWorldFragmentListworldFragments;
- ///Listofmovableobjectsinthequery(entities,particlesystemsetc)
- SceneQueryResultMovableListmovables;
- ///Listofworldfragments
- SceneQueryResultWorldFragmentListworldFragments;
如前多次所述,所有的查询结果都分为两类:可移动的物体元素和世界信息。
分别对应三种查询提供三种结果结构,理由和Listener一样。
(4)RegionSceneQuery/RaySceneQuery/IntersectionSceneQuery
抽象类,继承自相应的SceneQuery和Listener类。该类主要有两个作用:保存查询结果、提供外部执行查询的接口。
以RegionSceneQuery为例:
它所对应的查询结果是SceneQueryResult,成员变量也就仅此一个。
- SceneQueryResult*mLastResult;
- SceneQueryResult*mLastResult;
最重要的两个执行函数就是
- /**Executesthequery,returningtheresultsbackinonelist.*/
- virtualSceneQueryResult&execute(void);
- /**Executesthequeryandreturnseachmatchthroughalistenerinterface.*/
- virtualvoidexecute(SceneQueryListener*listener)=0;
- /**Executesthequery,returningtheresultsbackinonelist.*/
- virtualSceneQueryResult&execute(void);
- /**Executesthequeryandreturnseachmatchthroughalistenerinterface.*/
- virtualvoidexecute(SceneQueryListener*listener)=0;
这才是真正做查询的接口。
第二个execute函数一般会将查询类自身作为参数传入(因为查询类继承自Listener)。无参数的exectue函数通常会调用有参数的execute重载版本。
RegionSceneQuery还分别派生了AxisAlignedBoxSceneQuery/SphereSceneQuery/PlaneBoundedVolumeListSceneQuery。
这三个类中还会保存有相应的区域结构(如AAB就存有一个AxisAlignedBox类等),用来设定相应的区域。
作为一个3D绘制引擎,3D场景的管理至关重要。最近在看这部分的源码,发现内容很多,打算从简单入手,逐一击破。
本文就来解读下场景查询SceneQuery。
相关头文件是OgreSceneQuery.h
先附上该类的UML图
Ogre中将场景查询做成了一个单独的类,提供给SceneManager做相应的查询。
从UML图中可以看到,场景查询的基类是SceneQuery。它有三个直接子类,也就是Ogre直接的查询方式:区域查询、光线查询和求交查询。每种查询都有相应的查询结果结构,结果信息一般分为两类:objects和world geometry。前者是场景中可移动的物体元素(MovableObject),后者是世界信息(复杂场景中的地形等不变的元素)。由于场景管理方式可以不同(八叉树、BSP),所以同种查询在不同的场景管理器下,得到的结果也是不一样的。
(1)SceneQuery
该类成员变量如下:
- SceneManager*mParentSceneMgr;
- uint32mQueryMask;
- uint32mQueryTypeMask;
- set<WorldFragmentType>::typemSupportedWorldFragments;
- WorldFragmentTypemWorldFragmentType;
- SceneManager*mParentSceneMgr;
- uint32mQueryMask;
- uint32mQueryTypeMask;
- set<WorldFragmentType>::typemSupportedWorldFragments;
- WorldFragmentTypemWorldFragmentType;
mParentSceneMgr用来指向当前使用该查询的场景管理器。
mQueryMask/mQueryTypeMask是一个32位掩码,用来过滤查询结果。前者对应单一场景元素,后者对应一类场景元素。
mSupportedWorldFragments表示该查询类支持的世界信息查询。
mWorldFragmentType表示当前世界信息的查询类型。
WorldFragmentType是一个枚举。
- enumWorldFragmentType{
- ///Returnnoworldgeometryhitsatall
- WFT_NONE,
- ///Returnpointerstoconvexplane-boundedregions
- WFT_PLANE_BOUNDED_REGION,
- ///Returnasingleintersectionpoint(typicallyRaySceneQueryonly)
- WFT_SINGLE_INTERSECTION,
- ///CustomgeometryasdefinedbytheSceneManager
- WFT_CUSTOM_GEOMETRY,
- ///GeneralRenderOperationstructure
- WFT_RENDER_OPERATION
- };
- enumWorldFragmentType{
- ///Returnnoworldgeometryhitsatall
- WFT_NONE,
- ///Returnpointerstoconvexplane-boundedregions
- WFT_PLANE_BOUNDED_REGION,
- ///Returnasingleintersectionpoint(typicallyRaySceneQueryonly)
- WFT_SINGLE_INTERSECTION,
- ///CustomgeometryasdefinedbytheSceneManager
- WFT_CUSTOM_GEOMETRY,
- ///GeneralRenderOperationstructure
- WFT_RENDER_OPERATION
- };
这里的类对应不同查询类型的返回结果。
WFT_PLANE_BOUNDED_REGION对应查询类型中的区域查询;WFT_SINGLE_INTERSECTION对应求交查询;WFT_CUSTOM_GEOMETRY则是用户自定义的类型。
SceneQuery类的成员函数全是成员变量的getter/setter,都是虚函数。
(2)SceneQueryListener/RaySceneQueryListener/IntersectionSceneQueryListener
抽象类,负责场景查询时回调。
协作过程是将相应的Listener传入场景查询类,在查询类中完成回调。(一般查询类自身都继承Listener,所以在查询类中的执行函数execute也提供将自己作为Listener参数进行传递的重载)
这3个Listener分别对应三种查询:区域、光线、求交。其实这3个类提供的接口名称是一样的。
以SceneQueryListener为例:
- /**CalledwhenaMovableObjectisreturnedbyaquery.*/
- virtualboolqueryResult(MovableObject*object)=0;
- /**CalledwhenaWorldFragmentisreturnedbyaquery.*/
- virtualboolqueryResult(SceneQuery::WorldFragment*fragment)=0;
- /**CalledwhenaMovableObjectisreturnedbyaquery.*/
- virtualboolqueryResult(MovableObject*object)=0;
- /**CalledwhenaWorldFragmentisreturnedbyaquery.*/
- virtualboolqueryResult(SceneQuery::WorldFragment*fragment)=0;
提供两个接口分别对应的就是两种不同的查询结果:可移动的物体元素和世界信息。
分别对三种查询提供三种Listener的原因是后两种需要一些附加的信息。RaySceneQueryListener需要返回Ray上的距离信息;IntersectionSceneQueryListener则是以相交的成对场景元素返回。
(3)SceneQueryResult/RaySceneQueryResultEntry/IntersectionSceneQueryResult
结构体,用来作为查询结果返回。以SceneQueryResult为例:
- ///Listofmovableobjectsinthequery(entities,particlesystemsetc)
- SceneQueryResultMovableListmovables;
- ///Listofworldfragments
- SceneQueryResultWorldFragmentListworldFragments;
- ///Listofmovableobjectsinthequery(entities,particlesystemsetc)
- SceneQueryResultMovableListmovables;
- ///Listofworldfragments
- SceneQueryResultWorldFragmentListworldFragments;
如前多次所述,所有的查询结果都分为两类:可移动的物体元素和世界信息。
分别对应三种查询提供三种结果结构,理由和Listener一样。
(4)RegionSceneQuery/RaySceneQuery/IntersectionSceneQuery
抽象类,继承自相应的SceneQuery和Listener类。该类主要有两个作用:保存查询结果、提供外部执行查询的接口。
以RegionSceneQuery为例:
它所对应的查询结果是SceneQueryResult,成员变量也就仅此一个。
- SceneQueryResult*mLastResult;
- SceneQueryResult*mLastResult;
最重要的两个执行函数就是
- /**Executesthequery,returningtheresultsbackinonelist.*/
- virtualSceneQueryResult&execute(void);
- /**Executesthequeryandreturnseachmatchthroughalistenerinterface.*/
- virtualvoidexecute(SceneQueryListener*listener)=0;
- /**Executesthequery,returningtheresultsbackinonelist.*/
- virtualSceneQueryResult&execute(void);
- /**Executesthequeryandreturnseachmatchthroughalistenerinterface.*/
- virtualvoidexecute(SceneQueryListener*listener)=0;
这才是真正做查询的接口。
第二个execute函数一般会将查询类自身作为参数传入(因为查询类继承自Listener)。无参数的exectue函数通常会调用有参数的execute重载版本。
RegionSceneQuery还分别派生了AxisAlignedBoxSceneQuery/SphereSceneQuery/PlaneBoundedVolumeListSceneQuery。
这三个类中还会保存有相应的区域结构(如AAB就存有一个AxisAlignedBox类等),用来设定相应的区域。
相关推荐
对Ogre引擎的源码进行分析,从消息,文件,数据,场景渲染等方面进行了详细的介绍。
ogre 引擎源码 (一)
ogre 引擎源码 (二)
OGRE源码分析 对引擎中的主要类进行分析
基于Ogre引擎的射击单机游戏。游戏设置了难度选择,多关卡,多种怪物类型,多种子弹切换。利用CEGUI做用户界面,Lua做伤害计算。游戏很大程度是解决的是框架问题,对游戏关卡和怪物的修改只需要配置相应的文件即可,...
ogre开发的简单场景查看器源码 xgEditor
Ogre游戏程序 源码......................
本教程由本人自己整理,内容来自网络各个角落。 内部包含7个文档和一个问题 里面有描述游戏大概架构的文档以及OGER引擎的文档
ogre场景组织分析.pdf OGRE的消息机制.pdf Ogre的渲染系统(Rendering System).pdf OGRE分析之场景管理.pdf OGRE分析之场景渲染.pdf OGRE分析之设计模式(1234).pdf OGRE分析之文件系统(1234).pdf ogre数据文件...
基于Ogre的射击单机游戏。游戏设计了难度选择,多关卡,多种怪物形态,多种子弹切换。...由于上传限制,将文件分开上传,有另外两个文件基于Ogre引擎的射击游戏源代码和基于Ogre引擎的射击游戏Media
Ogre引擎分析,帮助您更加深入的了解Ogre3D图形渲染引擎,无论您是刚接触Ogre还是已经对Ogre很熟悉,都值得一看。
OGRE引擎课件ppt OGRE引擎课件ppt
对Ogre引擎的源码进行分析,对OGRE设计模式,消息,文件,材质,数据文件结构,场景,渲染等方面进行了介绍。
基于Ogre的射击单机游戏。加入了难度选择,多关卡设计,多种形态怪物,多种子弹切换。...因为上传限制,本人将文件分开上传,还有另外两个文件,分别是基于Ogre引擎的射击游戏bin和基于Ogre引擎的射击游戏media。
Ogre引擎 教你快速掌握基本框架,满足你的编程欲望,真的很有用,很快,希望能够帮助到你 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
适合初学者 大家快快下吧 好不容易才找到的
ogre 1.7.1 2010年最新四月底源码,喜欢游戏编程的可以看看。
详细分析了ogre的源码,对里面的函数进行了系统的讲解,是ogre初学者不可多得的好资料,欢迎下载!
Ogre引擎分析,OgreRenderingSystem分析
可运行的OGRE完整游戏,包括运行所需资源,源代码,工程文件,编译完成即可运行。共6卷