最近在学习计算机图形学,遇到了一些基本的数学知识,在此做一下记录。
在图形学中经常会遇到这样的情况:一开始的时候我们有一组标准正交基,但是由于数值计算的精度问题,这组向量在计算过程中会失去标准正交的特性。这时候,我们需要把这组接近标准正交的向量标准正交化。
施密特正交化(Gram-Schmidt Orthogonalization)
对于向量
n
→
" role="presentation" style="position: relative;"> 和
v
→
" role="presentation" style="position: relative;">
,定义
v
→
" role="presentation" style="position: relative;">
在
n
→
" role="presentation" style="position: relative;">
上的正交投影
对于
n" role="presentation" style="position: relative;"> 个向量的集合
{
v
→
0
,
v
→
1
,
…
,
v
→
n
−
1
}
" role="presentation" style="position: relative;">
,应用下述的施密特正交化过程(Gram-Schmidt
Orthogonalization)可将其转化为一组标准正交基
{
w
→
0
,
w
→
1
,
…
,
w
→
n
−
1
}
" role="presentation" style="position: relative;">
:
- 令
w
→
0
=
v
→
0
;" role="presentation" style="position: relative;">
- 对
1
≤
i
≤
n
−
1" role="presentation" style="position: relative;">
,令
w → i = v → i − ∑ j = 0 i − 1 p r o j w → j ( v → i ) ;" role="presentation" style="text-align: center; position: relative;">w ⃗ i =v ⃗ i −∑ j =0 i −1 p roj w ⃗ j (v ⃗ i ) ; w→i=v→i−∑j=0i−1projw→j(v→i) ; - 标准化:
w → i = w → i ‖ w → i ‖ ." role="presentation" style="text-align: center; position: relative;">w ⃗ i =w ⃗ i ∥ w ⃗ i ∥ . w→i=w→i‖w→i‖ .
使用叉积标准正交化三维向量集合
对于三维的向量,可以利用叉积的特性来实现标准正交化:对于三维向量的集合
{
v
→
0
,
v
→
1
,
v
→
2
}
" role="presentation" style="position: relative;">,可按下述步骤将其转化为一组标准正交基
{
w
→
0
,
w
→
1
,
w
→
2
}
" role="presentation" style="position: relative;">
:
- 令
w
→
0
=
v
→
0
/
‖
v
→
0
‖
;" role="presentation" style="position: relative;">
- 令
w → 2 = w → 0 × v → 1 ‖ w → 0 × v → 1 ‖ ;" role="presentation" style="text-align: center; position: relative;">w ⃗ 2 =w ⃗ 0 ×v ⃗ 1 ∥ w ⃗ 0 ×v ⃗ 1 ∥ ; w→2=w→0×v→1‖w→0×v→1‖ ; - 令
w
→
1
=
w
→
2
×
w
→
0
." role="presentation" style="position: relative;">
其他注意事项
可以看到,在上述两种标准正交化方法中,第一步都是从已有的向量集中选取一个向量直接加入到结果集中,这个被选取的向量在转化前后的方向保持不变。在图形学的应用中,这个方向保持不变的向量的选择有时候是很重要的,比如在摄像机的取向问题上,我们一般希望能保持摄像机所看向的方向保持不变,这时就应该选择摄像机看向的方向作为该向量。我们应当根据特定的应用需求,正确地选择这个方向保持不变的向量。