计算机图形学中的许多技术,例如光线追踪,均需要计算光线与物体之间的交点。通常情况下,求交的物体可能是球体、三角形或多边形,但其他类型的表面也是有可能的。这里,我们将讨论光线和双线性曲面之间的求交计算。
本文中的算法来自犹他大学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/