14光线追踪(加速结构)

1.Uniform Spatial Partitions(Grids)—均匀空间划分

1.1场景预处理

  1. Find bounding box
  2. Create grid
  3. Store each object in overlapping cells判断哪些网格可能有物体,有物体的格子做上特殊标记

1.2开始光线追踪

开始做光追→ 光线到有物体的格子 → 判断是否有交点

如果在一个小格子中既有物体又有光线,那么说明光线和物体可能有交点,就在这个格子里进行光线与物体表面的求交计算,否则就不会计算。那么我们怎么知道光线穿过了哪些格子呢?要一个一个进行求交计算吗?实际上是不需要的,这里其实可以用到光栅化直线的算法,如引入增量运算的Bresenham算法等,直接可以计算在光线在哪一个格子内,以及下一个格子是谁

1.3格子的划分

划分的如果太稀疏,假如不划分,只用一个大包围盒,那相当于没有加速结构,而如果划分的太密集我们又要多次计算光线与小网格的求交。而经过不断的尝试人们发现,划分网格的数量应该等于某一个常数C乘上场景中物体的数量。

1.4适用场景

大小、空间分布均匀的场景,不适用空旷的场景

2.Spatial Partitions—空间划分(KDtree)

Oct-Tree(八叉树),KD-Tree(KD树),BSP-Tree(二叉空间划分树)。这里主要介绍KD-Tree,原因是KD-Tree在高维仍然很好用,而像八叉树在二维空间中是四叉树,三维空间是八叉树,更高维的空间就变成了2的n次方叉树。而BSP树,在二维空间我们是用线划分,三维空间用平面划分,而高维空间我们则需要用超平面划分,也很麻烦。而KD树的做法是各个维度按顺序依次划分,先对着x划分,然后y,然后z,然后再xyz,如果更高维度就变成xyzw循环,每次对空间划分只划分两个区域。

KD树也是在我们做光线追踪前对包围盒的预处理。与此同时,中间节点A,B,C,D并不存储任何对象,而对象物体都存储在叶子节点中。中间节点存储划分的轴以及划分的位置,以及它的子节点

在预处理完包围盒之后,我们就可以对划分的区域进行求交了,

先对A求交,发现与A有交点,那么就要对A的子节点也进行求交,因为1没有继续划分,所以对1内的物体进行求交,再对B节点求交,然后沿着子节点依次这么做,最后对C节点的子节点3内的物体求交时成功找到了光线与物体的交点。

当然KD-Tree也有它的问题,例如,我们怎么判断一个立方体格子和一个三角形求交。其次一个物体可能会被存储在很多不同的格子里,这显然加大了复杂程度。
 

3.Object Partitions & Bounding Volume Hierarchy(BVH)—对象分区&边界体积层次

BVH是直接根据物体划分。首先为场景找到一个包围盒,将这堆三角形尽量均匀的分成两部分,然后重新为这两部分设置包围盒,然后重复前面两步的操作,直到最后每个包围的三角形趋近于一定的数量。用这种方法我们同样可以建立起一个树结构,同样中间节点只存包围盒与子节点的指针,只有叶子节点存储物体。而且有效避免了KD-Tree中一个三角形出现在多个节点中的问题。

当然BVH也有它的问题,如这些重新划分的包围盒之间会有重合,当然重合的影响并不是致命的,只要划分的重合度导致的误差过大不至于发生错误。所以怎么划分也是一个很重要的问题。

为了均匀划分,我们通常每次都沿着最长的轴划分,从而保证包围盒不过于“细长”或者“矮扁”。

如何把物体分成两半呢?人们通常取处在中间位置的物体来划分,这样可以保证两部分的物体数量差不多,也就可以使得构建的树结构的最大深度最小,也就是树两个叉的深度平衡。而这本质是一个取中位数的问题,在n个数中快速取得第i大的数实际上是一个快速选择算法,时间复杂度是O(n)。当每个节点的涵盖的三角形数量是五(假设)的话,就停止划分。

BVH的数据结构

光线与BVH求交的伪代码,原理和KDtree差不多,如果与父节点有交点,则递归计算与其它两个子节点的求交,如果与子节点有交点则计算光线与叶子节点内物体的求交,

KDtree与BVH的比较

最后做一下比较,对于KD-Tree,它是对空间划分,并且一个物体可能被存储在不同的区域。而对于BVH,则是对对象进行划分,并且它们重新划分的区域可能会重叠。

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

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

相关文章

day03、关系模型之基本概念

关系模型之基本概念 1.关系模型概述1.1 关系模型三要素基本结构:relation/Table基本操作:relation operator 2.什么是关系3.关系模型中的完整性约束 本视频来源于B站,战德臣老师 1.关系模型概述 1.1 关系模型三要素 基本结构:relation/Table…

【Kubernetes】四层代理Service

Service四层代理 一、Service概念原理1.1、为什么要有Service1.2、Service概述1.3、工作原理1.4、三类IP地址【1】Node Network(节点网络)【2】Pod network(pod 网络)【3】Cluster Network(服务网络) 二、S…

Leetcode 139.单词拆分

OJ链接 &#xff1a;139.单词拆分 代码&#xff1a; class Solution {public boolean wordBreak(String s, List<String> wordDict) {Set<String> set new HashSet<String>(wordDict);int n s.length();boolean[] dp new boolean[n1];dp[0] true;//初始…

现代雷达车载应用——第2章 汽车雷达系统原理 2.5节 检测基础

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.5 检测基础 对于要测试目标是否存在的雷达测量&#xff0c;可以假定下列两个假设之一为真&#xff1a; •H0:—测量结果仅为噪声。 •H1:—测量是噪…

