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 大免…

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

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

【退役之重学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…

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

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只能…

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

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

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

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

分布式文件系统

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

跳动的♥心

代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style…

git实现代码版本控制

一、在github新建一个仓库 二、在本地执行以下代码 git init git add . git commit -m "first commit" git branch -M main git remote add origin gitgithub.com:thekingofjumpshoot/blog.git git push -u origin main 代码解析 然后就上传到github上了 三、第二…

如何通过代码混淆绕过苹果机审,解决APP被拒问题

目录 iOS代码混淆 功能分析 实现流程 类名修改 方法名修改 生成垃圾代码 替换png等静态资源MD5 info.plist文件添加垃圾字段 功能分析 实现流程 类名修改 方法名修改 生成垃圾代码 替换png等静态资源MD5 info.plist文件添加垃圾字段 混淆前后对比 iOS代码混淆 …

南京航空航天大学-考研科目-513测试技术综合 高分整理内容资料-01-单片机原理及应用分层教程-单片机有关常识部分

系列文章目录 高分整理内容资料-01-单片机原理及应用分层教程-单片机有关常识部分 文章目录 系列文章目录前言总结 前言 单片机的基础内容繁杂&#xff0c;有很多同学基础不是很好&#xff0c;对一些细节也没有很好的把握。非常推荐大家去学习一下b站上的哈工大 单片机原理及…

开通抖音小店后下一步要干嘛?这些准备比选品更重要!新手必看!

哈喽~我是电商月月 很多入驻完抖音小店的新手朋友总以为&#xff0c;入驻完抖音小店后&#xff0c;下一步就是去选品 其实并不是&#xff01;选品确实很重要&#xff0c;但前期这几个细节没做好&#xff0c;是会直接影响店铺的整体发展的 废话不多说&#xff0c;直接分享给你…

Linux入门攻坚——18、SELinux、Bash脚本编程续

SELinux——Secure Enhanced Linux&#xff08;安全加强的Linux&#xff09;&#xff0c;工作于Linux内核中。 SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源&#xff08;最小权限原则&#xff09;。采用委任式存取控制&#xff0c;是在进行程序、文件等细节权…

python批量修改替换cad图纸文本,土木狗可以有

civilpy&#xff1a;python进行AutoCAD绘图的两个库&#xff0c;土木狗可以有3 赞同 0 评论文章​编辑 civilpy&#xff1a;python进行AutoCAD绘图批量打印&#xff0c;土木狗可以有2 赞同 2 评论文章​编辑 # 导入所需库 from pyautocad import Autocad, APoint import ma…

LeetCode 94 二叉树的中序遍历

题目描述 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入…