从这一章节开始,主要是学习《An Introduction to Ray Tracing》

光线和多边形相交问题的求解:

1,光线和多边形所在的平面相交,求出交点;

2,判断交点是否在多边形内;

3,交点在多边形的什么位置(相对于多边形的边)。

前面两步分别在“2.3.1 Ray/Plane Intersection”和“2.3.2 PolygonIntersection”已经介绍。本节2.3.2就是以凸四边形为例阐述第三步——确定交点在多边形的什么位置。

引入uv斜角坐标系:u、v的范围是[0,1]

uv坐标系和多边形对应如下:

P(u,v)=Pa*uv+Pb*u+Pc*v+Pd “式子一”

其中

Pa = P00-P01+P11-P10

Pb = P10-P00

Pc = P01-P00

Pd = P00

我们已知的信息有:

多边形的四个顶点的三维坐标:P00、P01、P10、P11

多边形的法向量:Pn

光线和多边形的交点的三维坐标:Pi

我们要求的是:交点Pi在多边形中的相对位置(u,v)

先求u:

过图中蓝线作一个垂直于多边形所在平面的平面(u垂平面)。u垂平面的方程如下:

nu(u)q+du(u)=0                   “式子二”

其中,

nu(u)为u垂平面的法向量;

q   为u垂平面上任一点的三维坐标;

du(u)为原点到u垂平面的距离;

所以:

nu(u) = (pu(1)- pu(0))X Pn  (即:u垂平面的法向量=多边形的法向量和交线向量的叉乘)

pu(1)、pu(0)代入“式子一”(P(u,v)=Pa*uv+Pb*u+Pc*v+Pd)

nu(u) = ((Pa*u+Pb*u+Pc +Pd)–(Pb*u+ Pd)) X Pn

=(Pa*u+Pc) X Pn

=(Pa X Pn)*u +(Pc X Pn)

=Na*u+Nc                   “式子三”

其中,

Na = Pa X Pn

Nc = Pc X Pn

又因为点pu(0)在u垂平面上,将pu(0)代入“式子二”得到

du(u) = -nu(u) * pu(0)  (pu(0)来自“式子一”,nu(u)来自“式子三”)

=- (Na*u+Nc) * (Pb*u+ Pd)

=-(Na*Pb)*u2 – (Na*Pd+Nc*Pb)*u - Nc*Pd

=-Du2*u2 – Du1*u – Du0                                 “式子四”

其中,

Du0 = Nc*Pd

Du1 = Na*Pd+Nc*Pb

Du2 = Na*Pb

将“式子四”和“式子三”代入“式子二”得到:

(Na*u+Nc)*q + (-Du2*u2– Du1*u – Du0) = 0

Du2*u2+ (Du1 - Na*q) *u +(Du0 –Nc*q) = 0                                        “式子五”

交点Pi在u垂平面上,将交点Pi代入“式子五”,得到:

Du2*u2+ (Du1 - Na*Pi) *u +(Du0 –Nc*Pi) = 0                                    

A*u2 +B *u +C = 0                                         “式子六”

其中,

A = Du2

B = Du1 -Na*Pi

C = Du0 –Nc*Pi

再求v:

过图中绿线作一个垂直于多边形所在平面的平面(v垂平面)。v垂平面的方程如下:

nv(v)q+dv(v)=0                     “式子七”

其中,

nv(v)为v垂平面的法向量;

q   为v垂平面上任一点的三维坐标;

dv(v)为原点到v垂平面的距离;

所以:

nv(v) = (pv(1)- pv(0))X Pn  (即:v垂平面的法向量=多边形的法向量和交线向量的叉乘)

pv(1)、pv(0)代入“式子一”(P(u,v)=Pa*uv+Pb*u+Pc*v+Pd)

nv(v) = ((Pa*v+Pb +Pc*v +Pd) –(Pc*v+Pd)) X Pn

=(Pa*v+Pb) X Pn

=(Pa X Pn)*v +(Pb X Pn)

=Na*v+Nb                   “式子八”

其中,

Na = Pa X Pn

Nb = Pb X Pn

又因为点pv(0)在v垂平面上,将pv(0)代入“式子七”得到

dv(v) = - nv(v) * pv(0)  (pv(0)来自“式子一”,nv(v)来自“式子八”)

=- (Na*v+Nb) * (Pc*v+ Pd)

=-(Na*Pc)*v2 – (Na*Pd+Nb*Pc)*v - Nb*Pd

=-Dv2*v2 – Dv1*v – Dv0                                    “式子九”

其中,

Dv0 = Nb*Pd

Dv1 = Na*Pd+Nb*Pc

Dv2 = Na*Pc

将“式子九”和“式子八”代入“式子七”得到:

(Na*v+Nb)*q + (-Dv2*v2– Dv1*v – Dv0) = 0

Dv2*v2+ (Dv1 - Na*q) *v +(Dv0 –Nb*q) = 0                                          “式子十”

交点Pi在v垂平面上,将交点Pi代入“式子十”,得到:

Dv2*v2+ (Dv1 - Na*Pi) *v +(Dv0 –Nb*Pi) = 0                                      

A*v2 +B *v +C = 0                                         “式子十一”

其中,

A = Dv2

B = Dv1 -Na*Pi

C = Dv0 –Nb*Pi

注意:我们当前这种求u、v的方法的前提是凸四边形……前提是凸四边形……前提是凸四边形……

先把出观点:如果不是凸四边形,即使只有一个在[0,1]的实根,也不能保证交点在四边形内的。

接下来,用图示讨论一下根的情况:

对于凸四边形:

