来自《Fundamentals of computer graphic》2.4.6 和 2.4.7。
我们经常需要一组与某个给定向量对齐的正交基底。
即,给定一个向量
a
\mathbf{a}
a,我们需要一组正交向量
u
,
v
,
w
\mathbf{u},\mathbf{v},\mathbf{w}
u,v,w
其中
w
\mathbf{w}
w和
a
\mathbf{a}
a有相同的方向,但是我们不关心
u
,
v
\mathbf{u},\mathbf{v}
u,v具体是什么。一个向量不足以唯一地确定基底,我们只是需要一种鲁棒的机制来找到其中任意一种可能基底。
首先,使得
w
\mathbf{w}
w 是
a
\mathbf{a}
a 方向上的一个单位向量:
w
=
a
∥
a
∥
\mathbf{w}=\frac{\mathbf{a}}{\| \mathbf{a} \|}
w=∥a∥a
然后,选取同
w
\mathbf{w}
w 不共线的任意一个向量
t
\mathbf{t}
t,如下构建一个正交于向量
w
\mathbf{w}
w 的单位向量
u
\mathbf{u}
u:
u
=
t
×
w
∥
t
×
w
∥
\mathbf{u} = \frac{\mathbf{t} \times \mathbf{w}}{ \|\mathbf{t} \times \mathbf{w}\| }
u=∥t×w∥t×w
叉积交换顺序也可以,但是需要确定得到的基底是右手坐标系。
如果
t
\mathbf{t}
t 和
w
\mathbf{w}
w共线或者接近共线,结果都不准确。
一个简单的机制是从
w
\mathbf{w}
w 开始构造
t
\mathbf{t}
t,首先令
t
\mathbf{t}
t 等于
w
\mathbf{w}
w,然后将其分量中绝对值最小的分量改为 1。
举个例子,如果
w
=
(
1
/
2
,
−
1
/
2
,
0
)
\mathbf{w} =(1/\sqrt{2},-1/\sqrt{2},0)
w=(1/2,−1/2,0),那么,
t
=
(
1
/
2
,
−
1
/
2
,
1
)
\mathbf{t} =(1/\sqrt{2},-1/\sqrt{2},1)
t=(1/2,−1/2,1) 。
在知道
w
\mathbf{w}
w 和
u
\mathbf{u}
u后,
v
=
w
×
u
\mathbf{v} = \mathbf{w} \times \mathbf{u}
v=w×u
使用这种构造方法的一个场景是表面上色。一组和表面法线对齐的基底是需要的,但是关于发现的旋转是不重要的。
一个常见的例子是为一个相机构造一组基底;沿着相机看的方向有一个对齐的向量是重要的,但是围绕这个向量的旋转并不是任意的,而且这需要以某种方式指定。一旦确定了旋转,这组基底就完全决定了。
完全指定一帧的方法是通过提供两个向量
a
\mathbf{a}
a(指定
w
\mathbf{w}
w)和
b
\mathbf{b}
b(指定
v
\mathbf{v}
v)。如果这两个向量是正交的,那么构造第三个向量的简单的方法是通过
u
=
b
×
a
\mathbf{u}=\mathbf{b} \times \mathbf{a}
u=b×a。
u = a × b \mathbf{u}=\mathbf{a} \times \mathbf{b} u=a×b 也是构造一组正交基,但是这是左手坐标系。
为了得到正交基底,即使输入的向量不正交,我们需要如下操作:
w
=
a
∥
a
∥
\mathbf{w} = \frac{\mathbf{a}}{\| \mathbf{a}\|}
w=∥a∥a
u
=
b
×
w
∥
b
×
w
∥
\mathbf{u} = \frac{\mathbf{b} \times \mathbf{w}}{ \|\mathbf{b} \times \mathbf{w}\| }
u=∥b×w∥b×w
v
=
w
×
u
\mathbf{v} = \mathbf{w} \times \mathbf{u}
v=w×u
如果
a
\mathbf{a}
a 和
b
\mathbf{b}
b平行,上述方法失效。在这种情况下,
b
\mathbf{b}
b对于选择我们应该使用的与
a
\mathbf{a}
a 正交的方向没有帮助。
在指定摄像机位置的例子中(本书 Section 4.3),我们想要构造一个帧:拥有平行于摄像机所观察的方向 w \mathbf{w} w,并且 v \mathbf{v} v应该指向摄像机的顶部。