假设现在世界空间里的3个坐标轴为
x
=
(
1
,
0
,
0
)
T
\boldsymbol{x}=\left( 1,0,0 \right) ^T
x=(1,0,0)T,
y
=
(
0
,
1
,
0
)
T
\boldsymbol{y}=\left(0,1,0\right)^T
y=(0,1,0)T,
z
=
(
0
,
0
,
1
)
T
\boldsymbol{z}=\left(0,0,1\right)^T
z=(0,0,1)T,局部空间中使用的三个坐标轴为
u
\boldsymbol{u}
u,
v
\boldsymbol{v}
v,
w
\boldsymbol{w}
w,则假设局部空间的旋转矩阵为
O
2
W
\boldsymbol{O2W}
O2W,即经过此矩阵变换,能在保持相对空间中的
x
\boldsymbol{x}
x,
y
\boldsymbol{y}
y,
z
\boldsymbol{z}
z相互垂直的情况下,将其旋转至和世界空间
u
\boldsymbol{u}
u,
v
\boldsymbol{v}
v,
w
\boldsymbol{w}
w朝向完全重合.用矩阵运算表示即为:
(
O
2
W
)
x
=
u
\left( \boldsymbol{O}2\boldsymbol{W} \right) \boldsymbol{x}=\boldsymbol{u}
(O2W)x=u
(
O
2
W
)
y
=
v
\left( \boldsymbol{O}2\boldsymbol{W} \right) \boldsymbol{y}=\boldsymbol{v}
(O2W)y=v
(
O
2
W
)
z
=
w
\left( \boldsymbol{O}2\boldsymbol{W} \right) \boldsymbol{z}=\boldsymbol{w}
(O2W)z=w
我们先来关注下第一个式子,将其展开,即为
[
?
?
?
?
?
?
?
?
?
]
[
1
0
0
]
=
[
u
x
u
y
u
z
]
\left[ \begin{matrix} ?& ?& ?\\ ?& ?& ?\\ ?& ?& ?\\ \end{matrix} \right] \left[ \begin{array}{c} 1\\ 0\\ 0\\ \end{array} \right] =\left[ \begin{array}{c} u_x\\ u_y\\ u_z\\ \end{array} \right]
⎣⎡?????????⎦⎤⎣⎡100⎦⎤=⎣⎡uxuyuz⎦⎤
看到这个应该就能立马得到第一列即为
u
\boldsymbol{u}
u,故
[
u
x
?
?
u
y
?
?
u
z
?
?
]
[
1
0
0
]
=
[
u
x
u
y
u
z
]
\left[ \begin{matrix} u_x& ?& ?\\ u_y& ?& ?\\ u_z& ?& ?\\ \end{matrix} \right] \left[ \begin{array}{c} 1\\ 0\\ 0\\ \end{array} \right] =\left[ \begin{array}{c} u_x\\ u_y\\ u_z\\ \end{array} \right]
⎣⎡uxuyuz??????⎦⎤⎣⎡100⎦⎤=⎣⎡uxuyuz⎦⎤
同理,我们运用第二三个式子则可以推断出
O
2
W
\boldsymbol{O2W}
O2W的最终形式:
O
2
W
=
[
u
x
v
x
w
x
u
y
v
y
w
y
u
z
v
z
w
z
]
\boldsymbol{O}2\boldsymbol{W}=\left[ \begin{matrix} u_x& v_x& w_x\\ u_y& v_y& w_y\\ u_z& v_z& w_z\\ \end{matrix} \right]
O2W=⎣⎡uxuyuzvxvyvzwxwywz⎦⎤
则它的逆矩阵
W
2
O
\boldsymbol{W2O}
W2O,也可轻松获得,因为
O
2
W
\boldsymbol{O2W}
O2W是正交矩阵,故其逆矩阵就等于它的转置,即
W
2
O
=
[
u
x
u
y
u
z
v
x
v
y
v
z
w
x
w
y
w
z
]
\boldsymbol{W}2\boldsymbol{O}=\left[ \begin{matrix} u_x& u_y& u_z\\ v_x& v_y& v_z\\ w_x& w_y& w_z\\ \end{matrix} \right]
W2O=⎣⎡uxvxwxuyvywyuzvzwz⎦⎤
这个矩阵的含义为已知世界空间中的坐标,则右乘
W
2
O
\boldsymbol{W2O}
W2O就可得到局部空间中的坐标,如:
W
2
O
⋅
u
=
[
u
x
u
y
u
z
v
x
v
y
v
z
w
x
w
y
w
z
]
[
u
x
u
y
u
z
]
=
[
1
0
0
]
\boldsymbol{W}2\boldsymbol{O}\cdot \boldsymbol{u}=\left[ \begin{matrix} u_x& u_y& u_z\\ v_x& v_y& v_z\\ w_x& w_y& w_z\\ \end{matrix} \right] \left[ \begin{array}{c} u_x\\ u_y\\ u_z\\ \end{array} \right] =\left[ \begin{array}{c} 1\\ 0\\ 0\\ \end{array} \right]
W2O⋅u=⎣⎡uxvxwxuyvywyuzvzwz⎦⎤⎣⎡uxuyuz⎦⎤=⎣⎡100⎦⎤
上述式子根据正交性得到.所以可以看到世界坐标下的
u
\boldsymbol{u}
u经变换得到了它的局部坐标
[
1
,
0
,
0
]
T
\left[ 1,0,0 \right] ^T
[1,0,0]T
现在一旦我们掌握了上述内容就可以轻松推导出视角矩阵,即view矩阵,view矩阵即把世界坐标的点转换到视角空间,眼的坐标为
(
c
x
,
c
y
,
c
z
)
\left( c_x,c_y,c_z \right)
(cx,cy,cz)
世界坐标系下的圆柱中心为
(
h
x
,
h
y
,
h
z
)
\left( h_x,h_y,h_z \right)
(hx,hy,hz),
我们不妨把这个过程拆开想一下,先把眼移动到原点的位置,则因为圆柱和眼的相对位置不变,故其也应跟眼睛应用同样的变换
那么接下来显然只需旋转
u
\boldsymbol{u}
u,
v
\boldsymbol{v}
v,
w
\boldsymbol{w}
w轴,使其与
x
\boldsymbol{x}
x,
y
\boldsymbol{y}
y,
z
\boldsymbol{z}
z重合,即应用
W
2
O
\boldsymbol{W2O}
W2O旋转矩阵,同理,圆柱因为与眼睛的相对关系不变所以也跟着旋转,用图像表示这一过程:
用矩阵形式表述上面的转换过程则为:
V
i
e
w
=
W
2
O
⋅
T
=
[
u
x
u
y
u
z
0
v
x
v
y
v
z
0
w
x
w
y
w
z
0
0
0
0
1
]
[
1
0
0
−
c
x
0
1
0
−
c
y
0
0
1
−
c
z
0
0
0
1
]
=
[
u
x
u
y
u
z
−
c
⋅
u
v
x
v
y
v
z
−
c
⋅
v
w
x
w
y
w
z
−
c
⋅
w
0
0
0
1
]
\boldsymbol{View}=\boldsymbol{W}2\boldsymbol{O}\cdot \boldsymbol{T}=\left[ \begin{matrix} u_x& u_y& u_z& 0\\ v_x& v_y& v_z& 0\\ w_x& w_y& w_z& 0\\ 0& 0& 0& 1\\ \end{matrix} \right] \left[ \begin{matrix} 1& 0& 0& -c_x\\ 0& 1& 0& -c_y\\ 0& 0& 1& -c_z\\ 0& 0& 0& 1\\ \end{matrix} \right] \\ =\left[ \begin{matrix} u_x& u_y& u_z& -\boldsymbol{c}\cdot \boldsymbol{u}\\ v_x& v_y& v_z& -\boldsymbol{c}\cdot \boldsymbol{v}\\ w_x& w_y& w_z& -\boldsymbol{c}\cdot \boldsymbol{w}\\ 0& 0& 0& 1\\ \end{matrix} \right]
View=W2O⋅T=⎣⎢⎢⎡uxvxwx0uyvywy0uzvzwz00001⎦⎥⎥⎤⎣⎢⎢⎡100001000010−cx−cy−cz1⎦⎥⎥⎤=⎣⎢⎢⎡uxvxwx0uyvywy0uzvzwz0−c⋅u−c⋅v−c⋅w1⎦⎥⎥⎤