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<object></object>)。不建议直接存对象副本,用指针或索引更高效。

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

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

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

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

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

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

飞书知识问答
飞书知识问答

飞书平台推出的AI知识库管理和智能搜索工具

下载

立即学习C++免费学习笔记(深入)”;

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

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

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

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

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
treenode的用法
treenode的用法

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

544

2023.12.01

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

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

27

2025.12.22

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

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

42

2026.01.06

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

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

727

2024.01.03

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

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

23

2025.12.06

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

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

23

2025.11.16

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

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

287

2023.11.13

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

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

221

2023.12.29

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

24

2026.02.28

热门下载

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

精品课程

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

共102课时 | 7.2万人学习

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

共162课时 | 20.9万人学习

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

共119课时 | 13.1万人学习

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

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