Games101-光线追踪(加速结构)

Bounding Volumes

在这里插入图片描述
包围盒:用一个简单形状把物体包围起来,如果物体连包围盒都无法碰撞,一定无法碰撞包围盒内的物体
在这里插入图片描述
将长方体理解成三个不同对面形成的交集,一定是在x,y,z轴上的范围。没有旋转

Ray Intersection with Axis-Aligned Box

在这里插入图片描述
光线和包围盒求交
给定任何一根光线,可以求出光线何时和无限大的两个面有交点
之后看水平的对面,求两个面的交点
即对任何一个对面,可以求出进入的时间和出去的时间。
求交即可求出,光线何时进入盒子,何时出去盒子
在这里插入图片描述
对于3维空间,有3组对面,各计算一次光线进入对面的最小,最大时间·。求出最大的进入时间和最小的离开时间。如果进入时间小于离开时间,说明这段时间光线在盒子里
在这里插入图片描述
光线是射线不是直线,如果光线离开盒子时间小于0,说明盒子是在光线背后
当离开的时间是正的,进入盒子的时间是负的,说明光线起点在盒子里
当且仅当进入时间小于离开时间,且离开时间大于0,则光线与包围盒有交点
在这里插入图片描述
之所以用横平竖直的包围盒,因为光线与和xyz轴垂直的面求交比较方便
如上图,当对面与x轴垂直时,可以直接求光线在x轴方向上的传播

Uniform Spatial Partitions (Grids)

做光线追踪前的预处理
在这里插入图片描述
先找出一个场景,把场景的包围盒找出
在这里插入图片描述
把盒子分成一堆格子
在这里插入图片描述
判定哪些格子里可能有物体,将与物体表面相交的格子标记起来
在这里插入图片描述
做完预处理后可以开始进行光线追踪。
这里认为光线和格子求交是非常快的,和实际物体求交是非常慢的。
可以找到光线走的过程中相交的格子,如果格子中有物体,则光线可能与物体相交

只需要做若干次光线与格子的求交,来避免与场景所有物体进行求交

光线会打到哪个格子,最简单的思路可以是类似光栅化一条线段
在这里插入图片描述
极端的情况,将场景划分成1x1的格子,则没有加速
在这里插入图片描述
另一个极端是格子太密,则效率太低
在这里插入图片描述
启发式的算法:格子的数量应该是一个常数(27)乘以物体的数量
在这里插入图片描述
对于场景里各个地方都有几何物体,分布较均匀的情况下格子的效果比较好
在这里插入图片描述
当场景中物体分布很不均匀,有很多空的情况下,不适合格子的方式

Spatial Partitions/空间划分

在这里插入图片描述
八叉树:(2维空间下是四叉树),把空间切成四块,再把子块切成四块,知道其中有三块不和任何物体相交,则不在继续切。或者一块里有足够少数量的物体
kd树:和八叉树几乎一样,只不过每次会找一个轴,沿轴划分,保持了二叉树的性质KD-Tree
BSP树:对空间二分,每次选一个方向,把节点砍开,与kd树的区别是不是横平竖直的砍开。在维度高时,越来越不好计算
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
只需要在叶子节点实际存储和这些格子相交的几何形体
在这里插入图片描述
按x,y,z依次划分,选取划分位置,循环子节点
在这里插入图片描述
场景有一光线
在这里插入图片描述
判断和a是否有交点,有交点说明需要考虑是否和子节点有交点
在这里插入图片描述
如果有交点的是叶子节点,则和叶子节点里的所有物体求交
在这里插入图片描述
两个子节点都要判断,可能都有交点,所以B也判断求交
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
依次查询,直到求交到所有相交的叶子节点。类似二分查找

很难判断这个物体和包围盒是否相交,即格子和哪些物体相交。对于kd-tree,有个明确的问题。很难判断一个三角形和立方体有交集,如当一个三角形是插进这个盒子时,这个三角形的三个顶点都不在盒子里,但是和盒子相交。
近十年逐渐很少使用kd树来处理,就因为很难判断一个三角形和AABB是否有交点。另外如上图3,4,5都存储了一个物体。但是人们希望一个物体只在一个叶子节点里,所以kd-tree并不直观。

Object Partitions & Bounding Volume Hierarchy (BVH)

