从这一章节开始,主要是学习《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]范围内只有一个实根,并不能确定交点在四边形内。