如果交点在该图阴影部分,u则会有两个实根,其一在[0,1],其二在[-1,-3/4]。我们在求得u的两个实根时,则会取其在[0,1]的根。

如果交点在该图四边形的非阴影部分,u则会有两个实根,其一在[0,1],其二小于-1。

求得[0,1]的u(绿线)之后,再求v。

如果v(红线)也在只有一个实根在[0,1],则红线和绿线的交点一定在凸四边形内。

对于凹四边形:

红点:u=1/4和u=1/2的交点,即此处存在两个[0,1]范围内的实根,且交点在凹四边形内。

蓝点:u=1/2和u=3/4的交点,即此处存在两个[0,1]范围内的实根,且交点在凹四边形外。

绿点:u=-1/4和u=3/4的交点,即此处只存在一个[0,1]范围内的实根,同时(1/2,3/4)范围内的某个v(红线)会经过绿点,也就是说,绿点处,u、v都在[0,1]范围内只有一个实根。但是绿点是在凹四边形外的。所以,如果是凹四边形,u、v都在[0,1]范围内只有一个实根,并不能确定交点在四边形内。

问题三十一:ray tracing中Convex Quadrilateral Inverse Mapping相关推荐

  1. 问题三十六:ray tracing中的Inverse Mapping(0)——概要

    Inverse Mapping指的是某点在某面的相对位置,这个"相对位置"用u.v表示. Inverse Mapping完成后,相当于将某面映射到了uv平面,u.v的取值范围为[0 ...

  2. 问题三十六:ray tracing中的Inverse Mapping(5)——圆锥面Inverse Mapping

    36.5 圆锥面Inverse Mapping 36.5.1 数学推导 36.5.2 看C++代码实现 ----------------------------------------------qu ...

  3. 问题三十六:ray tracing中的Inverse Mapping(4)——圆柱面Inverse Mapping

    36.4 圆柱面Inverse Mapping 36.4.1 数学推导 36.4.2 看C++代码实现 ----------------------------------------------qu ...

  4. 问题三十六:ray tracing中的Inverse Mapping(3)——圆盘Inverse Mapping

    36.3 圆盘Inverse Mapping 36.3.1 数学推导 我们只考虑圆盘垂直于ZOX平面的情况. 36.3.2 看C++代码实现 ----------------------------- ...

  5. 问题三十六:ray tracing中的Inverse Mapping(1)——球面Inverse Mapping

    36.1 球面Inverse Mapping 36.1.1 数学推导 球面(球心在(X0, Y0, Z0),半径为R)上任意一点P的坐标(Xi, Yi, Zi)的参数表示为: Xi = X0 + R* ...

  6. Q78:规则网格(Regular Grids)——Ray Tracing中的一种加速技术

    当图形中需要ray trace的物体的数目很大时(比如十万.百万.千万),这时我们就需要对图形生成的过程进行加速. 按照常规办法,需要判断每条光线和每一个物体的碰撞情况.这样一来,则需要耗费大量的时间 ...

  7. 问题十九:怎么模拟ray tracing中漫射材料球体的颜色(diffuse materials)

    前面画一个球时,球体的颜色设置为红色: 前面画多个球时,球体的颜色设置为球在该点的单位法向量的色彩表映射值: 现在画多个漫射材料的球,球体的颜色设置为背景颜色的系数倍.(姑且表述为"背景颜色 ...

  8. 问题二十八:ray tracing中的散焦模糊(defocus blur)

    "散焦模糊"在摄影上又称"景深". 在现实的相机中,我们需要做"散焦模糊"的原因是:我们需要一个更大的孔来收集光线增加图片的亮度(而不是&q ...

  9. Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息...

    先看简单示例:点击按钮,2s之后,TextView改变内容. package cn.lixyz.handlertest;import android.app.Activity; import andr ...

最新文章

  1. python程序打包成exe可执行文件,亲测可行(pyinstaller教程)
  2. Java NIO 介绍和基本demo
  3. Linux基础学习八:mysql主从复制原理以及详细搭建步骤
  4. 8月9日发布!华为EMUI 10将在华为开发者大会上登场
  5. OpenStack云第三天
  6. 数据库事务的四大特性以及事务的隔离级别 1
  7. 5个不可多得的PPT小技巧,工作再忙也要学习!
  8. java ts视频文件合并
  9. 当程序员变成软件项目经理
  10. Tomcat服务器的使用
  11. 支付宝当面付扫码支付支付后不回调_免费开通支付宝商家收款码 支持信用卡 花呗收款...
  12. freeotp使用教程_软件使用教程
  13. linux千兆网卡接百兆交换机,千兆交换机可以接百兆网线吗?
  14. Mariadb指定数据库进行主备,无法恢复数据异常总结
  15. .NET Core 获取GET,Post 参数
  16. Consumer接口
  17. 三五族异质结的自发极化、压电极化及2DEG
  18. 在中科院计算所实习的一年(更新中。。)
  19. 【练习题】python列表练习题1
  20. 友盟+首席产品官 林鸣晖:从统计平台到数据智能云服务的9年进阶之路

热门文章

  1. ganglia metric extended by gmetric command line tool
  2. UFT11.5如何复用QTP9.2的脚本
  3. Coolite一个简单例子-GridPanel列表增删改预览
  4. 2011对于运维的思考
  5. C++标准库之stack
  6. 剑指offer——面试题20:顺时针打印矩阵
  7. Ruby中的类与对象(一)
  8. Latex中的常用公式模板
  9. tensorflow 获取checkpoint中的变量列表
  10. 集合之五:Set接口