快速区分清楚图形渲染中的AABB,KD树和BVH这些概念
快速区分清楚图形渲染中的AABB,KD树和BVH这些概念
主要想形象去区分好这些术语,目的是扫盲,先开好坑,内容持续填充。
0.先摆出这些词的全称
- AABB: 原名:axis aligned bounding box;中文直译名:轴对齐包围盒。一般常见也会叫它aabb盒。
- KD Tree: 原名:K-dimension tree, dimension是维度的意思。中文直译:KD树。
- BVH: 原名Bounding Volume Hierarchies,Hierarchies是层次、结构的意思;中文直译名:层次包围盒。常见也会叫它BVH树(搞得人家对BVH是树还是盒傻傻分不清)
强烈建议无视中文直译名,因为无法帮助理解还看得人糊里糊涂,想记住理解这几个名词,最好以图为准,脑海中知道它们长什么样的(正如你对链表、二叉树这个数据结构的印象一样去理解)。
1.AABB(axis aligned bounding box)
AABB长的是白色线框这样,包围住兔子,兔子完全在AABB内:
你的一个三维模型,读入三维场景中,便坐落在了世界坐标系上(图中红绿蓝轴线分布对应xyz轴线),你的模型实际上是网格模型,许多个三维顶点组成模型的表面,那每个三维顶点都可以被xyz表示。
那么最简单最快速地去评估这个模型在场景中占了多少空间,就是去看模型分布在X、Y和Z轴的最小值和最大值是多少,只需要遍历每个顶点坐标,找出X、Y和Z的最小值和最大值。一共六个值,可以组成一个最小值点和一个最大值点。而X、Y和Z的最小值和最大值所包括的空间范围就是AABB,如上图的白色线框。(顺便一提:那最小值点和最大值点其实刚好是在对角。)
AABB是个立方体,是个盒子,里面包着就是模型,那是不是需要写一个类,或者写个数据结构去记录维护这个AABB呢?——其实不需要,因为我要的是最简单最快速,所以记录好六个值就能记录好AABB了(当然是不需要像上图那样可视化的情况下,只需要一个数组把X、Y和Z的最小值和最大值存储起来即可)。
所以AABB通常作为一个类属性放进模型数据这个类里面。
说一个AABB最直观的好处,假如一个兔子模型有几万个三角形组成,我现在做光线追踪渲染,我要判断一条光线有没有照射到兔子模型,那我先跟兔子的AABB(只有六个值)做相交检测,可以很快速地发现没有相交,那么就可以直接跳过兔子模型,几万个三角形都可以无视掉了,是不是很牛逼!
所以AABB很简单,但是在很多应用方面的第一步就已经能提供很大的帮助。
AABB与KD Tree和BVH的关系
我把AABB跟KD Tree和BVH放到一起,难道BVH这种词是指斜着放或者最小包围住模型的多边盒子吗?
其实AABB跟KD Tree和BVH根本不是一个维度的东西,但是我在接触图形渲染初期,就经常会想搞清楚AABB和BVH的区别,因为看中文直译名两个都说是盒子,一个轴对齐包围盒,一个层次包围盒,我就以为是类似的东西(像B树和B+树那样)要做区别,所以我才会强烈建议无视中文直译名。
先简单去说清楚,KD Tree和BVH是两种对空间做划分组织的方法,也可以说是数据结构,但是本质上还是对空间划分组织方式的不同。它们都会用到AABB,这就是它们之间的联系,KD Tree和BVH是方法,需要用到模型中AABB这个属性。
为什么需要KD Tree或者BVH对空间去做划分组织?
我们继续刚刚AABB中光线寻找照射点的例子,光线没有与兔子的AABB相交倒好,可以直接无视跳过几万个三角形不用管啦。但是万一光线与AABB相交了呢,那不得继续往几万个三角形里面钻啊,那这时光线要逐一与兔子表面的每个三角形做相交才能知道光线照射到哪一个三角形,如果光线找了前几个三角形就发现相交了还好说,万一要找到最后一个三角形才能发现相交,这个计算量想想都可怕(相交计算正是光线追踪渲染中消耗时间的大头)
最直观的解决想法:
那我们就会去想方法减少无用功,例如我们想着能不能先判断光线与AABB的左半部分相交还是右半部分相交呢,然后不就可以排除掉将近一半的三角形了嘛,假如光线跟AABB的左半部分相交,那不是可以继续对该部分分下左右再去判断和排除了,一步步递进到最后才到三角形,不要一来就跟最小的三角形判断相交嘛。整个过程不就省下很多计算了吗
刚刚好这个想法就形成了KD Tree的雏形,或者说KD Tree就是这么想的,就是如此去对空间做划分,另外还有在上面想法中没有想到的组织方式的问题。
2.KD Tree(K-dimension tree)
其实记住简称和英文全称都对理解没多大帮助,看英文直译就是k维度树,完全不知道啥玩意,所以还是记形象的图片吧。
我们图形渲染都是跟三维空间打交道,网上很多解释都是拿二维图来说事,很难转过来验身都三维空间去理解,所以去理解KD Tree,应该直接用三维的方式去理解。
三维指的是x,y和z三个维度,KD Tree你往宏观去说,可以很多个维度,但是我们就在图形渲染中用,我们就看在图形渲染中怎么用的,用的就是三维的,我们就看x,y和z三个维度,其他的不管(但是原理是同样的,像多幂次的展开实际就是多次乘法一样)。
我们看看图片吧
3.BVH(axis aligned bounding box)
BVH的目的跟KD Tree是一样的——都是为了将模型中的三角形组织地更高效——》使得在找三角形的时候更高效省时。
相关文章:

快速区分清楚图形渲染中的AABB,KD树和BVH这些概念
快速区分清楚图形渲染中的AABB,KD树和BVH这些概念 主要想形象去区分好这些术语,目的是扫盲,先开好坑,内容持续填充。 0.先摆出这些词的全称 AABB: 原名:axis aligned bounding box;中文直译名…...
Rust 的 HashMap 特定键值元素值的累加方法
在Rust中,如果你想要对HashMap中特定键对应的值进行累加操作,你需要首先检查该键是否已存在。如果存在,则取出其值,进行累加,然后将结果存回HashMap。如果不存在,则可能需要插入一个新的键值对,…...

Java后端项目性能优化实战-群发通知
背景 公司群发通知模块性能存在问题,我进行全面的系统调优,系统处理能力大幅提升。 原发送流程 优化后的发送流程 优化的点 说明:以下问题基本都是压测过程遇到的,有些问题普通的功能测试暴露不了。优化目标:保证高…...
5、Jenkins持续集成-Maven和Tomcat的安装与配置
文章目录 一、Maven的安装与配置1、安装maven并配置环境2、全局工具配置关联jdk和maven3、添加Jenkins全局变量4、修改settings.xml文件5、测试是否配置成功二、Tomcat的安装与配置1、安装tomcat8+2、配置Tomcat用户角色权限3、测试是否配置成功一、Maven的安装与配置 在Jenki…...

Qt教程 — 3.7 深入了解Qt 控件: Layouts部件
目录 2 如何使用Layouts部件 2.1 QBoxLayout组件-垂直或水平布局 2.2 QGridLayout组件-网格布局 2.3 QFormLayout组件-表单布局 在Qt中,布局管理器(Layouts)是用来管理窗口中控件位置和大小的重要工具。布局管理器可以确保窗口中的控件在…...
自动驾驶的几种名词
1. 自适应巡航控制(ACC) 自适应巡航控制(Adaptive Cruise Control,ACC)是一种汽车驾驶辅助系统,它可以根据前方车辆的速度和距离自动调整车辆的速度,以保持与前车的安全距离。ACC系统由控制层和…...
华为全套企业管理资料合集(21专题)
华为全套企业管理资料合集-知识星球下载 1.绩效考核 华为内训绝密资料:绩效管理与绩效考核.ppt 华为绩效管理与绩效考核制度.docx 华为公司实用性各种绩效图表汇总.doc 华为公司考勤管理制度.doc 华为IPD模式中跨部门团队成员的考核激励制度.doc 2.企业管理 华为公司人力资源…...

