光线和二次曲线相交的相对简单的类别:圆柱体,圆锥体,椭圆体,双曲面等。球体和平面是该族物体的特殊子类。 出于效率的原因,这些简单的对象通常被赋予它们自己的相交实例。 例如,参见[13]以获得更快的圆柱交点方法。 本节将介绍这些对象的广义相交。 同样,参数光线公式和隐式表面方程用于解决相交问题。 标准映射在本节末尾讨论。

  5.1 光线/二次曲面 相交

    定义光线:

      

      

    使用[4]中的公式,二次曲面表面方程为:

      

    矩阵标记为Q,在二次曲面上用于执行变换和其他运算。 有关这些操作的进一步讨论,请参见[6]和[4]。 该等式等效于函数F(X,Y,Z)= 0的情况:

      

    将(G1)代入(G2),求解t,得到二次方程的系数:

      

    如果Aq!= 0,则检查平方判别式。 如果△<0,则不发生交叉。 否则,如果需要,计算t0和可能的t1。 t的最小正值用于计算最近的相交点:

      

    如果Aq = 0。那么就很简单了:

      

    一旦计算出t,就使用等式(C8)计算交点ri。 通过取函数F相对于X,Y和Z的偏导数来形成二次曲面的法线:

      

    请注意,rn未标准化。 乘以2可以删除,因为此时法线的长度并不重要。 此外,法线应该在面向光线的表面,因此该矢量的方向必须根据其与方向矢量Rd的关系而反转。 如果rn点乘Rd> 0,那么法线应该反转。

 效率问题

    有一些技术可以应用到这个算法中,使其在计算上更有效率。一个重要的思想是把方程中的公约数提出来。这就造成了看起来不那么优雅的公式,但对于效率来说,这并不重要。例如,可以重写计算(G3)中的Aq的公式

      

    这样就消掉了3个相乘。另一个简单的变化是将所有的常数乘(即:2 * ....)将因素转化为给定的因素,根据需要创造新的因素。只有当内存约束不是问题时,才建议这样做。最后,以类似于(A16)的方式修改二次方程将节省一些操作。实质上,将NBq=Bq/2代入式(G3)求解。

    Kernighan和Plauger的[10]基本编程规则是“写得清楚——不要太聪明”,这应该与Press的发言[11]相平衡,“ (计算机)革命来了,所有犯有此类(不考虑因素的)犯罪行为的人都会被立即处决,但他们的程序不会!”一个好的方法是仔细地注释任何由于效率原因而产生的混淆公式。

    合并所有这些更改将导致修改(G3)

      

    由于效率的原因,正常的计算可以避免交叉例程[16]。在所有被测试的表面中,只有一个表面与射线的原点最近,这意味着这个物体将是唯一一个与射线的原点相关的物体。对于计算,如果需要,可以计算法线。

    必须再次解决浮点运算不精确的问题。 这种不精确性影响Aq和Bq的测试几乎等于0.还必须解决在二次曲面上开始射线原点的情况。 请参阅“光线/球体交点”部分中的“精确度问题”以查找问题及其可能的问题。 建议使用[11]第5.5节中给出的二次公式计算,以帮助避免精度问题。

    算法步骤如下:

      1,计算系数

      2,如果Aq不等于0,计算Ka和Kb

      3,如果Ka2-Kb小于0,无解

      4,计算交点距离t0或t1

      5,计算交点

      6,计算法线,无标准化和符号改变的

      7,重定向法线

      8,标准化法线

  5.2 标准逆映射

    如何从二次曲面交点到(u,v)参数空间执行逆映射主要是一个选择问题。 对于较少使用的二次曲面,例如双曲面片,尤其如此。 但是,在实体建模和其他具有标准映射定义的计算机图形相关字段中使用了对象。 这里包括这些算法,因为它们可以辅助图形功能,例如纹理映射以及许多非图形应用程序。 未涵盖将参数坐标映射到世界坐标,因为在大多数光线跟踪应用程序中通常不需要此映射。

    圆的逆映射

      圆的逆映射主要是一个从笛卡尔坐标系到极坐标变换的问题。在XY平面上定义一个圆,圆心在原点,半径为Cr

        

        

      显然,在一个环境中,圆的方向和位置与这个简单的定义不同。假设某个变换矩阵与圆相关联,使圆和相关数据与定义相一致。

      给定一个交点Ri:

        

      在XY平面上(Zi=0)(u,v)坐标定义为u从(0..1)开始,从+X轴向+Y轴移动,v从(0. 1)开始,从原点到圆的边缘。这个映射如图12所示。这些参数由Ri计算如下:

        

        

      注意,我们可以通过设置Cr=1来消除一个乘法和一个除法。这可以通过将一个缩放矩阵连接到较早的变换矩阵中来实现,从而使圆是一个单位圆。

    柱面的逆映射

      定义半径为Cr,高度为Ch的圆柱体:

        

      还有一个交点Ri vec | i (u,v)坐标定义为u从(0..1)开始,从+X轴向+Y轴移动,v从(0..1)开始,从(0..1)到圆柱体的顶部。这个映射如图13所示。这些参数的计算如下

        

    椎体的逆映射

      定义一个高为Ch半径为Cr0,Cr0在Z=0, Crh,在Z=Ch

        

        

      还有交点Ri。(u,v)坐标定义为u从(0…1)开始,从+X轴向+Y轴移动,v从(0…1)到圆柱体的顶c。这个映射如图14所示。这些参数的计算方法如下:

        

      或者,你可以计算圆。 请注意,可以对锥体进行多次划分和重新使用。 另外,请注意,当Cr0 = 0且Zi = 0(或Crh = 0且Zi = Ch)时,将导致除以零。 此时u未定义,可以任意赋值(0 ..1)

