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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java语法学习八之认识String类

String类的重要性 在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而…

高效的Gitlab Flow最佳实践

文章目录 一、git flow二、github flow三、gitlab flow四、基于gitlab flow的最佳实践1.语义化版本号2.测试发布3.bug修复 参考 业界包含三种flow: Git flowGithub flowGitlab flow 三种工作流程,有一个共同点:都采用"功能驱动式开发&…

计算机二级Python基础操作题

题目来源:计算机二级Python半个月抱佛脚大法(内呈上真题版) - 知乎 第4,5,6,7,9,10,11套 1. 基础题1 sinput() print("{:\"^30x}".format(eval(s))) b …

xilinx linux AXI GPIO 驱动学习

vivado工程 vivado 配置一个 AXI GPIO&#xff0c; 全输出&#xff0c;宽度为1 设备树解读 生成的对应pl.dtsi设备树文件如下 axi_gpio: gpio40020000 {#gpio-cells <2>;clock-names "s_axi_aclk";clocks <&clkc 15>;compatible "xlnx,…

海外盲盒App开发:探索惊喜与乐趣的跨国新体验

在全球化日益加速的今天&#xff0c;人们对新鲜、有趣、充满惊喜的体验需求不断增长。盲盒作为一种充满神秘与乐趣的玩法&#xff0c;正迅速在全球范围内走红。为了满足广大海外用户的盲盒体验需求&#xff0c;我们致力于开发一款海外盲盒App&#xff0c;为用户带来跨国界的惊喜…

C#,图论与图算法,计算无向连通图中长度为n环的算法与源代码

1 无向连通图中长度为n环 给定一个无向连通图和一个数n,计算图中长度为n的环的总数。长度为n的循环仅表示该循环包含n个顶点和n条边。我们必须统计存在的所有这样的环。 为了解决这个问题,可以有效地使用DFS(深度优先搜索)。使用DFS,我们可以找到特定源(或起点)的长度…

高精度AI火灾烟雾检测算法,助力打造更加安全的楼宇环境

一、方案背景 近日&#xff0c;南京居民楼火灾事故导致15人死亡的新闻闹得沸沸扬扬&#xff0c;这一事件又激起了大家对楼宇火灾隐患的进一步担忧。事后我们除了思考政府、消防及物业部门应对此事的解决办法&#xff0c;我们还应该思考如何利用现有的技术帮助人们减少此类事情的…

手撕算法-无重复字符的最长子串

描述 分析 滑动窗口&#xff0c;记录窗口中的所有出现的字符&#xff0c;然后窗口左边界固定&#xff0c;右边界右滑&#xff0c;如果&#xff0c;窗口中不存在新的字符&#xff0c;则右滑成功&#xff0c;否则左边界右滑&#xff0c;直到窗口中不存在右边界的值。 描述感觉不…

Linux初学(八)磁盘管理

一、磁盘管理 1.1 简介 磁盘的工作原理&#xff1a; 添加磁盘对磁盘进行分区格式化磁盘挂载和使用磁盘 磁盘的类型&#xff1a; 固态机械 磁盘的接口类型&#xff1a; IDESTSTSCSI 磁盘工作的原理&#xff1a; 磁盘&#xff0c;特别是硬盘&#xff0c;和内存不同&#xff0c;…

【网络基础】网络层基本协议介绍

目录 一、IP数据包 1.1 网络层的功能 1.2 IP数据包格式 二、ICMP协议介绍 2.1 作用 2.2 常用命令 2.2.1 Ping命令 2.2.2 tracert命令 2.3 广播域 三、ARP协议介绍 3.1 作用 3.2 原理 一、IP数据包 1.1 网络层的功能 定义了基于IP协议的逻辑地址&#xff0c;就是I…

IDEA使用手册

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

优化选址问题 | 基于禁忌搜索算法求解基站选址问题含Matlab源码

目录 问题代码问题 禁忌搜索算法(Tabu Search)是一种局部搜索算法的扩展,它通过引入一个禁忌列表来避免陷入局部最优解,并允许在一定程度上接受较差的解来跳出局部最优。在基站选址问题中,我们可以使用禁忌搜索算法来寻找满足覆盖要求且基站数量最少的选址方案。 以下是…

无人机采集图像的相关知识

1.飞行任务规划 一般使用飞行任务规划软件进行飞行任务的设计&#xff0c;软件可以自动计算相机覆盖和图像重叠情况。比如ArduPilot (ArduPilot - Versatile, Trusted, Open) 和UgCS (http://www.ugcs.com)是两个飞行任务规划软件&#xff0c;可以适用大多数无人机系统。 2.图…

Java 模拟Spring,实现IOC和AOP的核心(二)

接着上一篇&#xff0c;在上一篇完成了有关IOC的注解实现&#xff0c;这一篇用XML的方式实现IOC&#xff0c;并且完成AOP。 简易的IOC框图 注解的方式实现了左边的分支&#xff0c;那么就剩下右边的XML分支&#xff1a; XmlContext&#xff1a; 这个类是也是AbstractApplicat…

海量数据处理项目-技术Leader必备方法论-SMART衡量需求-工作的利器

海量数据处理项目-技术Leader必备方法论-SMART衡量需求-工作的利器

阿里的库存秒杀是如何实现的?

一、阿里的库存秒杀的实现 阿里有很多业务&#xff0c;几十上百个业务线&#xff0c;各自都有一些需要做抢购、秒杀、热点扣将的场景。他们都用哪些方案呢? 我看了很多资料&#xff0c;也找了很多人做交流&#xff0c;最终得到的结论是啥都有&#xff0c;主要总结几个主流的&…

STM32 ESP8266模块的曲折探索

这是本文的配套资料&#xff0c;最终工程请参考 新_ESP8266资料\stm32f103成功移植的项目 【免费】stm32f103c8t6esp8266资料资源-CSDN文库 一、等到了ready 产品参数 我使用的是ai-thinker的esp8266-01s&#xff0c;以下为产品规格书 引脚定义&#xff1a; 依据引脚定义&…

【深度学习目标检测】二十四、基于深度学习的疲劳驾驶检测系统-含数据集、GUI和源码(python,yolov8)

设计一个疲劳驾驶检测系统的重要性主要体现在以下几个方面&#xff1a; 提高道路安全&#xff1a;疲劳驾驶是引发交通事故的重要因素之一。驾驶员在长时间驾驶或缺乏休息的情况下&#xff0c;反应速度和判断能力会显著下降&#xff0c;从而增加事故风险。通过实时检测驾驶员的疲…

金三银四面试题(一):JVM类加载与垃圾回收

面试过程中最经典的一题&#xff1a; 请你讲讲在JVM中类的加载过程以及垃圾回收&#xff1f; 加载过程 当Java虚拟机&#xff08;JVM&#xff09;启动时&#xff0c;它会通过类加载器&#xff08;ClassLoader&#xff09;加载Java类到内存中。类加载是Java程序运行的重要组成…

AI视频风格转换动漫风:Stable Diffusion+TemporalKit

话不多说&#xff0c;直接开干。 基本方法 首先通过 Temporal-Kit 这个插件提取视频中的关键帧图片&#xff0c;然后使用 Stable Diffusion WebUI 重绘关键帧图片&#xff0c;然后再使用 Temporal-Kit 处理转换后的关键帧图片&#xff0c;它会自动补充关键帧之间的图片&#…