服务器3D场景建模(七):四叉树的邻居关系
实测,经典四叉树效率比本中所述效率高!因此本文请无视之
四叉树的邻居节点?
常见的AOI使用Tile为基础,来实现。
每个Tile周围有8个邻居。因此在游戏对象移动或AOI时,可以O(1)的时间复杂度,定位8个邻居Tile。
而经典的四叉树代码实现,是没有邻居节点概念的。
图1,A节点的邻居节点:
A节点有B、C、D、E、F、G邻居节点。
经典的四叉树代码实现,是需要从根节点开始遍历,才能够访问到邻居节点E、F、G。
图2,某AOI操作:
红色区域的AOI,经典四叉树实现上,从根节点宽度优先遍历,按红色区域是否与节点区域有相交或包含作为条件,遍历之。时间复杂度为O(logN)
。
如果A节点知道自己的邻居节点,那么可以O(1)
的时间复杂度,完成需要处理的节点定位。
有邻居关系的四叉树的AOI操作
图3,A上的红色区域的AOI:
只要遍历A节点及其所有邻居节点,按红色区域是否与节点区域有相交或包含作为条件,遍历之;A的每个邻居节点递归重复操作。
以上操作与Tile上的AOI操作是同时间复杂度的。且比经典四叉树实现高效。
如何创建四叉树的邻居关系
图4,若N节点已经知道自己的邻居关系:
图5,那么N节点分裂时,只要维护下孩子节点与邻居节点的关系即可:
- L为N节点的邻居节点列表
- 遍历L,删除邻居节点对N的邻居信息
- N节点变成非叶节点,不再需要邻居信息,删除这些信息之
- N节点分裂为A、B、C、D4个孩子节点
- 对每个孩子节点,遍历L,根据节点区域是否相邻,构建孩子节点与L列表中节点的邻居信息
以上。
3种AOI对比
前提假设:游戏对象间有碰撞
算法 | 占用内存 | Add | Leave | Move | AOI | 说明 |
---|---|---|---|---|---|---|
Tile算法 | O(W∗H) O ( W ∗ H ) O(W*H) | O(1) O ( 1 ) O(1) | O(1) O ( 1 ) O(1) | O(T) O ( T ) O(T) | O(T) O ( T ) O(T) |
2维数组。 第1维表达所有Tile; 第2维表达每个Tile上的游戏对象列表 |
QuadTree算法 | O(N) O ( N ) O(N) | O(logN) O ( l o g N ) O(logN) | O(1) O ( 1 ) O(1) |
通常 O(L) O ( L ) O(L); 跨边界 O(logN)+O(L) O ( l o g N ) + O ( L ) O(logN)+O(L) |
O(logN)+O(L) O ( l o g N ) + O ( L ) O(logN) + O(L) |
四叉树。 叶子节点上有游戏对象列表; 叶子节点游戏对象超过指定数量限制,则分裂子节点 叶子节点有游戏对象Leave,可能触发4兄弟节点合并 节点边界上的游戏对象放在父节点上 AOI从Root节点开始做广度遍历 |
QuadTree带邻居关系 | O(N) O ( N ) O(N) | O(logN) O ( l o g N ) O(logN) | O(1) O ( 1 ) O(1) | O(L) O ( L ) O(L) | O(L) O ( L ) O(L) |
四叉树并带有邻居关系。 叶子节点上有游戏对象列表,邻居列表; 叶子节点游戏对象超过指定数量限制,则分裂子节点 叶子节点有游戏对象Leave,可能触发4兄弟节点合并 AOI从始发叶子节点开始,遍历邻居节点 |
上图,
- N为游戏对象数量。
- W为地图宽
- H为地图长
- T为Tile上能容纳的游戏对象数量
- L为叶子节点区域能容纳的游戏对象数量
可以看出,理论上,地图越大,QuadTree优势越明显。
对于QuadTree带邻居关系,还忽略了一个重要问题,就是 非平衡数的邻居数量问题
非平衡数的邻居数量问题
比如下图中,在极端情况,F节点及其子节点持续分裂,一直分裂到4单位长宽大小的区域,才停止分裂(不好画自己想象)
则E节点会有很多邻居。
如果是1024*1024的地图,则E节点会有128个邻居;如果是8192*8192的地图,则E节点会有1024个邻居。
因此,算法中,要对这种情况做特殊处理。
比如,如果E节点邻居数超过8个,则这里的AOI处理,使用经典四叉树算法。
服务器3D场景建模(七):四叉树的邻居关系相关推荐
- 服务器3D场景建模(二):Physx与PVD
建模思路 目前流行的几大物理引擎库均可以用来做服务器端的3D场景建模. 这里选择使用physx.因为untiy3d内置的物理引擎也是physx.减少学习沟通成本. 通常服务器3D场景建模的运作方式有种 ...
- 服务器3D场景建模(九):RecastNavigation之Detour数据结构
dtNavMesh dtNavMesh是Detour中表达3D场景的数据结构. 作者给的注释为: /// A navigation mesh based on tiles of convex poly ...
- 服务器3D场景建模(六):RecastNavigation介绍
RecastNavigation RecastNavigation是一款非常强大的寻路系统,被广泛的应用于各大游戏引擎中.如Unreal, Unity等. github网址:https://githu ...
- 服务器3D场景建模(一):PyOpenGL
测试环境搭建 方便服务器端做3D建模,需要一些测试方法. 目前比较流行的是Untiy3D做客户端开发.考虑到Untiy3D比较重,服务器端辅助测试3D建模的,一般需要比较轻便的方式. 所以首选使用的是 ...
- 游戏行业中3D设计都有哪些职位?3D场景建模该如何学习?
游戏行业中的3D美术设计呢,分为场景设计,以及角色设计. 3D场景建模师 场景则是游戏中的环境.机械.道具等死物.场景开始对美术的要求没有那么高,只要熟练运用3D软件就行了. 逐步掌握游戏场景元素设计 ...
- 有哪些知识是学习3D场景建模必备的?
1.场景建模的知识点 视角范围:视角范围是玩家在游戏中所能看到的游戏场景的范围,视角是随着玩家的移动不停变换的,基于这点才有了场景分块的必要性. 场景分块:在游戏中不管你的视角在哪个位置,可能你的视角 ...
- 入门3D游戏建模,是选择角色建模还是场景建模,看完你来选
3D场景建模师 场景则是游戏中的环境.机械.道具等死物.场景开始对美术的要求没有那么高,只要熟练运用3D软件就行了. 逐步掌握游戏场景元素设计理念,不同风格游戏的制作方法.着重学习材质处理技法,能够根 ...
- 3D游戏建模是吃青春饭的吗? 3d建模薪资多少
一 本文总序 关于3D建模,尤其是3D游戏建模这一块,我将会系统的从以下九个方面谈一下. 包括:谈实力,谈学习,谈时间,谈青春,谈难易,谈职位,谈工资,谈行业,谈选择.希望能够解决大家思想上困扰,对未 ...
- 想知道3D游戏建模师每天都在做什么吗?3D游戏建模的那些事
想知道3D游戏建模师每天都在做什么吗?3D游戏建模的那些事 1.建模师的主要工作? 在游戏公司里,游戏建模主要分为3D场景建模和3D角色建模. 3D场景师的工作是根据原画设定及策划要求制作符合要求的3 ...
- 全套3D游戏建模自学资料
建模通俗来说,就是将一个抽象.扁平化的东西立体化.具象化.举个例子,你在草稿上画了一个动漫人物,然后我将你这张画在三维软件里做出来,让它呈现出360°可观察的真实立体视角,也就是将二维转化为三维. 3 ...
最新文章
- js 动态校验开始结束时间
- Android调试的必杀技——反汇编
- java comet_用java实现comet,基于 HTTP长连接的实现,用于从服务端实时发送信息到客户端...
- java教务系统类设计_基于Java EE体系的高校教务管理系统的设计开发
- android注册广播监听按钮,Android实现广播监听HOME键操作
- Proteus仿真单片机:51单片机的仿真
- foxitreadersdk 打开远程文件_一种最不为人知最简单最方便的用电脑操作手机上的文件...
- 性能优化挑战重重,鲲鹏 HPC 如何突破算力桎梏?
- rmmod不能卸载驱动
- C#使用Google翻译实现在线翻译
- 数据库系统原理——实验一
- linux读usb蓝牙数据,嵌入式Linux下USB蓝牙设备驱动.pdf
- TimusOJ - 1225.Flags 1119.Metr 1009.K-based Numbers (DP简单题)
- j计算机屏幕关闭时间,win7如何设置自动关闭电脑屏幕的时间?
- 4只鸭子在同一个圆圈内游泳,问:4只鸭子出现在同一个半圆内的概率是多少?Python模拟
- 分布式计算、云计算与大数据
- Python 1-10 字符串操作
- python实现外星人入侵——3.事件分析
- 深度挖掘:FIashGet下载隐藏链接[转]
- 商家如何更改拼多多上货助手价格?上货助手修改价格详细步骤