不从空间划分,通过物体来划分,这张划分形成的结构称为BVH
在这里插入图片描述
在这里插入图片描述
把一个盒子的所有三角形组织成两部分,再分别重新求包围盒
在这里插入图片描述
递归划分子节点
在这里插入图片描述
直到叶子节点有足够少的物体
在这里插入图片描述
kd-tree是直接把空间两份,bvh是把物体分成两堆,再重新求包围盒。
一个物体只可能在一个盒子里。
但bvh对空间的划分,并没有严格划分开,即不同的Bounding box有可能相交
在这里插入图片描述
选择维度:可以,x,y,z循环。也可以每次沿着最长的轴划分
排序,取中间位置物体划分。保证树接近平衡。
把所有的三角形取重心,通过重心进行排序。

如果只是找中位数的话,其实不需要排序,排序复杂度是 n log ⁡ n n{\log}n nlogn
给n个无序的数,找第i大的数,可以在O(n)时间内解决,称为快速选择算法,只对划分两边的某一边进行操作
在这里插入图片描述
中间节点只存包围盒与子节点指针,叶子节点存储实际物体
在这里插入图片描述
求交,类似kd-tree
在这里插入图片描述
总结:kd-tree划分的是空间,空间与空间之间不会有交集,但是物体可能在两个空间。bvh划分的是物体,包围盒间可能有相交,不需要处理物体和包围盒是否相交。

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

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

相关文章

适用于 Windows 10 的 10 大免费数据恢复软件

数据丢失可能是一场噩梦,尤其是在涉及重要文件和文档时。无论是由于意外删除、系统崩溃还是病毒攻击,找到适合 Windows 10 的文件夹恢复软件都可以在恢复丢失的数据方面发挥重要作用。在本指南中,我们将探索适用于 Windows 10 用户的 10 大免…

加密方法字段uuid标识

58b16292-260b-60bd-44a7-796e3ed4f20e 是uuid python实现 import uuidprint(uuid.uuid4())是的,7bff3132-952a-4338-9df4-544383e81a2a 是一个典型的UUID(Universally Unique Identifier,通用唯一识别码)格式的字符串。UUID是一…

mysql解锁表及查看表是否被锁

1、查进程,查找被锁表的那个进程的ID show processlist; 2、通过查询结果,找到要杀掉的进程,kill掉锁表的进程ID kill id; 3、查询是否锁表 show OPEN TABLES where In_use > 0; 1.delete------ 是逐行删除速度极慢,不适合…

如何使用Python中的logging模块进行日志记录?

如何使用Python中的logging模块进行日志记录? Python中的logging模块是一个强大的工具,用于记录应用程序的运行时信息。它提供了灵活的日志记录系统,允许开发者定义不同级别的日志消息,并可以选择将这些消息输出到不同的目标&…

【退役之重学Java】pom文件没啥问题但报红

复制过来的pom文件,有几处版本号报红 刚开始以为是版本号的问题,但是按道理从大佬那里复制过来的,应该不会有问题,还是检查了一下: 把项目压缩发给师傅,师傅哪里没报错好吧,我已经猜到了为什么……

MySQL操作DDL

目录 1.概述 2.数据库的增删改查 3.表的增删改查 3.1.创建和查看表结构 3.2.修改表 3.3.查看所有的表 3.4.删除表 4.用户 5.DDL在实际应用场景中的作用 5.1.数据库设计 5.2.数据库维护 ​​​​​​​5.3.数据库迁移或重置 ​​​​​​​5.4.优化性能 ​​​​​…

cesium 添加动态波纹效果 圆形扩散效果 波纹材质

