Ogre bsp场景管理笔记

1.用到的知识点

  如何判断点在平面哪一边? 以及判断aabb盒子在面的哪一边?

   Real Plane::getDistance (const Vector3& rkPoint) const
    {
        return normal.dotProduct(rkPoint) + d;
    }
    //-----------------------------------------------------------------------
    Plane::Side Plane::getSide (const Vector3& rkPoint) const
    {
        Real fDistance = getDistance(rkPoint);

        if ( fDistance < 0.0 )
            return Plane::NEGATIVE_SIDE;

        if ( fDistance > 0.0 )
            return Plane::POSITIVE_SIDE;

        return Plane::NO_SIDE;
    }

  Plane::Side Plane::getSide (const Vector3& centre, const Vector3& halfSize) const
  {
    // Calculate the distance between box centre and the plane
    Real dist = getDistance(centre);


    // Calculate the maximise allows absolute distance for
    // the distance between box centre and plane
    Real maxAbsDist = normal.absDotProduct(halfSize);


    if (dist < -maxAbsDist)
      return Plane::NEGATIVE_SIDE;


    if (dist > +maxAbsDist)
      return Plane::POSITIVE_SIDE;


    return Plane::BOTH_SIDE;
  }


2. 如何获取可见节点

  1.获取相机所在的叶子节点

  BspNode* cameraNode = mLevel->findLeaf(camera->getDerivedPosition());

  查找体现出了bsp的特性,根据节点的分割面,定位相机所在的节点

  2.找到相机所在的节点后,根据PVS获取从该节点处可看到节点的。

    portal技术,由于笔者也不会,不做介绍。

3. 总结

  Ogre 的bsp scenemanager 主要是基于quake的bsp。 是基于室内的场景管理, 一个节点相当于一个房间,通过Cluster

  可查到在该房间内可以看到的其它房间。 而通过bsp可以快速查找相机所在的房间。

  以上纯属笔者自己见解,如有错误,欢迎谈讨 :)

  

 

时间: 2024-10-12 04:57:40

Ogre bsp场景管理笔记的相关文章

转:OGRE场景管理器介绍

