0

0

c++如何实现一个简单的四叉树/八叉树_c++空间分割数据结构【游戏开发】

穿越時空

穿越時空

发布时间:2025-12-19 19:05:02

|

488人浏览过

|

来源于php中文网

原创

四叉树与八叉树是游戏开发中用于加速空间查询的数据结构,核心在于节点设计、递归插入/查询逻辑及分裂策略;2D用4子节点,3D用8子节点,均需边界表示、深度限制、物体分配规则与剪枝优化。

c++如何实现一个简单的四叉树/八叉树_c++空间分割数据结构【游戏开发】

四叉树(2D)和八叉树(3D)是游戏开发中常用的空间分割数据结构,用于加速碰撞检测、视锥剔除、粒子管理等。C++ 实现的关键在于:明确节点结构、合理定义空间边界、设计递归插入与查询逻辑,同时避免过度分裂或内存浪费。

基础节点设计:支持动态分裂与数据存储

每个节点需记录自身包围区域(如 AABB)、子节点指针(4 个或 8 个)、以及存储的物体引用(如 std::vector)。不建议直接存对象副本,用指针或索引更高效。

  • 2D 四叉树节点:4 个 std::unique_ptr 子指针;3D 八叉树节点:8 个 std::unique_ptr
  • 区域用 Rect(x, y, w, h)或 AABB(min/max vec3)表示,构造时传入并缓存中心/半尺寸,避免重复计算
  • 设置深度限制(如 maxDepth = 6)和最小物体数阈值(如 maxObjects = 4),满足条件才分裂

插入逻辑:递归定位 + 懒分裂

插入一个物体时,先判断它是否完全落在当前节点内;若否,直接存入当前节点的物体列表;若是,且已有子节点,则递归插入子节点;若无子节点且未达深度上限、物体数超限,则先分裂再分配。

  • 分裂操作:将当前区域均分为 4(2D)或 8(3D)个子区域,创建对应子节点
  • 分配物体:遍历当前节点物体列表,对每个物体检查其包围盒是否完全落入某个子区域;能完全落入的才送入该子节点,否则保留在当前层(避免遗漏跨区域物体)
  • 不强制“所有物体必须下沉到底层”——这是常见误区;保留部分物体在高层反而利于宽泛查询

查询优化:只遍历相关分支

例如视锥剔除或碰撞查询,从根节点开始,对每个访问节点做三态判断:完全在外 → 剪枝完全在内 → 加入全部物体 + 不再向下相交 → 加入本层物体 + 递归查子节点

Sora
Sora

Sora是OpenAI发布的一种文生视频AI大模型,可以根据文本指令创建现实和富有想象力的场景。

下载
  • 用快速包围盒-包围盒相交函数(如分离轴简化版),避免浮点开方
  • 查询结果通常用引用传入的 std::vector& 收集,避免频繁分配
  • 可加标记位(如 dirty)支持增量更新:仅重建被修改物体影响的局部子树

实用小技巧:轻量、可控、易调试

游戏项目中不必追求理论最优,重在稳定和可维护:

  • enum class NodeType { Leaf, Branch }; 显式区分状态,比空指针判断更安全
  • 提供 debugDraw() 方法,用简单线框绘制各层节点边界,配合引擎 debug draw API 快速验证分割合理性
  • 释放时用智能指针自动递归析构;若性能敏感,也可用对象池预分配节点,避免 new/delete 频繁调用
  • 对于移动物体,推荐“移除 + 重新插入”而非原地更新节点——逻辑清晰,且便于结合脏标记做延迟更新

基本上就这些。写一个能跑通的四叉树几十行核心代码就够了,八叉树只是把 2D 扩展到 3D、4 变成 8,结构逻辑完全一致。关键是别过早优化,先保证查询正确性,再根据 profiler 数据决定是否加 LOD、松散四叉树或混合 BVH 策略。

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

534

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

13

2026.01.06

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

464

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

12

2025.12.06

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

22

2025.11.16

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

269

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2023.12.29

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

0

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 6.7万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 18.8万人学习

第二十二期_前端开发
第二十二期_前端开发

共119课时 | 12.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号