leaflet使用热力图报L找不到的问题ReferenceError: L is not defined at leaflet-heat.js:11:3

1.在main.js中直接引入会显示找不到L 2.解决办法 直接在组件中单独引入使用 可以直接显示出来。 至于为什么main中不能引入为全局&#xff0c;我是没找到&#xff0c;我的另外一个项目可以&#xff0c;新项目不行&#xff0c;不知哪里设置的问题

LangChain 25: SQL Agent通过自然语言查询数据库sqlite

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

多模态AI:技术深掘与应用实景解析

多模态AI&#xff1a;技术深掘与应用实景解析 在当今人工智能技术的快速发展中&#xff0c;多模态AI凭借其独特的数据处理能力&#xff0c;成为了科技创新的前沿。这项技术结合了视觉、听觉、文本等多种感知模式&#xff0c;开辟了人工智能处理和理解复杂信息的新纪元。本文旨…

NOIP2017提高组day2 - T2:宝藏

题目链接 [NOIP2017 提高组] 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图&#xff0c;藏宝图上标出了 n n n 个深埋在地下的宝藏屋&#xff0c; 也给出了这 n n n 个宝藏屋之间可供开发的 m m m 条道路和它们的长度。 小明决心亲自前往挖掘所有宝藏屋中的宝藏。但…

HarmonyOS开发入门HelloWorld及工具安装

下载与安装DevEco Studio 在HarmonyOS应用开发学习之前&#xff0c;需要进行一些准备工作&#xff0c;首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio下载官网&#xff0c;单击“立即下载”进入下载页面。 DevEco Studio提供了Windows版本和…

DeCap DECODING CLIP LATENTS FOR ZERO-SHOT CAPTIONING VIA TEXT-ONLY TRAINING

DeCap: DECODING CLIP LATENTS FOR ZERO-SHOT CAPTIONING VIA TEXT-ONLY TRAINING 论文&#xff1a;https://arxiv.org/abs/2303.03032 代码&#xff1a;https://github.com/dhg-wei/DeCap OpenReview&#xff1a;https://openreview.net/forum?idLt8bMlhiwx2 TL; DR&#xff…

新版Spring Security6.2案例 - Basic HTTP Authentication

前言&#xff1a; 书接上文&#xff0c;翻译官网Authentication的Username/Password这页&#xff0c;接下来继续翻译basic的这页&#xff0c;因为官网说的都是原理性的&#xff0c;这边一个小案例关于basic http authentication。 Basic Authentication 本节介绍 HTTP 基本身…

项目总结-自主HTTP实现

终于是写完了&#xff0c;花费了2周时间&#xff0c;一点一点看&#xff0c;还没有扩展&#xff0c;但是基本功能是已经实现了。利用的是Tcp为网络链接&#xff0c;在其上面又写了http的壳。没有使用epoll&#xff0c;多路转接难度比较高&#xff0c;以后有机会再写&#xff0c…

【程序人生】还记得当初自己为什么选择计算机?

✏️ 初识计算机&#xff1a; 还记得人生中第一次接触计算机编程是在高中&#xff0c;第一门编程语言是Python&#xff08;很可惜由于条件限制的原因&#xff0c;当时没能坚持学下去......现在想来有点后悔&#xff0c;没能坚持&#xff0c;唉......&#xff09;。但是&#xf…

快速上手linux | 一文秒懂Linux各种常用目录命令(上)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 一 、命令提示符和命令的基本格式1.1 如何查看主机名称及修改 二、命令基本格式2.1 命令格式示例2.2 参数的作用…

电商类app如何进行软件测试?有必要进行第三方软件测试吗?

电商类app在开发过程中&#xff0c;软件测试是一个非常重要的环节。通过软件测试&#xff0c;可以确保app在发布和使用过程中的稳定性和安全性。那么&#xff0c;电商类app究竟如何进行软件测试?是否有必要进行第三方软件测试? 一、电商类app如何进行软件测试?   1. 内部…

【Linux】多线程编程

目录 1. 线程基础知识 2. 线程创建 3. 线程ID&#xff08;TID&#xff09; 4. 线程终止 5. 线程取消 6. 线程等待 7. 线程分离 8. 线程互斥 8.1 初始化互斥量 8.2 销毁互斥量 8.3 互斥量加锁和解锁 9. 可重入和线程安全 10. 线程同步之条件变量 10.1 初始化条件变…

Collecting Application Engine Performance Data 收集应用程序引擎性能数据

You can collect performance data of any specific SQL action of an Application Engine program to address any performance issue. 您可以收集应用程序引擎程序的任何特定SQL操作的性能数据&#xff0c;以解决任何性能问题。 You can collect performance data of the S…

IDEA中工具条中的debug按钮不能用了显示灰色

IDEA中工具条中的debug按钮不能用了显示灰色 1. 问题描述 IDEA上的DEBUG按钮突然变成了灰色&#xff1a; 2. 解决办法 一通搜索&#xff0c;终于找到解决办法 点击 File -> Project Structure如下图操作 3. 重启&#xff0c;解决 4. 参考 https://www.cnblogs.com…

【代码随想录】刷题笔记Day35

前言 日常学习&#xff0c;抵触心理5%&#xff1b;毫无指示的干活&#xff0c;抵触心理95% 122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 把整体利润拆分为每次利润&#xff0c;只要积上涨的就可以&#xff0c;so easy class Solution { public:int …

C++共享和保护——(2)生存期

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 生命如同寓言&#xff0c;其价值不在于…