计算机图形学中的许多技术,例如光线追踪,均需要计算光线与物体之间的交点。通常情况下,求交的物体可能是球体、三角形或多边形,但其他类型的表面也是有可能的。这里,我们将讨论光线和双线性曲面之间的求交计算。
本文中的算法来自犹他大学Shaun D. Ramsey,Kristin Potter,Charles Hansen等人于2004年发表的一篇论文《Ray Bilinear Patch Intersection》。
基础知识
在光线追踪中,光线的表达形式如下:
p⃗ (t)=r⃗ +tq⃗ ,∀t≥0(1)
其中,r⃗ 表示光线的起点,向量q⃗ 表示光线的方向。光线上的任意一点p⃗ 均可由一个参数t的值确定。
双线性曲面的四个顶点(p⃗ 00,p⃗ 01,p⃗ 02,p⃗ 03)。每个点的贡献被描述为参数(u,v)的权重,任意一点p可以被如下公式表示,其中(u,v)∈[0,1]2:
p⃗ (u,v)=(1−u)(1−v)p⃗ 00+(1−u)vp⃗ 01+u(1−v)p⃗ 10+uvp⃗ 11(2)
用下列变量进行替换:
a⃗ =p⃗ 11−p⃗ 10−p⃗ 01+p⃗ 00(3.1)
b⃗ =p⃗ 10−p⃗ 00(3.2)
c⃗ =p⃗ 01−p⃗ 00(3.3)
d⃗ =p⃗ 00(3.4)
得到的双线性曲面的公式如下:
p⃗ (u,v)=uva⃗ +ub⃗ +vc⃗ +d⃗ (4)
求交过程
为了计算光线与双线性曲面的交点,设光线与双线性曲面相等:
r⃗ +tq⃗ =uva⃗ +ub⃗ +vc⃗ +d⃗ (5)
其中,t,u和v是未知的。
要解决求交问题的第一步就是要求出t:
t=(uvax+ubx+vcx+dx−rx)/qx(6.1)
t=(uvay+uby+vcy+dy−ry)/qy(6.2)
t=(uvaz+ubz+vcz+dz−rz)/qz(6.3)
目前有3个等式和3个未知数。可以通过将x和y方程设置为等于z方程并分解u和v来消除未知数t。
uv(axqz−azqx)+u(bxqz−bzqx)+v(cxqz−czqx)+(dx−rx)qz−(dz−rz)qx=0(7)
uv(ayqz−azqy)+u(byqz−bzqy)+v(cyqz−czqy)+(dy−ry)qz−(dz−rz)qy=0(8)
可以用以下变量进行替换:
A1=axqz−azqx
B1=bxqz−bzqx
C1=cxqz−czqx
D1=(dx−rx)qz−(dz−rz)qx
A2=ayqz−azqy
B2=byqz−bzqy
C2=cyqz−czqy
D2=(dy−ry)qz−(dz−rz)qy
将方程简化为以下两个方程,存在两个未知数:
uvA1+uB1+vC1+D1=0(9)
uvA2+uB2+vC2+D2=0(10)
用方程10来求解u如下:
u=(−vC2−D2)(vA2+B2)(11)
用方程9消除u可得:
(−vC2−D2)(vA2+B2)vA1+(−vC2−D2)(vA2+B2)B1+vC1+D1=0
通分合并同类项可得分子部分如下:
v2(A2C1−A1C2)+v(A2D1−A1D2+B2C1−B1C2)+(B2D1−B1D2)=0(12)
方程12是标准二次方程。解出v后,我们利用公式11去求解相关交点的u值。然而,根据曲面和光线,等式11的分母对于有效的交点可能变为零。为了解决这个问题,在求解u之前将公式7和公式8设置为相等。由此得出了u的第二个表达式:
u=v(C1−C2)+(D1−D2)v(A2−A1)+(B2−B1)(13)
通过上述推导,我们将实现光线-双线性曲面的求交算法。
算法过程
对于给定的光线和双线性曲面,可以利用算法3.1来计算交点。算法首先会调用二次方程求解函数返回v的0、1或者2个解,这取决于交点的个数,如图1所示。

图1 双线性曲面与多条光线相交,光线也许会完全错过曲面(A),与曲面相交一次(B),与曲面相交两次(C)
算法3.1过程如下:

对于v的每个解,其中v∈[0,1],相关u和t的值利用算法3.2进行计算。由于光线与双线性曲面相交数次,因此要准确地选出正确的交点。论文中的算法选择t最小时的那个交点,此时t大于或等于0。这个t对应光线与双线性曲面之间的第一个交点。
算法3.2过程如下:

当二次方程的根确定时,就将其传给算法3.2,用来计算u和t的值。由于使用公式11计算u值可能得出无效的解(原因在求交过程中已阐明),因此由公式9和10联立推导出u的第二种公式如公式13所示。算法3.3通过选择等式11和13的分母的最大绝对值来计算u值。这种方法可以确保计算出来的u值是有效的。如果u∉[0,1],则不是交点,且将不再计算(u,v)对应的t值。
算法3.3过程如下:

为了计算t的值,我们使用公式2来计算p⃗ 。对于给定的p⃗ ,我们使用公式1或6来求解t。由于光线方程的公式在求解t时存在除法,算法3.4选择q⃗ 分量绝对值最大的进行计算(避免零除)。
算法3.4过程如下:

以上就是光线-双线性曲面求交的整个过程。
参考文献
论文题目:《Ray Bilinear Patch Intersection》
出版源:《Journal of Graphics Tools》 , 2004 , 9 (3) :41-47
作者:Shaun D. Ramsey , Kristin Potter , Charles Hansen
源码下载
http://shaunramsey.com/research/bp/