问题三十一:ray tracing中Convex Quadrilateral Inverse Mapping
从这一章节开始,主要是学习《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相关推荐
- 问题三十六:ray tracing中的Inverse Mapping(0)——概要
Inverse Mapping指的是某点在某面的相对位置,这个"相对位置"用u.v表示. Inverse Mapping完成后,相当于将某面映射到了uv平面,u.v的取值范围为[0 ...
- 问题三十六:ray tracing中的Inverse Mapping(5)——圆锥面Inverse Mapping
36.5 圆锥面Inverse Mapping 36.5.1 数学推导 36.5.2 看C++代码实现 ----------------------------------------------qu ...
- 问题三十六:ray tracing中的Inverse Mapping(4)——圆柱面Inverse Mapping
36.4 圆柱面Inverse Mapping 36.4.1 数学推导 36.4.2 看C++代码实现 ----------------------------------------------qu ...
- 问题三十六:ray tracing中的Inverse Mapping(3)——圆盘Inverse Mapping
36.3 圆盘Inverse Mapping 36.3.1 数学推导 我们只考虑圆盘垂直于ZOX平面的情况. 36.3.2 看C++代码实现 ----------------------------- ...
- 问题三十六: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* ...
- Q78:规则网格(Regular Grids)——Ray Tracing中的一种加速技术
当图形中需要ray trace的物体的数目很大时(比如十万.百万.千万),这时我们就需要对图形生成的过程进行加速. 按照常规办法,需要判断每条光线和每一个物体的碰撞情况.这样一来,则需要耗费大量的时间 ...
- 问题十九:怎么模拟ray tracing中漫射材料球体的颜色(diffuse materials)
前面画一个球时,球体的颜色设置为红色: 前面画多个球时,球体的颜色设置为球在该点的单位法向量的色彩表映射值: 现在画多个漫射材料的球,球体的颜色设置为背景颜色的系数倍.(姑且表述为"背景颜色 ...
- 问题二十八:ray tracing中的散焦模糊(defocus blur)
"散焦模糊"在摄影上又称"景深". 在现实的相机中,我们需要做"散焦模糊"的原因是:我们需要一个更大的孔来收集光线增加图片的亮度(而不是&q ...
- Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息...
先看简单示例:点击按钮,2s之后,TextView改变内容. package cn.lixyz.handlertest;import android.app.Activity; import andr ...
最新文章
- python程序打包成exe可执行文件,亲测可行(pyinstaller教程)
- Java NIO 介绍和基本demo
- Linux基础学习八:mysql主从复制原理以及详细搭建步骤
- 8月9日发布!华为EMUI 10将在华为开发者大会上登场
- OpenStack云第三天
- 数据库事务的四大特性以及事务的隔离级别 1
- 5个不可多得的PPT小技巧,工作再忙也要学习!
- java ts视频文件合并
- 当程序员变成软件项目经理
- Tomcat服务器的使用
- 支付宝当面付扫码支付支付后不回调_免费开通支付宝商家收款码 支持信用卡 花呗收款...
- freeotp使用教程_软件使用教程
- linux千兆网卡接百兆交换机,千兆交换机可以接百兆网线吗?
- Mariadb指定数据库进行主备,无法恢复数据异常总结
- .NET Core 获取GET,Post 参数
- Consumer接口
- 三五族异质结的自发极化、压电极化及2DEG
- 在中科院计算所实习的一年(更新中。。)
- 【练习题】python列表练习题1
- 友盟+首席产品官 林鸣晖:从统计平台到数据智能云服务的9年进阶之路