[Unity] 八叉树(四叉树、二叉树)场景划分

什么是“八叉树”?


我们先看一幅图:
octree
这上面只看到七个色块(仔细数一数),因为有个色块被覆盖了,所以我们看不到。我们拆分开看看(褐色框选的背面,蓝色的是前面)。

octree_slip
这就是一个八个矩形,我们把这个八个矩形想象成八个节点,用树形结构的方式来概况是这样的,我们看图:

Octree
这就对了,这就是八叉树!再仔细看一看其原理:

在这里插入图片描述
这回应该明白了吧。接着继续下一小节。

场景规划

假设我们有一张1024x1024的地图,那么如果我们在进入游戏的时候,加载会非常耗时。那么怎么规划?我们可以划分区域!看下图(3D场景俯视图,2D一样):
划分
我们可以看到一张1024x1024的地图被划分成四个512x512的小场景,每个512x512小场景用一棵场景树(SceneTree:S1、S2、S3、S4)来表示。这里面每棵树都包含自己的对应的场景组件信息(Object_1…),他们互不干扰。依照上图,故我们需要生成四棵树,这些树统一为八叉树结构。正常逻辑下来后我们通过俯视图将会看到这么一个划分的场景(它看起来像四叉树,但不是四叉树。):
Octree俯视图
绿色的为我视锥体,红黄蓝紫为四个小区域,通过上图,我们可以看到,当我视锥处于某棵树内(红),那么我将会检索这个区域的对象,对其的包围盒再做个是否可视的判断,这样我的粒度会变得很小。

当你在尝试实现这个算法时,你可能会遇到一些疑问:
1、为什么要用八叉树?四叉树可以实现吗?
答案肯定时可以的,四叉树,二叉树都可以,只是划分的粒度不一样而已,当你实现了八叉树,剩下的也就不会太难了(其实透过俯视图,你已经可以把他想象成四叉树或者二叉树了,它们只是少了某一个轴而已。)。

2、当物体处于中线的时候怎么处理?
两种方式:一、包含的节点都缓存这个数据。二、父节点缓存这个数据。(我一般喜欢用方式二。)

3、正交相机可以吗?
既然能在2D上划分场景,那么正交相机自然可行,如上图中,我的视锥体(绿色的)当相机换成正交投影时,它将会是一个矩形,不是视锥体了。

最后说一句,虽然代码中没有实现四叉树、二叉树的划分,但其原理是一样的,可以自行扩展,最后提供下代码路径:场景划分

最后提供下透视视图的视角:
在这里插入图片描述

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值