一、扩展材质 /*** 水波纹扩散材质* param {*} options* param {String} options.color 颜色* param {Number} options.duration 持续时间 毫秒* param {Number} options.count 波浪数量* param {Number} options.gradient 渐变曲率*/function CircleWaveMaterialProperty(opt…

网络学习学习笔记

NETEBASE学习笔记 一.VRP系统1.四种视图模式2.基础命令 二.TCP/IP1.五层模型 一.VRP系统 1.四种视图模式 (1)< Huawei > 用户视图 【查看运行状态】 (2)[Huawei] 系统视图 【配置设备的系统参数】 system-view /sys 进入系统视图 CtrlZ/return 直接返回用户视图 (3)[Hua…

centos7升级openssl1.1.1w版本

下载 https://www.openssl.org/source/old/1.1.1/index.html 安装依赖 yum install gcc libffi-devel zlib* openssl-devel libffi-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make解压、编译、安装 tar -zxvf o…

ADS1299模拟前端(AFE)代替料LHE7909

今天我和大家分享一颗国产可以代替ADS1299的料——LHE7909&#xff0c;这是一颗由领慧立芯设计生产的一款具备颅外脑电图(EEG)和心电图(ECG)应用所需的全部常用功能的模拟前端芯片&#xff0c;并且凭借其高集成度和出色的性能&#xff0c;能够创建多种可扩展的医疗仪器系统&…

Druid面试题及参考答案

1. Druid是什么?它的主要特点有哪些? Druid是一个高效的数据查询系统,主要解决的是对于大量的基于时序的数据进行聚合查询。它的主要特点包括: 实时数据摄入:Druid能够实时地摄入数据,对于流式数据的处理非常高效。高性能查询:Druid提供了快速的数据查询能力,即使是对…

【金句推荐】适合写进摘抄本的优美句子

1.人间骄阳刚好&#xff0c;风过林梢&#xff0c;彼时他们正当年少。 2.这路遥马急的人间渐行、渐远、渐无声&#xff0c;看淡若清风的现世且听、且吟、且从容。 3.一个能够升起月亮的身体&#xff0c;必然驮住了无数次日落。 4.并不可否认&#xff0c;生活磨掉了我们一部分…

数学建模-------MATLAB分支循环断点调试

1.if语句 &#xff08;1&#xff09;分段函数的引入&#xff08;这里的数据表示的是分数的不同区间对应的等级&#xff09; (1)这个就是一个十分简单的if语句&#xff0c;无论是if还是elseif后面都是不能添加任何分号的&#xff0c;这个例子就是一个分段的函数&#xff0c;在不…

mac/win使用pyinstaller打包app/exe文件,活着执行脚本,双击运行

&#x1f338; 踩坑记录 python环境最好使用虚拟环境&#xff0c;推荐使用conda管理&#xff0c;并且若本地有python环境&#xff0c;不要使用和 本地环境版本 相同的虚拟环境 这里踩坑较多&#xff0c;已经记不清楚注意点 虚拟环境python版本不要和本地环境一样 mac/win只能…

nodejs安装及环境配置

Node.js安装和环境配置在不同操作系统&#xff08;如Windows、macOS、Linux&#xff09;上会有所不同。以下是一些基本的步骤和指南来帮助你在这些常见的操作系统上安装Node.js及进行环境配置。 ### Windows #### 安装Node.js 1. **下载安装包**&#xff1a;访问Node.js官方…

清理垃圾软件哪个好?电脑清理优化4种方法

在数字时代&#xff0c;我们的电脑经常会被各种软件、程序和文件所占据&#xff0c;其中不乏一些无用甚至有害的垃圾软件。这些软件不仅占用了大量的存储空间&#xff0c;还可能拖慢电脑的运行速度&#xff0c;甚至威胁到我们的信息安全。因此&#xff0c;定期清理和优化电脑变…

紧急备考全攻略,如何短期通过PMP考试?

今年身边有很多同事朋友都要考PMP&#xff0c;而我属于这些人里”第一个吃螃蟹“的人&#xff0c;一次拿下5A&#xff0c;下面分享一下我自己备考PMP的经验。 我是根据自己的学习计划复习的&#xff0c;不能说这些方法适合所有人&#xff0c;但对备考的伙伴们来说&#xff0c;…

【考研复试上机】C++STL

文章目录 vector初始化及赋值方式vector容器内元素的访问常用函数 setset容器内元素的访问&#xff1a;set常用函数&#xff1a;multisetunordered_set stringstring常用函数&#xff1a; mapmap容器内元素的访问&#xff1a;map常用函数&#xff1a;multimapunordered_map que…

颜色识别

颜色识别 计算机视觉中的颜色识别是指计算机系统能够自动识别图像或视频中的不同颜色&#xff0c;以便进行分析、分类、跟踪和其他视觉任务。 颜色是物体的一个重要属性&#xff0c;它提供了有关对象的重要信息。 颜色识别在各种应用中都有重要作用&#xff0c;包括工业自动…

分布式文件系统

引言&#xff1a; GFS是一个可扩展的分布式文件系统&#xff0c;用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上&#xff0c;并提供容错功能。它可以给大量的用户提供总体性能较高的服务。 一、 GlusterFS 概述 1.1 GlusterFS简介 GlusterFS 是…