LeetCode Python - 74. 搜索二维矩阵
目录 题目描述解法方法一:二分查找方法二:从左下角或右上角搜索 运行结果方法一方法二 题目描述 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给…...

如何安全地添加液氮到液氮罐中
液氮是一种极低温的液体,它在许多领域广泛应用,但在处理液氮时需谨慎小心。添加液氮到液氮罐中是一个常见的操作,需要遵循一些安全准则以确保操作人员的安全和设备的完整性。 选择合适的液氮容器 选用专业设计用于存储液氮的容器至关重要。…...

LGBM算法 原理
简介 GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。GBDT不仅在工业界应用广泛,通常被…...
【WPF应用5】WPF中的TextBlock控件:属性与事件详解及示例
在WPF(Windows Presentation Foundation)开发中,TextBlock控件是一个常用的元素,用于显示静态或动态文本内容。它提供了丰富的属性和事件,使得开发者能够灵活地控制文本的显示样式和响应用户的交互行为。本文将详细介绍…...

【C语言基础】:内存操作函数
文章目录 一、memcpy函数的使用和模拟实现1.1 memcpy函数的使用1.2 memcpy函数的模拟实现 二、memmove函数的使用和模拟实现2.1 memmove函数的使用2.2 memmove函数的模拟实现 三、memset函数的使用3.1 menset函数的使用 四、memcmp函数的使用4.1 memcmp函数的使用 学海无涯苦作…...

3.24作业
基于UDP的网络聊天室 项目需求: 如果有用户登录,其他用户可以收到这个人的登录信息如果有人发送信息,其他用户可以收到这个人的群聊信息如果有人下线,其他用户可以收到这个人的下线信息服务器可以发送系统信息 服务器端代码 #in…...

Excel双击单元格后弹窗输入日期
Step1. 在VBE界面新建一个窗体(Userform1),在窗体的工具箱的空白处右键,选中添加附件,勾选Calendar control 8.0,即可完成日历的添加。 PS:遗憾的是, Office 64 位没有官方的日期选择器控件。唯一的解决方案是使用Excel 的第三方日历。 参考链接:How to insert calen…...

原生 HTML/CSS/JS 实现右键菜单和二级菜单
文章来源:www.huhailong.vip 站点 文章源地址:https://www.huhailong.vip/article/1764653112011841538 Demo效果演示地址 先看效果图 {{{width“auto” height“auto”}}} 需要注意的就是边界检测处理,到极端点击底部和右侧时如果不做处理会…...

[项目前置]如何用webbench进行压力测试
测试软件 采用webbench进行服务器性能测试。 Webbench是知名的网站压力测试工具,它是由Lionbridge公司开发。 webbench的标准测试可以向我们展示服务器的两项内容: 每秒钟相应请求数 和 每秒钟传输数据量 webbench测试原理是,创建指定数…...

网络七层模型:理解网络通信的架构(〇)
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
format(C++20)
1. std::format format_01.cpp // g format_01.cpp -stdc20 #include <iostream> #include <string> #include <format>void test_01() {// 使用字符串填充std::cout << std::format("Hello {}!\n", "World"); // Hello World!…...

Ftrans安全数据摆渡系统 构建便捷的内外网数据交换通道
安全数据摆渡系统是一种设计用于解决内外网环境下,数据传输、管理、共享问题的安全系统,通过加密、访问控制等策略,提供安全可靠的数据传输和共享服务,尤其适用于对网络安全建设要求高的行业,比如研发型企业、党政机构…...
【云开发笔记No.14】持续交付、持续部署、持续交付流水线
一、持续交付 持续交付(Continuous Delivery)是一种软件开发方法论,它强调在开发过程中,软件可以在任何时间以最小的努力被部署到生产环境。其核心是确保代码更改在经过一系列自动化测试后,能够快速、安全地集成到主代…...

