12. 表面的定义
隐式表面 f (P) = f ( p x , p y , p z ) = 0
例子: 中心在原点,半径为r 的球
p x + p y + p z2 − r 2 = 0
2 2
显式表面
三角形▲v0v1v2表示为显示形式
t (u , v) = (1 − u − v) v 0 + uv1 + vv 2
23. OBB的创建
Eberly的方法:
原理:利用最小化技术来计算体积最小的OBB。是一种迭
代方法,其收敛速度取决于长方体的初始估计。
优点:不需要凸包计算。
设已经有一个估计的长方体,三条轴线分别为au, av, aw, 将
所有点在这三条轴线上进行投影,可以找出au 方向上的最
小值kumin和最大值kumax 。同样可以找出kvmin和kvmax 、 kwmin和
kwmax 。利用这些值计算长方体的中心:
k min + k max u k min + k max v k min + k max w
u u v v w w
ac = a + a + a
2 2 2
长方体的半边长可表示为: hl=(kumin+kumax )/2, l∈{u,v,w}。
再迭代。
初始长方体的计算:对所有可能的方向进行采样,选择长
方体最小的一组轴线最为迭代计算的初始值。
33. 射线/三角形相交测试
射线r(t)与三角形t(u,v)之间的相交计算等同于对方程r(t) = t(u,v)的求
解,得到线性方程组: t ⎛ ⎞
⎜ ⎟
( −d v1 − v 0 v 2 − v 0 )⎜ u ⎟ = o − v 0
⎜v⎟
⎝ ⎠
从而得到交点的重心坐标(u, v)和 t 值。
几何解释:把三角形平移到原点位置,然后在y方向和z方向将这个
三角形变换为单位三角形,同时将射线方向与x轴方向对齐。
73. “线/线”相交测试
两条二维直线的相交测试
假设两条直线分别为
r1 ( s ) = o1 + sd1 , 和r2 ( s ) = o 2 + sd 2
则交点为:
⊥
(O 2 − O1 ) • d 2
s= ⊥
,
d1 • d 2
⊥
(O1 − O 2 ) • d1
t= ⊥
d 2 • d1
74. 两条二维线段的相交计算
假设两条线段分别为
r1 ( s ) = p1 + s (p 2 − p1 ), 和r2 ( s ) = q1 + s (q 2 − q1 )
则交点为: − c • a⊥ c • a⊥ d
s= ⊥
= ⊥
= ,
b•a a•b f
c • b⊥ e
t= ⊥
= ,
a•b f
其中a = q 2 − q1 , b = p 2 − p1 , c = p1 − q1
伪 if (f > 0)
代 if( d < 0 or d > f ) return NO_INTERSECATION
码 else
if( d > 0 or d < f ) return NO_INTERSECATION
75. 三个平面之间的相交测试
给定3个平面,法向量为ni, 平面上各有一个任意
点pi,则其交点为:
(p1 • n1 )(n 2 × n 3 ) + (p 2 • n 2 )(n 3 × n1 ) + (p 3 • n 3 )(n ` × n 2 )
p=
n1 n 2 n 3
当三个法向行列式为0时,有平面平行,无交。