转载于:https://www.cnblogs.com/TooYoungTsukasa/p/9257624.html

5 光线/二次曲面 相交和映射相关推荐

  1. 光线求交加速算法:边界体积层次结构(Bounding Volume Hierarchies)2-表面积启发式法(The Surface Area Heuristic)

    光线求交加速算法:边界体积层次结构(Bounding Volume Hierarchies)2 上篇的两种图元分区方法(Middle,EqualCounts)对于某些图元分布可以很好地工作,但是在实践 ...

  2. Ray-AABB问题:判断线段是否相交于轴对齐边界框(Axially Aligned Bounding Box, AABB)

    摘要 Ray-AABB问题:判断线段是否相交于轴对齐边界框(Axially Aligned Bounding Box, AABB) 本文介绍了slab算法的实现,从一个简单实现开始,逐步优化slab算 ...

  3. NVIDIA Turing Architecture架构设计(下)

    NVIDIA Turing Architecture架构设计(下) GDDR6 内存子系统 随着显示分辨率不断提高,着色器功能和渲染技术变得更加复杂,内存带宽和大小在 GPU 性能中扮演着更大的角色. ...

  4. 神经稀疏体素场论文笔记

    论文地址:https://proceedings.neurips.cc/paper/2020/file/b4b758962f17808746e9bb832a6fa4b8-Paper.pdf Githu ...

  5. 可以买的一本书:3D计算机图形学(原书第3版)

    作 者 (英)沃特(Watt,A.) ,包宏 译 出 版 社 机械工业出版社 图书定价 ¥69.00 第1章 计算机图形学的数学基础 1 1.1 处理三维结构 1 1.1.1 计算机图形学中的三维仿射 ...

  6. 采用光线跟踪绘制场景 c++_光线追踪的相干性聚集:硬件光线追踪的优势

    尽管在理论上实现现代GPU的方法是无限的,但真正有效的方法是切实地了解问题并着手将方案变为现实.制造现代高性能半导体器件以及试图加速当前可编程光栅化技术所面临的问题揭示了GPU硬件行业发展的未来趋势. ...

  7. qt 读取gif一帧_译:Unreal渲染一帧详解(Unreal Frame Breakdown)

    译者前言: 上一篇文章,我补充翻译了"How Unreal renders 1 Frame?"的第三篇,在找资料过程中,又发现了一篇挺好的文章,同样是基于"How Unr ...

  8. OpenGL课程设计 光线追踪

    链接: https://pan.baidu.com/s/1cBTTbbzRCVBCX_H4jf6qMA 提取码: kj8w 一.实验内容与要求 1.1 实验内容 (1)实验描述 基于C++(也可选择其 ...

  9. 【GPU精粹与Shader编程】(四) 《GPU Gems 2》全书核心内容提炼总结 · 上篇

    本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处 文章链接: https://zhuanlan.zhihu.com/p/38411575 <GPU Gems 2>这本书除了丰富的 ...

最新文章

  1. 编写c语言程序 斐波那契,C语言程序实现斐波那契数列的解题思路???
  2. HALCON示例程序color_fuses.hdev通过颜色对保险丝进行分类
  3. 【转】CT基本概念(必须掌握)!!!!!!!!!!!!!!
  4. php 处理二维数组(去除重复项,排序,转换,去空白等)
  5. 谈判失败:Oracle 杀死 Java EE
  6. 判断页面环境是否在小程序的webview中
  7. [Stage3D]硬件加速的径向模糊
  8. goflyway安装
  9. 机器学习(周志华)学习笔记(二)
  10. 量子纠缠在量子计算机中的作用,解密量子计算机,量子叠加和量子纠缠是制胜关键...
  11. 访谈录#1:成为“温赵轮”
  12. bypass-wts-waf
  13. 黑群晖frp内网穿透配置
  14. CentOS7精简版基本配置
  15. 若依框架内自带的excel导入导出功能
  16. java中PL层_JAVA PL
  17. 周庄王,姬佗(公元前696年—公元前682年在位)
  18. vue - 下拉列表
  19. 如何选择socks5免费代理地址呢?
  20. c语言不用strcpy复制字符串,c语言程序(二十三)——字符串复制(不使用strcpy()函数)...

热门文章

  1. Oracle INSERT ALL 语句介绍
  2. 固高Otostudio软件使用基础知识
  3. token过期后刷新token并重新发起请求
  4. linux下编译isl,GCC编译器升级./configure报错“configure: error: Unable to find a usable ISL.”解决办法...
  5. 上班族如何提高“非工资收入”?跟清北大咖零基础学理财
  6. 高薪邀请国人去菲律宾上班的新型诈骗方式
  7. word中插入参考文献标号以及如何引用参考文献
  8. python卡尔曼多维_kalman filter using python
  9. Tcl异常处理命令之try、throw
  10. 免费申请.tk国际顶级域名-攻略