传输层:udp与tcp协议
目录 再谈端口号 端口号范围划分 认识知名端口号(Well-Know Port Number) 两个问题 netstat pidof 如何学习下三层协议 UDP协议 UDP协议端格式 UDP的特点 面向数据报 UDP的缓冲区 UDP使用注意事项 基于UDP的应用层协议 TCP协议 TCP协议段格式 1.源端口号…...

玄机-日志分析-IIS日志分析
1.phpstudy-2018站点日志.(.log文件)所在路径,提供绝对路径 2.系统web日志中状态码为200请求的数量是多少 3.系统web日志中出现了多少种请求方法 4.存在文件上传漏洞的路径是什么(flag{/xxxxx/xxxxx/xxxxxx.xxx} 5.攻击者上传并且利用成功的webshell的文件名是什…...

物联网嵌入式开发实训室建设方案探讨(高职物联网应用技术专业实训室建设)
一、建设背景与目标 在当今数字化时代,物联网技术正以前所未有的速度改变着人们的生活和工作方式。从智能家居到工业自动化,从智能交通到环境监测,物联网的应用场景无处不在。根据市场研究机构的数据,全球物联网设备连接数量预计…...
ocrapi服务docker镜像使用
umiocr只能用于windows,http服务只能找旧版,没办法,只能找docker替代一下了。 umiocr 使用paddleOCR和rapidOCR引擎。以下时这两个docker的运行方法 paddleOCR使用 duolabmeng666的ppocr镜像 镜像大小约2.6G docker run -itd --name ppoc…...
在 Caliper 中执行不同合约的方法
在 Caliper 中执行不同的智能合约需要通过正确配置工作负载(workload)和测试轮次(rounds),下面我将详细介绍如何执行不同的合约。 1. 通过 config.yaml 配置不同测试轮次 你可以在 config.yaml 中为不同的合约定义不同的测试轮次: rounds:- label: test-helloworlddescript…...

【MATLAB去噪算法】基于CEEMDAN联合小波阈值去噪算法(第四期)
CEEMDAN联合小波阈值去噪算法相关文献 一、EMD 与 EEMD 的局限性 (1)EMD (经验模态分解) 旨在自适应地将非线性、非平稳信号分解成一系列 本征模态函数 (IMFs),这些 IMFs 从高频到低频排列。 核心问题:模态混合 (Mode Mixing) 同…...
区块链架构深度解析:从 Genesis Block 到 Layer 2
# 区块链架构深度解析:从 Genesis Block 到 Layer 2 目录 一、Genesis Block:区块链的起点 二、Layer 0:区块链的底层网络架构 三、Layer 1:核心协议层 🚀 四、Layer 2:扩展性解决方案 五、未来展望&a…...

BugKu Web渗透之需要管理员
启动场景,打开网页,显示如下: 一般没有上面头绪的时候,就是两步:右键查看源代码 和 扫描网站目录。 步骤一: 右键查看源代码 和 扫描网站目录。 右键查看源代码没有发现异常。 于是扫描网站目录&…...

嵌入式学习笔记-freeRTOS taskENTER_CRITICAL(_FROM_ISR)跟taskEXIT_CRITICAL(_FROM_ISR)函数解析
一 函数taskENTER_CRITICAL,taskEXIT_CRITICAL 函数taskENTER_CRITICAL最终实现如下: 第①处按照系统设定的configMAX_SYSCALL_INTERRUPT_PRIORITY值对中断进行屏蔽 第②处调用一次自增一次 第③处检查中断状态寄存器位,如果有任何中断位置…...

如何利用Elastic Stack(ELK)进行安全日志分析
在以下文章中,我将解释如何使用Elastic Stack(ELK)进行安全日志分析,以提高安全性和监控网络活动。ELK是一个功能强大的开源日志管理和分析平台,由Elasticsearch、Logstash和Kibana组成,适用于各种用例&…...