首页 > 其他分享 >Ray Tracking 基本原理

Ray Tracking 基本原理

时间:2024-03-31 20:45:25浏览次数:20  
标签:texit Tracking 光线 基本原理 相交 包围 三角形 追踪 Ray

光线追踪和光栅化的区别

光栅化不能处理更全局的信息。比如软阴影、玻璃的反射以及以及经过多次反射的光线。

光线追踪将整个过程变换为从摄像机发出感知射线,到达物体之后,如果相同的点也能够被光源感知到,以此进行渲染。感觉光栅化这个过程是从光源出发,最后通过投影转到相机上。光线跟踪是眼睛出去一条光线同时光源也去判断这个像素的可见性,最终“感知射线”还能够进行多次判断。

Three ideas about light rays

  • Light travels in straight lines (though this is wrong)
  • Light rays do not “collide” with each other if they cross(though this is still wrong)
  • Light rays travel from the light sources to the eye (but the physics is invariant under path reversal - reciprocity)

Whitted-style的光线追踪

递归的想法,点打到一个地方弹射出去,打到新的地方再计算,最终加到这一个像素上。

光线和Triangle的相交

光线追踪,追踪来讲的话,就有一个概念非常重要。就是光线和平面(三角面片)的相交问题。
光线和三角形的相交问题就转为了光线和三角形所在平面的交点是否在三角形内。

另外有个大佬提出使用三角形的那个公式去表达三角形平面,这样能更快的求解。

包围盒求交

因为对三角形面片计算的话,计算量太大了,要计算来自每一个像素的射线与各个三角面的相交情况。
一个射线不与包围盒碰撞的话,自然就不会与包围盒中的物体相交。

为了方便之后的计算,定义的包围盒是AABB(轴对齐包围盒)

对于每一对平面都可以计算tmax和tmin。最终texit是tmax里面最小的,tenter是tmin中最大的。
如果texit>tmax说明光线与包围盒相交。
但是注意t>0,t是射线。
如果texit<0.说明不相交。
如果tenter<0,texit>0说明光线起点在包围盒内。相交。

In summary, ray and AABB intersect iff,tenter < texit && texit >= 0

这里还有为什么选择AABB的原因,是为了便于计算。

标签:texit,Tracking,光线,基本原理,相交,包围,三角形,追踪,Ray
From: https://www.cnblogs.com/code-fun/p/18107064

相关文章

  • Yii2-助手类(ArrayHelper)
    Yii2-助手类(ArrayHelper)数组助手类ArrayHelperYii数组助手类提供了额外的静态方法,让你更高效的处理数组。模型转数组$model=Country::findOne(['code'=>'BR']);VarDumper::dump(ArrayHelper::toArray($model));//['code'=>'BR''name'=&g......
  • Array方法总结(三)
    Array.prototype.slice()返回一个新的数组对象。从原数组的start和end(不包括end)索引范围内浅拷贝。slice(start,end)constfruits=["Banana","Orange","Lemon","Apple","Mango"];constcitrus=fruits.slice(1,3);//fruits包含['......
  • Array方法总结(一)
    Array.prototype.at()at(index) 传入一个整数值参数,返回该索引对应的元素。传入负整数从数组最后一个元素开始倒数。constarray=[10,8,2];console.log(array.at(-2));//8Array.prototype.concat()合并两个或多个数组。返回一个新数组。constarray1=[7,[1,......
  • lodash已死?radash最全使用介绍(附源码详细说明)—— Array方法篇(1)
    相信很多前端同学甚至非前端都或多或少使用过lodash库,我们都知道lodash是一个非常丰富的前端工具库,比如最常用的防抖和节流,使用lodash都能很快实现,在github上更是有着58.7k的star数。但最近出现的Radash库,号称lodashplus版本,比之更新、更小、更全面、源码更易于理解。阅读本文......
  • 双端队列Deque——ArrayDeque的实现
    Deque接口表示一个双端队列(DoubleEndedQueue),允许在队列的首尾两端操作,所以既能实现队列行为,也能实现栈行为。Deque常用的两种实现ArrayDeque和LinkedList,这篇主要介绍下Deque的常用操作,并重点看下ArrayDeque的实现逻辑。1、接口API1.1、Queue接口Queue的API......
  • java的ArrayList类
    ArrayList<E>E是自定义数据类型ArrayList类:构造函数: 成员方法: public boolean add(E e):将指定元素加到集合末尾Appendsthespecifiedelementtotheendofthislist.publicclassArray{publicstaticvoidmain(String[]args){ArrayLista......
  • Qt QByteArray中存储的字节顺序转换
    在QByteArray中,可以使用Qt的函数来实现字节顺序的转换。具体而言,可以使用 qFromBigEndian 和 qFromLittleEndian 函数将大端和小端字节顺序的数据转换为主机字节顺序的数据。同样地,可以使用 qToBigEndian 和 qToLittleEndian 函数将主机字节顺序的数据转换为大端......
  • 集合:Arrays.asList() 和 new ArraysList()
     Arrays.asList和newArrayList在Java中都与集合有关,但是它们之间有一些重要的区别。概述1)Arrays.asList():T...是一个可变参数(varargs),接收任意参数后,会组合为一个数组。Arrays.asList("字符串列表.");//字符串列表Arrays.asList(2024)......
  • Python_PyStray结合Tkinter显示系统托盘图标
    前言PyStray是一个用于Python的系统托盘图标库,它可以让您轻松地在Windows、macOS和Linux下创建和管理托盘图标应用程序。通过PyStray,您可以创建自定义托盘图标、菜单和气泡通知,并响应托盘图标的各种事件。PyStray的主要特点包括:跨平台支持:支持Windows、macOS和Li......
  • 解决“AttributeError: ‘numpy.ndarray’ object has no attribute ‘value_counts’
    成功解决AttributeError:‘numpy.ndarray’objecthasnoattribute‘value_counts’大家好,今天我想分享一个我在Python编程过程中遇到的问题,并详细阐述我是如何解决的。这个问题是关于numpy.ndarray对象没有value_counts属性的AttributeError。一、问题背景与错误描述......