服务器3D场景建模(七):四叉树的邻居关系

2023-11-09 03:11

本文主要是介绍服务器3D场景建模(七):四叉树的邻居关系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实测,经典四叉树效率比本中所述效率高!因此本文请无视之

四叉树的邻居节点?

常见的AOI使用Tile为基础,来实现。

每个Tile周围有8个邻居。因此在游戏对象移动或AOI时,可以O(1)的时间复杂度,定位8个邻居Tile。

而经典的四叉树代码实现,是没有邻居节点概念的。

图1,A节点的邻居节点:
图1

A节点有B、C、D、E、F、G邻居节点。

经典的四叉树代码实现,是需要从根节点开始遍历,才能够访问到邻居节点E、F、G。

图2,某AOI操作:

图2

红色区域的AOI,经典四叉树实现上,从根节点宽度优先遍历,按红色区域是否与节点区域有相交或包含作为条件,遍历之。时间复杂度为O(logN)

如果A节点知道自己的邻居节点,那么可以O(1)的时间复杂度,完成需要处理的节点定位。

有邻居关系的四叉树的AOI操作

图3,A上的红色区域的AOI:

图3

只要遍历A节点及其所有邻居节点,按红色区域是否与节点区域有相交或包含作为条件,遍历之;A的每个邻居节点递归重复操作。

以上操作与Tile上的AOI操作是同时间复杂度的。且比经典四叉树实现高效。

如何创建四叉树的邻居关系

图4,若N节点已经知道自己的邻居关系:

图4

图5,那么N节点分裂时,只要维护下孩子节点与邻居节点的关系即可:

图5

  1. L为N节点的邻居节点列表
  2. 遍历L,删除邻居节点对N的邻居信息
  3. N节点变成非叶节点,不再需要邻居信息,删除这些信息之
  4. N节点分裂为A、B、C、D4个孩子节点
  5. 对每个孩子节点,遍历L,根据节点区域是否相邻,构建孩子节点与L列表中节点的邻居信息

以上。

3种AOI对比

前提假设:游戏对象间有碰撞

算法占用内存AddLeaveMoveAOI说明
Tile算法 O(WH) O ( W ∗ H ) O(1) O ( 1 ) O(1) O ( 1 ) O(T) O ( T ) O(T) O ( T )
2维数组。
第1维表达所有Tile;
第2维表达每个Tile上的游戏对象列表
QuadTree算法 O(N) O ( N ) O(logN) O ( l o g N ) O(1) O ( 1 ) 通常 O(L) O ( L )
跨边界 O(logN)+O(L) O ( l o g N ) + O ( L )
O(logN)+O(L) O ( l o g N ) + O ( L ) 四叉树。
叶子节点上有游戏对象列表;
叶子节点游戏对象超过指定数量限制,则分裂子节点
叶子节点有游戏对象Leave,可能触发4兄弟节点合并
节点边界上的游戏对象放在父节点上
AOI从Root节点开始做广度遍历
QuadTree带邻居关系 O(N) O ( N ) O(logN) O ( l o g N ) O(1) O ( 1 ) O(L) O ( L ) O(L) O ( L ) 四叉树并带有邻居关系。
叶子节点上有游戏对象列表,邻居列表;
叶子节点游戏对象超过指定数量限制,则分裂子节点
叶子节点有游戏对象Leave,可能触发4兄弟节点合并
AOI从始发叶子节点开始,遍历邻居节点

上图,

  • N为游戏对象数量。
  • W为地图宽
  • H为地图长
  • T为Tile上能容纳的游戏对象数量
  • L为叶子节点区域能容纳的游戏对象数量

可以看出,理论上,地图越大,QuadTree优势越明显。

对于QuadTree带邻居关系,还忽略了一个重要问题,就是 非平衡数的邻居数量问题

非平衡数的邻居数量问题

比如下图中,在极端情况,F节点及其子节点持续分裂,一直分裂到4单位长宽大小的区域,才停止分裂(不好画自己想象)

图1

则E节点会有很多邻居。

如果是1024*1024的地图,则E节点会有128个邻居;如果是8192*8192的地图,则E节点会有1024个邻居。

因此,算法中,要对这种情况做特殊处理。

比如,如果E节点邻居数超过8个,则这里的AOI处理,使用经典四叉树算法。

这篇关于服务器3D场景建模(七):四叉树的邻居关系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/373756

相关文章

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

PostgreSQL核心功能特性与使用领域及场景分析

PostgreSQL有什么优点? 开源和免费 PostgreSQL是一个开源的数据库管理系统,可以免费使用和修改。这降低了企业的成本,并为开发者提供了一个活跃的社区和丰富的资源。 高度兼容 PostgreSQL支持多种操作系统(如Linux、Windows、macOS等)和编程语言(如C、C++、Java、Python、Ruby等),并提供了多种接口(如JDBC、ODBC、ADO.NET等