一个场景代表在虚拟世界中显示的物品.场景可以包括静态几何体(比如地形或者室内),模型(比如树.椅子等),光和摄像机.场景有下面种类.室内场景:可能由走廊.有家具的屋子和挂着装饰品的墙组成.室外场景:可能由山,树木,微微摇动的草地,飘着云彩的天空组成.Ogre提供了一套不同的场景管理器,每一种特别支持某种场景,本文档将列出Ogre提供的场景管理器和它们的优缺点. 1 选择一个场景管理器 2 八叉树场景管理器(Octree Scene Manager) 3 地形场景管理器(Terrain Scene

转:Ogre源码剖析 - 场景管理之Octree

由于本人的引擎ProjectGaia服务于08年创新杯的游戏项目 – 3D太空游戏,所以理所应当加入Octree(八叉树 – 已经周宁学长发帖介绍过)场景管理器.参考了无数Octree的代码,发现还是我们可爱的Ogre写的最好,于是狂看n千行代码,把精髓提取出来给大家共享. 鉴于我们游戏版教程又n久没有更新了,今天发一篇我对Ogre场景管理器之Octree源代码分析的笔记. 所有代码采用伪代码. 首先回顾一下Ogre场景管理的架构 Ogre以插件形式提供了多种场景管理器 1. BSP管理用于支持

转:Ogre的八叉树场景管理器OctreeSceneManager

上面是我绘制的一张图. 关于八叉树场景管理器主要需要关注两个类,其一是松散八叉树的数据结构Ogre::Octree,其二是八叉树场景管理器Ogre::OctreeSceneManager. 下面摘录图片中的文字: 松散八叉树的数据结构. 属性:其中mBox为其包围盒,mHalfSize定义为包围盒大小的一半.mChildren是一个大小为8的静态数组,里面保存了8个Octree指针,由八叉树场景管理器创建,由本类管理.mNodes为挂接到当前八叉树上面的八叉树场景节点,mNumNodes保存了挂

转:场景管理

一.场景管理有很多种方法,如四叉树.八叉树.BSP.模糊K-D树.包围球层次结构等.室内环境主要是BSP为主,从quake3一直延续到现在主流的引擎都是以BSP为基础,BSP使用并不难,关键是数据的生成,这就牵涉到场景编辑器. Quake3.Unreal:BSP,有自己的编辑器. FarCry:场景分为室内和室外两部分,室内场景使用BSP, 室外不清楚但应该跟地形有很大关系,同时为了支持超远距离视距使用了地形Occlusion Culling,另外也可以手动放置OcclusionArea.  

【腾讯GAD暑期训练营游戏程序班】游戏场景管理作业说明文档

场景管理作业说明文档                              用了八叉树的算法,测出三层时最快,区域范围内物体数量为21块,控制台打印出的结果如图所示: 场景物体:游戏中,所有具有空间属性的物体游戏场景:<围棋>二维表<进击的围棋><围棋世界>基于空间分组的场景管理的进一步优化进一步分组四叉树视锥范围剔除非可见区域当前必要场景区域 动态加载谷歌 可感知即存在 不可感知即不存在 场景加载

CoronaSDK场景管理库:Composer library (上)

Composer是corona官方提供的场景创建和管理系统,我大CoronaSDK果然威武! 1 场景者,何也 corona中的每个场景是以一个lua文件的形式出现,多个.lua文件分散在你的项目中组成众多场景.你编写这些lua文件的时候必须遵循一些规则,以便Composer可以正确理解你的场景代码. 场景代码文件中须得包含两样东西,以使得场景可以被正确地初始化: 四个监听函数来处理Composer生成的场景事件 四行监听函数声明以及把场景对象返回的语句 具体的例子呆会可以看后面的场景模版. 因

场景管理

场景管理模块需要同时考虑前台和后台 1.对于副本来说,服务器在副本第一次被进入的时候,启动副本进程,所有进入此副本的角色,都会由这个副本进程管理,服务器端只有一份场景寻路数据,人和人之间关闭阻挡,但是角色和场景之间的保留,此场景里的机关呢?这样就是说,客户端会有一个副本的演进过程,从玩家进入场景开始,一个个机关结点触发,到玩家出场景,此副本结束.对于服务器来说,一个玩家进入,触发了一个机关,那么这个信息是存储到这个玩家身上的,所以每个副本都会为进来的每个角色分配数据对象.必然会出现多人同时触发一

CoronaSDK场景管理库:Composer library (下)

1 覆层场景 composer允许你拥有一个覆层场景.(在任何时刻,只能有一个覆层场景被显示)这是一种特殊的场景,可以加载之后覆盖在活动场景(父场景)之上.一个覆层场景的结构,和其他composer场景并无二致. 1.1 显示一个覆层场景 为了显示一个覆层场景,需要调用函数composer.showOverlay().因为一个覆层场景一般不会覆盖住整个场景,用户可能随时和底下的父场景发生交互.如果你想阻止用户和父场景交互的话,那么可以把option中的isModal参数设置为true.这样做就可

转:场景管理--BSP

对于一个3D引擎来说,最核心的部分应该算是场景组织(scene graph)了,如果这部分你都没有设计好, 那么就别指望开发一个成熟的3D引擎了.为了开发3d引擎,所以我首先就研究这方面的内容,对一个3D的场景来说,又很多的物体,最简单的组织方法就是把他们用一个List连接起来,然后在绘制没一帧的时候依次送入渲染器(render)进行处理. 这显然不是一个很有效的方法,当处理一个普通的游戏场景都会显得非常慢的.实际上虽然一个场景中的物品很多,但是通常可见的指是以小部分,如何能够用很小的计算代价排