`
chinamming
  • 浏览: 139094 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Ogre引擎源码——场景查询

 
阅读更多

http://blog.csdn.net/hunter8777/article/details/6249630

作为一个3D绘制引擎,3D场景的管理至关重要。最近在看这部分的源码,发现内容很多,打算从简单入手,逐一击破。

本文就来解读下场景查询SceneQuery。

相关头文件是OgreSceneQuery.h

先附上该类的UML图

SceneQuery

Ogre中将场景查询做成了一个单独的类,提供给SceneManager做相应的查询。

从UML图中可以看到,场景查询的基类是SceneQuery。它有三个直接子类,也就是Ogre直接的查询方式:区域查询、光线查询和求交查询。每种查询都有相应的查询结果结构,结果信息一般分为两类:objects和world geometry。前者是场景中可移动的物体元素(MovableObject),后者是世界信息(复杂场景中的地形等不变的元素)。由于场景管理方式可以不同(八叉树、BSP),所以同种查询在不同的场景管理器下,得到的结果也是不一样的。

(1)SceneQuery

该类成员变量如下:

  1. SceneManager*mParentSceneMgr;
  2. uint32mQueryMask;
  3. uint32mQueryTypeMask;
  4. set<WorldFragmentType>::typemSupportedWorldFragments;
  5. WorldFragmentTypemWorldFragmentType;
  1. SceneManager*mParentSceneMgr;
  2. uint32mQueryMask;
  3. uint32mQueryTypeMask;
  4. set<WorldFragmentType>::typemSupportedWorldFragments;
  5. WorldFragmentTypemWorldFragmentType;

mParentSceneMgr用来指向当前使用该查询的场景管理器。

mQueryMask/mQueryTypeMask是一个32位掩码,用来过滤查询结果。前者对应单一场景元素,后者对应一类场景元素。

mSupportedWorldFragments表示该查询类支持的世界信息查询。

mWorldFragmentType表示当前世界信息的查询类型。

WorldFragmentType是一个枚举。

  1. enumWorldFragmentType{
  2. ///Returnnoworldgeometryhitsatall
  3. WFT_NONE,
  4. ///Returnpointerstoconvexplane-boundedregions
  5. WFT_PLANE_BOUNDED_REGION,
  6. ///Returnasingleintersectionpoint(typicallyRaySceneQueryonly)
  7. WFT_SINGLE_INTERSECTION,
  8. ///CustomgeometryasdefinedbytheSceneManager
  9. WFT_CUSTOM_GEOMETRY,
  10. ///GeneralRenderOperationstructure
  11. WFT_RENDER_OPERATION
  12. };
  1. enumWorldFragmentType{
  2. ///Returnnoworldgeometryhitsatall
  3. WFT_NONE,
  4. ///Returnpointerstoconvexplane-boundedregions
  5. WFT_PLANE_BOUNDED_REGION,
  6. ///Returnasingleintersectionpoint(typicallyRaySceneQueryonly)
  7. WFT_SINGLE_INTERSECTION,
  8. ///CustomgeometryasdefinedbytheSceneManager
  9. WFT_CUSTOM_GEOMETRY,
  10. ///GeneralRenderOperationstructure
  11. WFT_RENDER_OPERATION
  12. };

这里的类对应不同查询类型的返回结果。

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为例:

  1. /**CalledwhenaMovableObjectisreturnedbyaquery.*/
  2. virtualboolqueryResult(MovableObject*object)=0;
  3. /**CalledwhenaWorldFragmentisreturnedbyaquery.*/
  4. virtualboolqueryResult(SceneQuery::WorldFragment*fragment)=0;
  1. /**CalledwhenaMovableObjectisreturnedbyaquery.*/
  2. virtualboolqueryResult(MovableObject*object)=0;
  3. /**CalledwhenaWorldFragmentisreturnedbyaquery.*/
  4. virtualboolqueryResult(SceneQuery::WorldFragment*fragment)=0;

提供两个接口分别对应的就是两种不同的查询结果:可移动的物体元素和世界信息。

分别对三种查询提供三种Listener的原因是后两种需要一些附加的信息。RaySceneQueryListener需要返回Ray上的距离信息;IntersectionSceneQueryListener则是以相交的成对场景元素返回。

(3)SceneQueryResult/RaySceneQueryResultEntry/IntersectionSceneQueryResult

结构体,用来作为查询结果返回。以SceneQueryResult为例:

  1. ///Listofmovableobjectsinthequery(entities,particlesystemsetc)
  2. SceneQueryResultMovableListmovables;
  3. ///Listofworldfragments
  4. SceneQueryResultWorldFragmentListworldFragments;
  1. ///Listofmovableobjectsinthequery(entities,particlesystemsetc)
  2. SceneQueryResultMovableListmovables;
  3. ///Listofworldfragments
  4. SceneQueryResultWorldFragmentListworldFragments;

如前多次所述,所有的查询结果都分为两类:可移动的物体元素和世界信息。

分别对应三种查询提供三种结果结构,理由和Listener一样。

(4)RegionSceneQuery/RaySceneQuery/IntersectionSceneQuery

抽象类,继承自相应的SceneQuery和Listener类。该类主要有两个作用:保存查询结果、提供外部执行查询的接口。

以RegionSceneQuery为例:

它所对应的查询结果是SceneQueryResult,成员变量也就仅此一个。

  1. SceneQueryResult*mLastResult;
  1. SceneQueryResult*mLastResult;

最重要的两个执行函数就是

  1. /**Executesthequery,returningtheresultsbackinonelist.*/
  2. virtualSceneQueryResult&execute(void);
  3. /**Executesthequeryandreturnseachmatchthroughalistenerinterface.*/
  4. virtualvoidexecute(SceneQueryListener*listener)=0;
  1. /**Executesthequery,returningtheresultsbackinonelist.*/
  2. virtualSceneQueryResult&execute(void);
  3. /**Executesthequeryandreturnseachmatchthroughalistenerinterface.*/
  4. 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图

SceneQuery

Ogre中将场景查询做成了一个单独的类,提供给SceneManager做相应的查询。

从UML图中可以看到,场景查询的基类是SceneQuery。它有三个直接子类,也就是Ogre直接的查询方式:区域查询、光线查询和求交查询。每种查询都有相应的查询结果结构,结果信息一般分为两类:objects和world geometry。前者是场景中可移动的物体元素(MovableObject),后者是世界信息(复杂场景中的地形等不变的元素)。由于场景管理方式可以不同(八叉树、BSP),所以同种查询在不同的场景管理器下,得到的结果也是不一样的。

(1)SceneQuery

该类成员变量如下:

  1. SceneManager*mParentSceneMgr;
  2. uint32mQueryMask;
  3. uint32mQueryTypeMask;
  4. set<WorldFragmentType>::typemSupportedWorldFragments;
  5. WorldFragmentTypemWorldFragmentType;
  1. SceneManager*mParentSceneMgr;
  2. uint32mQueryMask;
  3. uint32mQueryTypeMask;
  4. set<WorldFragmentType>::typemSupportedWorldFragments;
  5. WorldFragmentTypemWorldFragmentType;

mParentSceneMgr用来指向当前使用该查询的场景管理器。

mQueryMask/mQueryTypeMask是一个32位掩码,用来过滤查询结果。前者对应单一场景元素,后者对应一类场景元素。

mSupportedWorldFragments表示该查询类支持的世界信息查询。

mWorldFragmentType表示当前世界信息的查询类型。

WorldFragmentType是一个枚举。

  1. enumWorldFragmentType{
  2. ///Returnnoworldgeometryhitsatall
  3. WFT_NONE,
  4. ///Returnpointerstoconvexplane-boundedregions
  5. WFT_PLANE_BOUNDED_REGION,
  6. ///Returnasingleintersectionpoint(typicallyRaySceneQueryonly)
  7. WFT_SINGLE_INTERSECTION,
  8. ///CustomgeometryasdefinedbytheSceneManager
  9. WFT_CUSTOM_GEOMETRY,
  10. ///GeneralRenderOperationstructure
  11. WFT_RENDER_OPERATION
  12. };
  1. enumWorldFragmentType{
  2. ///Returnnoworldgeometryhitsatall
  3. WFT_NONE,
  4. ///Returnpointerstoconvexplane-boundedregions
  5. WFT_PLANE_BOUNDED_REGION,
  6. ///Returnasingleintersectionpoint(typicallyRaySceneQueryonly)
  7. WFT_SINGLE_INTERSECTION,
  8. ///CustomgeometryasdefinedbytheSceneManager
  9. WFT_CUSTOM_GEOMETRY,
  10. ///GeneralRenderOperationstructure
  11. WFT_RENDER_OPERATION
  12. };

这里的类对应不同查询类型的返回结果。

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为例:

  1. /**CalledwhenaMovableObjectisreturnedbyaquery.*/
  2. virtualboolqueryResult(MovableObject*object)=0;
  3. /**CalledwhenaWorldFragmentisreturnedbyaquery.*/
  4. virtualboolqueryResult(SceneQuery::WorldFragment*fragment)=0;
  1. /**CalledwhenaMovableObjectisreturnedbyaquery.*/
  2. virtualboolqueryResult(MovableObject*object)=0;
  3. /**CalledwhenaWorldFragmentisreturnedbyaquery.*/
  4. virtualboolqueryResult(SceneQuery::WorldFragment*fragment)=0;

提供两个接口分别对应的就是两种不同的查询结果:可移动的物体元素和世界信息。

分别对三种查询提供三种Listener的原因是后两种需要一些附加的信息。RaySceneQueryListener需要返回Ray上的距离信息;IntersectionSceneQueryListener则是以相交的成对场景元素返回。

(3)SceneQueryResult/RaySceneQueryResultEntry/IntersectionSceneQueryResult

结构体,用来作为查询结果返回。以SceneQueryResult为例:

  1. ///Listofmovableobjectsinthequery(entities,particlesystemsetc)
  2. SceneQueryResultMovableListmovables;
  3. ///Listofworldfragments
  4. SceneQueryResultWorldFragmentListworldFragments;
  1. ///Listofmovableobjectsinthequery(entities,particlesystemsetc)
  2. SceneQueryResultMovableListmovables;
  3. ///Listofworldfragments
  4. SceneQueryResultWorldFragmentListworldFragments;

如前多次所述,所有的查询结果都分为两类:可移动的物体元素和世界信息。

分别对应三种查询提供三种结果结构,理由和Listener一样。

(4)RegionSceneQuery/RaySceneQuery/IntersectionSceneQuery

抽象类,继承自相应的SceneQuery和Listener类。该类主要有两个作用:保存查询结果、提供外部执行查询的接口。

以RegionSceneQuery为例:

它所对应的查询结果是SceneQueryResult,成员变量也就仅此一个。

  1. SceneQueryResult*mLastResult;
  1. SceneQueryResult*mLastResult;

最重要的两个执行函数就是

  1. /**Executesthequery,returningtheresultsbackinonelist.*/
  2. virtualSceneQueryResult&execute(void);
  3. /**Executesthequeryandreturnseachmatchthroughalistenerinterface.*/
  4. virtualvoidexecute(SceneQueryListener*listener)=0;
  1. /**Executesthequery,returningtheresultsbackinonelist.*/
  2. virtualSceneQueryResult&execute(void);
  3. /**Executesthequeryandreturnseachmatchthroughalistenerinterface.*/
  4. virtualvoidexecute(SceneQueryListener*listener)=0;

这才是真正做查询的接口。

第二个execute函数一般会将查询类自身作为参数传入(因为查询类继承自Listener)。无参数的exectue函数通常会调用有参数的execute重载版本。

RegionSceneQuery还分别派生了AxisAlignedBoxSceneQuery/SphereSceneQuery/PlaneBoundedVolumeListSceneQuery。

这三个类中还会保存有相应的区域结构(如AAB就存有一个AxisAlignedBox类等),用来设定相应的区域。

作为一个3D绘制引擎,3D场景的管理至关重要。最近在看这部分的源码,发现内容很多,打算从简单入手,逐一击破。

本文就来解读下场景查询SceneQuery。

相关头文件是OgreSceneQuery.h

先附上该类的UML图

SceneQuery

Ogre中将场景查询做成了一个单独的类,提供给SceneManager做相应的查询。

从UML图中可以看到,场景查询的基类是SceneQuery。它有三个直接子类,也就是Ogre直接的查询方式:区域查询、光线查询和求交查询。每种查询都有相应的查询结果结构,结果信息一般分为两类:objects和world geometry。前者是场景中可移动的物体元素(MovableObject),后者是世界信息(复杂场景中的地形等不变的元素)。由于场景管理方式可以不同(八叉树、BSP),所以同种查询在不同的场景管理器下,得到的结果也是不一样的。

(1)SceneQuery

该类成员变量如下:

  1. SceneManager*mParentSceneMgr;
  2. uint32mQueryMask;
  3. uint32mQueryTypeMask;
  4. set<WorldFragmentType>::typemSupportedWorldFragments;
  5. WorldFragmentTypemWorldFragmentType;
  1. SceneManager*mParentSceneMgr;
  2. uint32mQueryMask;
  3. uint32mQueryTypeMask;
  4. set<WorldFragmentType>::typemSupportedWorldFragments;
  5. WorldFragmentTypemWorldFragmentType;

mParentSceneMgr用来指向当前使用该查询的场景管理器。

mQueryMask/mQueryTypeMask是一个32位掩码,用来过滤查询结果。前者对应单一场景元素,后者对应一类场景元素。

mSupportedWorldFragments表示该查询类支持的世界信息查询。

mWorldFragmentType表示当前世界信息的查询类型。

WorldFragmentType是一个枚举。

  1. enumWorldFragmentType{
  2. ///Returnnoworldgeometryhitsatall
  3. WFT_NONE,
  4. ///Returnpointerstoconvexplane-boundedregions
  5. WFT_PLANE_BOUNDED_REGION,
  6. ///Returnasingleintersectionpoint(typicallyRaySceneQueryonly)
  7. WFT_SINGLE_INTERSECTION,
  8. ///CustomgeometryasdefinedbytheSceneManager
  9. WFT_CUSTOM_GEOMETRY,
  10. ///GeneralRenderOperationstructure
  11. WFT_RENDER_OPERATION
  12. };
  1. enumWorldFragmentType{
  2. ///Returnnoworldgeometryhitsatall
  3. WFT_NONE,
  4. ///Returnpointerstoconvexplane-boundedregions
  5. WFT_PLANE_BOUNDED_REGION,
  6. ///Returnasingleintersectionpoint(typicallyRaySceneQueryonly)
  7. WFT_SINGLE_INTERSECTION,
  8. ///CustomgeometryasdefinedbytheSceneManager
  9. WFT_CUSTOM_GEOMETRY,
  10. ///GeneralRenderOperationstructure
  11. WFT_RENDER_OPERATION
  12. };

这里的类对应不同查询类型的返回结果。

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为例:

  1. /**CalledwhenaMovableObjectisreturnedbyaquery.*/
  2. virtualboolqueryResult(MovableObject*object)=0;
  3. /**CalledwhenaWorldFragmentisreturnedbyaquery.*/
  4. virtualboolqueryResult(SceneQuery::WorldFragment*fragment)=0;
  1. /**CalledwhenaMovableObjectisreturnedbyaquery.*/
  2. virtualboolqueryResult(MovableObject*object)=0;
  3. /**CalledwhenaWorldFragmentisreturnedbyaquery.*/
  4. virtualboolqueryResult(SceneQuery::WorldFragment*fragment)=0;

提供两个接口分别对应的就是两种不同的查询结果:可移动的物体元素和世界信息。

分别对三种查询提供三种Listener的原因是后两种需要一些附加的信息。RaySceneQueryListener需要返回Ray上的距离信息;IntersectionSceneQueryListener则是以相交的成对场景元素返回。

(3)SceneQueryResult/RaySceneQueryResultEntry/IntersectionSceneQueryResult

结构体,用来作为查询结果返回。以SceneQueryResult为例:

  1. ///Listofmovableobjectsinthequery(entities,particlesystemsetc)
  2. SceneQueryResultMovableListmovables;
  3. ///Listofworldfragments
  4. SceneQueryResultWorldFragmentListworldFragments;
  1. ///Listofmovableobjectsinthequery(entities,particlesystemsetc)
  2. SceneQueryResultMovableListmovables;
  3. ///Listofworldfragments
  4. SceneQueryResultWorldFragmentListworldFragments;

如前多次所述,所有的查询结果都分为两类:可移动的物体元素和世界信息。

分别对应三种查询提供三种结果结构,理由和Listener一样。

(4)RegionSceneQuery/RaySceneQuery/IntersectionSceneQuery

抽象类,继承自相应的SceneQuery和Listener类。该类主要有两个作用:保存查询结果、提供外部执行查询的接口。

以RegionSceneQuery为例:

它所对应的查询结果是SceneQueryResult,成员变量也就仅此一个。

  1. SceneQueryResult*mLastResult;
  1. SceneQueryResult*mLastResult;

最重要的两个执行函数就是

  1. /**Executesthequery,returningtheresultsbackinonelist.*/
  2. virtualSceneQueryResult&execute(void);
  3. /**Executesthequeryandreturnseachmatchthroughalistenerinterface.*/
  4. virtualvoidexecute(SceneQueryListener*listener)=0;
  1. /**Executesthequery,returningtheresultsbackinonelist.*/
  2. virtualSceneQueryResult&execute(void);
  3. /**Executesthequeryandreturnseachmatchthroughalistenerinterface.*/
  4. virtualvoidexecute(SceneQueryListener*listener)=0;

这才是真正做查询的接口。

第二个execute函数一般会将查询类自身作为参数传入(因为查询类继承自Listener)。无参数的exectue函数通常会调用有参数的execute重载版本。

RegionSceneQuery还分别派生了AxisAlignedBoxSceneQuery/SphereSceneQuery/PlaneBoundedVolumeListSceneQuery。

这三个类中还会保存有相应的区域结构(如AAB就存有一个AxisAlignedBox类等),用来设定相应的区域。

分享到:
评论

相关推荐

    Ogre 引擎 源码分析

    对Ogre引擎的源码进行分析,从消息,文件,数据,场景渲染等方面进行了详细的介绍。

    ogre 引擎源码 (一)

    ogre 引擎源码 (一)

    ogre 引擎源码 (二)

    ogre 引擎源码 (二)

    3D渲染引擎OGRE源码分析

    OGRE源码分析 对引擎中的主要类进行分析

    基于Ogre引擎的射击游戏Media

    基于Ogre引擎的射击单机游戏。游戏设置了难度选择,多关卡,多种怪物类型,多种子弹切换。利用CEGUI做用户界面,Lua做伤害计算。游戏很大程度是解决的是框架问题,对游戏关卡和怪物的修改只需要配置相应的文件即可,...

    ogre开发的简单场景查看器源码 xgEditor

    ogre开发的简单场景查看器源码 xgEditor

    Ogre游戏程序 源码

    Ogre游戏程序 源码......................

    Ogre引擎-教程

    本教程由本人自己整理,内容来自网络各个角落。 内部包含7个文档和一个问题 里面有描述游戏大概架构的文档以及OGER引擎的文档

    ogre3D引擎教程

    ogre场景组织分析.pdf OGRE的消息机制.pdf Ogre的渲染系统(Rendering System).pdf OGRE分析之场景管理.pdf OGRE分析之场景渲染.pdf OGRE分析之设计模式(1234).pdf OGRE分析之文件系统(1234).pdf ogre数据文件...

    基于Ogre引擎的射击游戏Bin

    基于Ogre的射击单机游戏。游戏设计了难度选择,多关卡,多种怪物形态,多种子弹切换。...由于上传限制,将文件分开上传,有另外两个文件基于Ogre引擎的射击游戏源代码和基于Ogre引擎的射击游戏Media

    Ogre引擎分析

    Ogre引擎分析,帮助您更加深入的了解Ogre3D图形渲染引擎,无论您是刚接触Ogre还是已经对Ogre很熟悉,都值得一看。

    OGRE引擎课件ppt

    OGRE引擎课件ppt OGRE引擎课件ppt

    OGRE引擎分析汇总

    对Ogre引擎的源码进行分析,对OGRE设计模式,消息,文件,材质,数据文件结构,场景,渲染等方面进行了介绍。

    基于Ogre引擎的射击游戏源代码

    基于Ogre的射击单机游戏。加入了难度选择,多关卡设计,多种形态怪物,多种子弹切换。...因为上传限制,本人将文件分开上传,还有另外两个文件,分别是基于Ogre引擎的射击游戏bin和基于Ogre引擎的射击游戏media。

    ogre引擎

    Ogre引擎 教你快速掌握基本框架,满足你的编程欲望,真的很有用,很快,希望能够帮助到你 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

    OGRE引擎使用指南 PDF

    适合初学者 大家快快下吧 好不容易才找到的

    ogre 1.7.1 最新版源码part1

    ogre 1.7.1 2010年最新四月底源码,喜欢游戏编程的可以看看。

    ogre源码分析与使用指南

    详细分析了ogre的源码,对里面的函数进行了系统的讲解,是ogre初学者不可多得的好资料,欢迎下载!

    Ogre引擎分析,OgreRenderingSystem

    Ogre引擎分析,OgreRenderingSystem分析

    ogre 完整游戏 源代码 02

    可运行的OGRE完整游戏,包括运行所需资源,源代码,工程文件,编译完成即可运行。共6卷

Global site tag (gtag.js) - Google Analytics