八叉树(Octree)是一种用于描述三维空间的树状数据结构。想象一个立方体,我们最少可以切成多少个相同等分的小立方体?答案就是8个。再想象我们有一个房间,房间里某个角落藏着一枚金币,我们想很快的把金币找出来,怎么找最高效?我们可以把房间当成一个立方体,先切成八个小立方体,然后排除掉没有放任何东西的小立方体,再把有可能藏金币的小立方体继续切八等份….如此下去,平均在Log8(房间内的所有物品数)的时间内就可找到金币。因此,八叉树就是用在3D空间中的场景管理,可以很快地知道物体在3D场景中的位置,或侦测与其它物体是否有碰撞以及是否在可视范围内。

  VREP软件中可以在场景里创建八叉树(Add→Octree),通常用于简化表达复杂的形体或点云。An octree is an object that represents a spacial partitioning. It is made up by a tree data structure in which each node has exactly eight children. Occupied leaf nodes are represented as voxels. Octrees can be used to offer a simplified representation for shapes or point clouds, or can act as an occupancy grid/space:

  Octrees are collidable, measurable and detectable objects. This means that octrees:

  • can be used in collision detections with other collidable objects.
  • can be used in minimum distance calculations with other measurable objects.
  • can be detected by proximity sensors.

  函数simInsertVoxelsIntoOctree可以向八叉树中插入Voxels (三维像素),它是一种基于体积概念的像素,通常的普通像素只需要X、Y轴两个坐标来定位它在空间中的方位,而它还需要加进一个额外的Z轴坐标,相当于空间中一个非常小的立方体。

simInsertVoxelsIntoOctree(number octreeHandle,number options,table points,table color=nil,table tag=nil)

  下面代码通过Octree创建了一个简单的围墙:

if (sim_call_type==sim_childscriptcall_initialization) then

    octree=simGetObjectAssociatedWithScript(sim_handle_self)

    local p = {-, , 0.05}
for i=,, do
color = {*math.random(),*math.random(),*math.random()}
simInsertVoxelsIntoOctree(octree, , {p[],p[]-*i/,p[]}, color, nil)
simInsertVoxelsIntoOctree(octree, , {p[]+*i/,p[],p[]}, color, nil)
simInsertVoxelsIntoOctree(octree, , {p[]+*i/,p[]-,p[]}, color, nil)
simInsertVoxelsIntoOctree(octree, , {p[]+,p[]-*i/,p[]}, color, nil)
end end if (sim_call_type==sim_childscriptcall_cleanup) then -- Put some restoration code here
simRemoveVoxelsFromOctree(octree, , nil) end
  其中两轮差速的机器人BubbleRob通过接近传感器来进行简单的避障行走。感知阶段调用simReadProximitySensor来获取接近传感器信息,如果检测到障碍物result返回1,没有检测到障碍物返回0,出错返回-1。同时计算传感器到障碍物的最小距离,结果保存在distance中。注意探测只会在探测区域(Detection Volume)内进行,所以注意设置传感器的属性(探测体形状、探测距离、角度等)。
number result,number distance = simReadProximitySensor(number sensorHandle)

参考:

Octree—Wikipedia

Quadtrees and Octrees

游戏场景管理的八叉树算法是怎样的?

八叉树(Octree)的更多相关文章

  1. 基于octree的空间划分及搜索操作

    (1)  octree是一种用于管理稀疏3D数据的树形数据结构,每个内部节点都正好有八个子节点,介绍如何用octree在点云数据中进行空间划分及近邻搜索,实现“体素内近邻搜索(Neighbors wi ...

  2. PCL库简要说明

    PCL(PointCloudLibrary)是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取.滤波.分割.配准.检索. ...

  3. 游戏引擎架构 (Jason Gregory 著)

    第一部分 基础 第1章 导论 (已看) 第2章 专业工具 (已看) 第3章 游戏软件工程基础 (已看) 第4章 游戏所需的三维数学 (已看) 第二部分 低阶引擎系统 第5章 游戏支持系统 (已看) 第 ...

  4. PCL

    PCL(PointCloudLibrary)——是一个的模块化的现代C++模板库. 其基于以下第三方库:Boost.Eigen.FLANN.VTK.CUDA.OpenNI.Qhull,实现点云相关的获 ...

  5. CloudCompare 的简单的使用说明

    来自:https://blog.csdn.net/datase/article/details/79797795 File open:打开 save:保存 Global Shift settings: ...

  6. 图形学3D渲染管线学习

    图形学3D渲染管线 DX和OpenGL左右手坐标系不同,会有一些差距,得出的矩阵会不一样; OpenGL的投影平面不是视景体的近截面: 顶点(vertexs) 顶点坐标,颜色,法线,纹理坐标(UV), ...

  7. 八叉树(Octree)Typescript 实现

    Demo GitHub export class Octree { // 父&子树 private parent_node: any; private children_nodes: Octr ...

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

    上面是我绘制的一张图. 关于八叉树场景管理器主要需要关注两个类,其一是松散八叉树的数据结构Ogre::Octree,其二是八叉树场景管理器Ogre::OctreeSceneManager. 下面摘录图 ...

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

    由于本人的引擎ProjectGaia服务于08年创新杯的游戏项目 – 3D太空游戏,所以理所应当加入Octree(八叉树 – 已经周宁学长发帖介绍过)场景管理器.参考了无数Octree的代码,发现还是 ...

随机推荐

  1. Python 模块 re (Regular Expression)

    使用 Python 模块 re 实现解析小工具   概要 在开发过程中发现,Python 模块 re(Regular Expression)是一个很有价值并且非常强大的文本解析工具,因而想要分享一下此 ...

  2. [转]php-mobile-detect

    转自:http://www.oschina.net/p/php-mobile-detect php-mobile-detect (Mobile_Detect) 是一个 PHP 类,用来通过 User- ...

  3. mysql权限管理命令示例

    mysql权限管理命令示例 grant all privileges on *.* to *.* identified by 'hwalk1'; flush privileges; insert in ...

  4. B. Random Teams(Codeforces Round 273)

    B. Random Teams time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  5. nfd指令的详细说明

    在eterm上执行NFD:SHAPEK/CA*OW指令,返回如下: LN CXR OW RT FBC/TC RBD MIN/MAX TRVDATE R 01 CA 450.00 U U 00D/00D ...

  6. 7.6 服务远程暴露 - 注册服务到zookeeper

    为了安全:服务启动的ip全部使用10.10.10.10 远程服务的暴露总体步骤: 将ref封装为invoker 将invoker转换为exporter 启动netty 注册服务到zookeeper 订 ...

  7. Python Configparser模块读取、写入配置文件

    写代码中需要用到读取配置,最近在写python,记录一下. 如下,假设有这样的配置. [db] db_host=127.0.0.1 db_port=3306 db_user=root db_pass= ...

  8. 服务器主体 "sa" 无法在当前安全上下文下访问数据库 XXX[SQLSTATE 08004] (错误 916). 该步骤失败。

    作业脚本为use XXX go 修改为选择XXX数据库

  9. Android WindowManager实现悬浮窗效果 (一)——与当前Activity绑定

    最近有学生做毕业设计,想使用悬浮窗这种效果,其实很简单,我们可以通过系统服务WindowManager来实现此功能,本章我们来试验一下在当前Activity之上创建一个悬浮的view. 第一步:认识W ...

  10. python2.7 调用 .net的webservice asmx

    首先安装pip install suds 或下载:https://pypi.org/project/suds-jurko/0.6/#files 这个是最新版本 由于不支持python3.6, 所以只能 ...