八叉树(Octree)

摘要:
八叉树是一种用于描述三维空间的树状数据结构。因此,八叉树就是用在3D空间中的场景管理,可以很快地知道物体在3D场景中的位置,或侦测与其它物体是否有碰撞以及是否在可视范围内。VREP软件中可以在场景里创建八叉树,通常用于简化表达复杂的形体或点云。注意探测只会在探测区域内进行,所以注意设置传感器的属性。

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

八叉树(Octree)第1张

VREP软件中可以在场景里创建八叉树(Add→Octree),通常用于简化表达复杂的形体或点云。An octree is anobjectthat 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 forshapesorpoint clouds, or can act as an occupancy grid/space:

Octrees arecollidable,measurableanddetectable objects. This means that octrees:

  • can be used incollision detectionswith other collidable objects.
  • can be used inminimum distance calculationswith other measurable objects.
  • can be detected byproximity sensors.

八叉树(Octree)第2张

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

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

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

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

八叉树(Octree)第6张

参考:

Octree—Wikipedia

Introduction to Octrees

Quadtrees and Octrees

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

免责声明:文章转载自《八叉树(Octree)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇openwrt的默认/etc/config/network文件是如何生成的?三、K3 Cloud 开发插件《K3 Cloud插件开发新手指导 + K3 Cloud插件开发代码调试》下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Spring通过MimeMessageHelper发送邮件,中文附件名出现乱码解决办法

1.设置系统值system。setProperty(“mail.mime.split-longparameters”,“false”);2.在这里,定义创建对象时的编码格式(utf-8):MimeMessageHelper=newMimeMessageHelper(mes,true,“utf-8”);3.其次,添加附件时,附件名称为helper。需要定义代码...

如何开发一款浏览器[转]

另一个问题是“开发浏览器有什么困难?”,范围不限于PC或移动浏览器。从这个角度来看,开发浏览器并不容易。有很多种类的知识和困难需要处理,但如此多的努力将得到相应的回报。InfoQ的读者们,您是否也考虑过开发浏览器?你对如何开发浏览器有什么看法?...

k8s集群上删除pod及service

删除k8s集群中的pod:找到pod的名称空间,并根据名称空间删除pod1。首先删除pod2,然后删除相应的部署。否则,删除pod是无用的。您还将看到pod,因为deployment.yaml文件中定义的副本数如下:delete the pod[root@test2~]#kubectlgetpod-njenkinsNAMEREADYSTATUSRESTART...

Docker Compose 版本过高(Docker版本不匹配),降低docker-compose版本

好了,开始降级docker-compose,先卸载:#pipuninstalldocker-compose再安装指定版本:#pipinstalldocker-compose==1.5.2至此,docker-compose降版本成功!...

nginx做本地目录映射

nginx做本地目录映射有时候需要访问服务器上的一些静态资源,比如挂载其他设备上的图片到本地的目录,而本地的目录不在nginx根目录下,这个时候就需要简单的做一下目录映射来解决,比如想通过浏览器http://ip/image/2016/04/29/10/abc.jpg访问到系统目录/image_data/2016/04/29/10/abc.jpg需要在ngi...

Shell学习(五)Shell输出命令

“#-e启用转义echo”Itisatest“#输出:#正常!...