快速区分清楚图形渲染中的AABB,KD树和BVH这些概念

news2024/9/21 5:44:30

快速区分清楚图形渲染中的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是一样的——都是为了将模型中的三角形组织地更高效——》使得在找三角形的时候更高效省时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1543850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图论基础|417. 太平洋大西洋水流问题、827.最大人工岛、127. 单词接龙

目录 417. 太平洋大西洋水流问题 827.最大人工岛 127. 单词接龙 417. 太平洋大西洋水流问题 题目链接(opens new window) 有一个 m n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界…

QGraphicsView的使用,view坐标,scene坐标,item坐标

Graphics View绘图构架 QGraphicsScene(场景):可以管理多个图形项QGraphicsItem(图形项):也就是图元,支持鼠标事件响应。QGraphicsView(视图):关联场景可以让…

Schemdraw小白从入门到放弃---原理工具书

文章目录 序版本最简单的例子一、总体思路二、元件2.1 color习题 2.2 label2.3 length 三、元件的连接3.1 延续性习题 3.2 方向习题 3.3 接线点习题3.3.1 默认激活anchor与沉默anchor3.3.2 切换鼠标焦点机制3.3.2.1 at函数规定元件的start接在哪个anchor上3.3.2.2 to函数规定元…

JS08-DOM节点完整版

DOM节点 查找节点 父节点 <div class="father"><div class="son">儿子</div></div><script>let son = document.querySelector(.son)console.log(son.parentNode);son.parentNode.style.display = none</script>通过…

C语言---------strlen的使用和模拟实现

字符串是以‘\0’作为结束标志&#xff0c;strlen函数的返回值是‘\0’前面的字符串的个数&#xff08;不包括‘\0’&#xff09; 注意 1&#xff0c;参数指向的字符串必须以‘\0’结束 2&#xff0c;函数的返回值必须以size_t,是无符号的 使用代码 ​ #include<stdio.…

力扣438. 找到字符串中所有字母异位词

Problem: 438. 找到字符串中所有字母异位词 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.编写辅助函数bool same(vector& need, vector& matched)&#xff1a; 1.1 以need为标准&#xff0c;循环对比need和matched的每一个位置的元素值是否相等 2.获…

RabbitMQ 安装保姆级教程

目录 1.MQ引言 1.1 什么是MQ 1.2 MQ有哪些 1.3 不同MQ特点 2.RabbitMQ 的引言 2.1 RabbitMQ 2.2 RabbitMQ 的安装 2.2.1 下载 2.2.2 下载的安装包 2.2.3 安装步骤 3. RabiitMQ 配置 3.1RabbitMQ 管理命令行 3.2 web管理界面介绍 3.2.1 overview概览 3.2.2 Admin用…

【c++】类和对象(三)构造函数和析构函数

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本篇文章我们带来类和对象重要的部分&#xff0c;构造函数和析构函数 目录 1.类的6个默认成员函数2.构造函数2.1构造函数其他特性 3.构析函数3.1特性&#xff1a;…

【JavaSE】继承和多态

目录 前言 1. static 1.1 static修饰成员变量 1.2 类变量的使用场景 1.3 static修饰成员方法 2. 代码块 3. 继承 3.1 为什么会有继承 3.2 继承的语法 3.3 继承后成员的访问 super关键字 3.4 子类的构造器 super和this的联系 继承中的代码块 4. 多态 4.1 多态的…

翻过DP这座大山

1.AcWing 跳台阶 第一种方法:暴力搜索DFS #include <iostream> using namespace std;int dfs(int n) {if(n 1) return 1;else if(n 2) return 2;else return dfs(n-1)dfs(n-2); }int main() {int x; cin>>x;cout<<dfs(x)<<endl;return 0; }显然如…

hcia datacom课程学习(3):http与https、FTP

1.超文本传输协议&#xff1a;http与https &#xff08;1&#xff09;用来访问www万维网。 wwwhttp&#xff0b;html&#xff0b;URLweb &#xff08;2&#xff09;它们提供了一种发布和接受html界面的方法&#xff1a;当在网页输入URL后&#xff0c;从服务器获取html文件来…

3种货币对保证金和杠杆关系,众汇实例分享

在外汇交易中货币对总共分为3种&#xff1a;主要货币对、交叉货币对和新兴市场货币对&#xff0c;这3种不同的货币对保证金和杠杆的关系各自不同&#xff0c;今天众汇外汇实例分享。 1.直接引用 直接报价是美元在分数中处于第二位的外汇汇率。 保证金持仓量*合约规模/杠杆*开…

QT常见Layout布局器使用

布局简介 为什么要布局&#xff1f;通过布局拖动不影响鼠标拖动窗口的效果等优点.QT设计器布局比较固定&#xff0c;不方便后期修改和维护&#xff1b;在Qt里面布局分为四个大类 &#xff1a; 盒子布局&#xff1a;QBoxLayout 网格布局&#xff1a;QGridLayout 表单布局&am…

软件测试|使用selenium进行多窗口操作

简介 在我们进行自动化测试的工作中&#xff0c;经常会点击某个元素或者链接就会自动打开一个新页面&#xff0c;需要我们转到新打开的页面去进行操作&#xff0c;这个时候我们就需要能够自动切换到新页面进行后续的操作&#xff0c;selenium同样支持这个功能&#xff0c;本文…

CSS设置移动端页面底部安全距离

env(safe-area-inset-bottom)是一个CSS属性值&#xff0c;用于设置底部安全距离。它表示使用环境变量来获取底部安全距离的值。当使用环境变量时&#xff0c;需要使用env()函数来引用具体的环境变量。例如&#xff1a; <style> .box{padding-bottom: env(safe-area-inse…

Java 算法和数据结构 答案整理,最新面试题

Java中如何使用动态规划求解背包问题&#xff1f; 1、定义子问题&#xff1a; 首先确定动态规划状态&#xff0c;通常以物品数量和背包容量为变量定义子问题&#xff0c;例如dp[i][j]表示前i件物品放入容量为j的背包所能获得的最大价值。 2、确定状态转移方程&#xff1a; 基…

​ 翻译 《The Old New Thing》

今天开始&#xff0c;为大家翻译微软优秀的技术专栏 The Old New Thing。 由微软高级工程师 Raymond Chen 撰写。该专栏起初是一个博客&#xff0c;后来也出版了同名书籍。专栏主要围绕 Windows 操作系统的开发和设计展开&#xff0c;涵盖了 Windows 平台的历史、技术细节、编程…

maven的依赖继承

先说一下创建子maven工程的步骤 继承 继承的作用&#xff1a;在父工程中&#xff0c;统一管理项目中的依赖信息&#xff0c;进行统一的版本控制 继承的背景是&#xff1a;对一个大型的项目进行了模块拆分&#xff0c;一个project下&#xff0c;创建了很多的module&#xff0c…

机器学习——随机森林

机器学习——随机森林 随机森林是一种强大的集成学习算法&#xff0c;能够用于分类和回归任务。它基于决策树构建&#xff0c;在集成学习框架下&#xff0c;通过Bagging算法和随机特征选择的方式&#xff0c;将多棵决策树组合成一个更强大的模型。本篇博客将介绍随机森林的原理…

计算机专业大学生应该在大学四年踏实学哪些东西?

在这个信息爆炸的时代&#xff0c;对于我们计算机专业的大学生来说&#xff0c;真正难的不是学习新技术&#xff0c;而是决定学什么、放弃什么。时间毕竟有限&#xff0c;每一个选择都像是在做一笔投资&#xff0c;希望能够收获最大的回报。我在这里分享一下我的一些经验&#…