光线的三点假设:

  1. 光线按直线传播
  2. 光线之间不会发生碰撞
  3. 光线会经过一系列折射反射进入摄像机
    可以从摄像机发出光线,推出可逆的光路

    上图中,透明球在与相机直连的线条处,需要将折射和反射的着色点结果相加,如果有光源直射,需要将光源在该点的着色结果也相加

    相机直射出的第一条光线为primary Ray,之后做处理的均被称为secondaryRay,与光源的连线被称为shadowRay
  • 光线定义

    对于球表面求光线交点

    之后解得t的值:


    t:首先是正数
    在可以分多种情况讨论,相离相交相切
  • 总过程可总结为:
  • 关于光线和物体求交
    如果光源在物体内,则与物体交点一定是奇数个,否则一定为偶数个
  • 光线和物体求交
  • 与三角形求交
    可以首先将这个问题转化为光线和平面求交,再判断交点是否在三角形内
  • 如何定义一个平面?
    记录该平面上一个点p,和该平面的法线,即可定义一个平面

    上图中,N为法线,p’为平面上的一个点,平面内任意一个点p可以满足该式子
    带入光线射入的公式可得出t的值,从而可得光线与该平面的焦点

    最后根据重心坐标的知识得出该点是否在三角形内。
  • 另一种方法Moller Trumbore算法
    解这个式子主要通过矩阵形式解
  • AABB包围盒(包围体积)
    Axis-Aligned Bounding Box轴对齐包围盒
    如果针对物体上每一个三角形都判断是否会被光线照射到,那么带来的消耗将会非常大,所以引入AABB包围盒机制来对判断光线照射这个过程进行加速,如果光线碰不到包围盒的话,就不可能碰到物体上任何一个三角形
  • 光线和包围盒相交

    上图中,找到光线经过x0,x1平面的时间,找到光线经过y0,y1的时间,通过交集的性质求得tmin和tmax,如果最后的结果是tmax > tmin,那么说明光线穿过了包围盒
    那么对于3D包围盒求tmin和tmax:

    如果光线进入时间为负,离开时间为正,则说明光源在包围盒内
    那么有:

光线追踪RayTracing,基本原理,判断物体与光线相交相关推荐

  1. [计算机图形学]光线追踪的基本原理(前瞻预习/复习回顾)

    一.光栅化的弊端 我们为什么要用光线追踪呢,在之前的篇章中,我们提到了,光栅化的方式很难表示一些全局的效果,如(1)软阴影,(2)Glossy的反射(类似镜子但又不像镜子那么光滑的材质,如打磨的铜镜和 ...

  2. 《用一周学习光线追踪》2.BVH树、AABB相交检测

    本项目上接<用两天学习光线追踪>,继续学习光线追踪. 项目链接:https://github.com/maijiaquan/ray-tracing-with-imgui 目录: <用 ...

  3. 【Unity3D自学记录】判断物体是否在镜头内

    判断物体是否在镜头内. 其实很简单的方法 代码如下: [csharp] view plaincopy using UnityEngine; using System.Collections; publ ...

  4. 判断两线段是否相交——快速排斥与跨立实验

    如何判断两条线段是否相交呢?如果是我们去解决这个问题,用眼睛很容易就看出来了,但是如果用计算机来解决这个问题,该怎么办呢?下面介绍两个方法,这两个方法结合起来就能完美解决这个问题了. 一.快速排斥 对 ...

  5. python判断两线段是否相交_c语言 判断两直线段是否相交

    转了多人的放到一起比较!! //功能:求点在有向直线左边还是右边 //返回:0共线.1左边.-1右边 intleft_right(pointa,pointb,doublex,doubley) { do ...

  6. 判断线段和直线相交 POJ 3304

    1 // 判断线段和直线相交 POJ 3304 2 // 思路: 3 // 如果存在一条直线和所有线段相交,那么平移该直线一定可以经过线段上任意两个点,并且和所有线段相交. 4 5 #include ...

  7. 计算几何-判断两条线段是否相交

    原理:如果两条线段相交,那么必须跨立,就是以一条线段为标准,另一条线段的两端点一定在这条线段的两段 也就是说a b两点在线段cd的两端,c d两点在线段ab的两端 struct point() {do ...

  8. 如何判断2个线段相交

    判断 2 个线段相交有很多方法,最直接的方法就是直接计算两条直线的交点,然后看看交点是否分别在这两条线段上.这样的方法很容易理解,但是代码实现比较麻烦. 还有一种常用的方法是通过向量叉积来判断的,这种 ...

  9. 如何判断两条线段是否相交

    本篇是在 [C++笔记]如何判断2个线段相交 的基础上加上自己的理解和实践总结出的判断两线段是否相交的方法. 判断两条线段是否相交 先附上判断函数 bool judge(int Ax1,int Ay1 ...

最新文章

  1. 2022-2028年中国木门行业投资分析及前景预测报告(全卷)
  2. tableau实战系列(二十八)-以可视化的方式打开关联分析算法购物篮分析(Market Basket Analysis)
  3. 打造轻量级可视化数据爬取工具-菩提
  4. NLP基础:n-gram语言模型和神经网络语言模型
  5. 基于TCP协议的进程间通信
  6. TLS(Thread Local Storage)问题demo
  7. SVM-线性可分支持向量机
  8. STM32程序设计(跑马灯)以及STM32原理图绘制(通过ad软件)
  9. RISV-Reader小结
  10. 怎么用计算机进行进制间的换算,如何实现16进制与其他进制之间的转换,教你使用16进制计算器...
  11. Ubuntu 20.04安装字体
  12. RabbitMQ 使用的AMQP模型解析
  13. hilbert曲线序编码matlab,[转载]希尔伯特曲线及其matlab画法
  14. 声明式导航与编程式导航
  15. 为什么可以做Shopyy独立站
  16. 通过Servlet生成验证码图片
  17. 键盘可以实现向计算机输入数据判断,计算机应用基础_学习指南.docx
  18. 4g dtu无线透明通讯模块传输RS232/485手机APP全网通CAT1
  19. 人员管理系统+报销系统
  20. 前端js实现表格数据的上移下移

热门文章

  1. 九龙证券|重大利好!期货公司打新再“解绑”:可直接参与首发网下配售!
  2. 京东金融App收集用户敏感信息?官方如何回应?
  3. canvas实现阿里云云栖大会炫酷动画效果
  4. windows终端事件日志监控指南
  5. 如何计算站点停留时间和页面停留时间
  6. 活动图 状态图软件工程_活动图| 软件工程
  7. EtherCAT IGH 的编译选项介绍
  8. 【数据福利】三种冰川编目数据
  9. 一种简单快速有效的图像暗部增强/亮度均衡算法
  10. testWhileIdle和testOnBorrow