观察矩阵推导
顾名思义,观察矩阵的作用就是将一个点从世界坐标系转换到观察坐标系,这个点的实际位置并不发生变化。参考上一篇文章,问题就转化成了,假设任意点
p
⃗
\vec p
p,它在世界坐标系
W
W
W下的坐标为
(
x
,
y
,
z
)
(x, y, z)
(x,y,z),求在观察坐标系
V
V
V下的坐标
(
x
′
,
y
′
,
z
′
)
(x', y', z')
(x′,y′,z′)。套用公式,可得:
p
⃗
=
x
′
i
⃗
V
+
y
′
j
⃗
V
+
z
′
k
⃗
V
+
o
⃗
V
=
x
i
⃗
W
+
y
j
⃗
W
+
z
k
⃗
W
+
o
⃗
W
\vec p = x'\vec i_V + y'\vec j_V + z'\vec k_V + \vec o_V = x\vec i_W + y\vec j_W + z\vec k_W + \vec o_W
p=x′iV+y′jV+z′kV+oV=xiW+yjW+zkW+oW
其中
o
o
o为坐标系的原点坐标。将上述基向量看作世界坐标系
W
W
W下的向量,可以写成矩阵形式:
[
x
,
y
,
z
,
1
]
=
[
x
′
,
y
′
,
z
′
,
1
]
⋅
[
i
⃗
V
0
j
⃗
V
0
k
⃗
V
0
o
⃗
V
1
]
[x,y,z,1] = [x',y',z', 1] \cdot \begin{bmatrix} \vec i_V & 0 \\ \vec j_V & 0 \\ \vec k_V & 0 \\ \vec o_V & 1 \end{bmatrix}
[x,y,z,1]=[x′,y′,z′,1]⋅⎣⎢⎢⎡iVjVkVoV0001⎦⎥⎥⎤
其中,
i
⃗
V
,
j
⃗
V
,
k
⃗
V
,
o
⃗
V
\vec i_V,\vec j_V,\vec k_V, \vec o_V
iV,jV,kV,oV是观察坐标系
V
V
V的基向量和原点在世界坐标系
W
W
W的表示。一般来说,建立观察矩阵提供的参数是摄像机的世界坐标
(
Q
x
,
Q
y
,
Q
z
)
(Q_x, Q_y, Q_z)
(Qx,Qy,Qz),摄像机观察的目标点的世界坐标
(
T
x
,
T
y
,
T
z
)
(T_x, T_y, T_z)
(Tx,Ty,Tz),代表世界up方向的向量
(
U
x
,
U
y
,
U
z
)
(U_x, U_y, U_z)
(Ux,Uy,Uz)。分别求出上面矩阵的各个向量:
o
⃗
V
=
(
Q
x
,
Q
y
,
Q
z
)
\vec o_V = (Q_x, Q_y, Q_z)
oV=(Qx,Qy,Qz)
k ⃗ V = ( T x − Q x , T y − Q y , T z − Q Z ) \vec k_V = (T_x - Q_x, T_y - Q_y, T_z - Q_Z) kV=(Tx−Qx,Ty−Qy,Tz−QZ)
i ⃗ V = u p ⃗ × k ⃗ v \vec i_V = \vec{up} \times \vec k_v iV=up×kv
j ⃗ v = k ⃗ v × i ⃗ v \vec j_v = \vec k_v \times \vec i_v jv=kv×iv
注意要将它们进行归一化。归一化之后,可以得到
[
x
′
,
y
′
,
z
′
,
1
]
=
[
x
,
y
,
z
,
1
]
⋅
[
i
⃗
V
0
j
⃗
V
0
k
⃗
V
0
o
⃗
V
1
]
−
1
=
[
x
,
y
,
z
,
1
]
⋅
(
[
i
⃗
V
0
j
⃗
V
0
k
⃗
V
0
0
1
]
⋅
[
1
0
0
0
0
1
0
0
0
0
1
0
o
⃗
V
1
]
)
−
1
=
[
x
,
y
,
z
,
1
]
⋅
(
[
1
0
0
0
0
1
0
0
0
0
1
0
−
o
⃗
V
1
]
⋅
[
i
⃗
V
j
⃗
V
k
⃗
V
0
0
0
0
1
]
)
=
[
x
,
y
,
z
,
1
]
⋅
[
i
x
j
x
k
x
0
i
y
j
y
k
y
0
i
z
j
z
k
z
0
−
o
⃗
V
⋅
i
⃗
V
−
o
⃗
V
⋅
j
⃗
V
−
o
⃗
V
⋅
k
⃗
V
1
]
[x',y',z',1] = [x,y,z,1] \cdot \begin{bmatrix} \vec i_V & 0 \\ \vec j_V & 0 \\ \vec k_V & 0 \\ \vec o_V & 1 \end{bmatrix}^{-1} \\ = [x,y,z,1] \cdot (\begin{bmatrix} \vec i_V & 0 \\ \vec j_V & 0 \\ \vec k_V & 0 \\ 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0\\ & \vec o_V & & 1 \end{bmatrix})^{-1} \\ = [x,y,z,1] \cdot (\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0\\ & -\vec o_V & & 1 \end{bmatrix} \cdot \begin{bmatrix} \vec i_V & \vec j_V & \vec k_V & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}) \\ = [x,y,z,1] \cdot \begin{bmatrix} i_x & j_x & k_x & 0 \\ i_y & j_y & k_y & 0 \\ i_z & j_z & k_z & 0\\ -\vec o_V \cdot \vec i_V & -\vec o_V \cdot \vec j_V & -\vec o_V \cdot \vec k_V & 1 \end{bmatrix}
[x′,y′,z′,1]=[x,y,z,1]⋅⎣⎢⎢⎡iVjVkVoV0001⎦⎥⎥⎤−1=[x,y,z,1]⋅(⎣⎢⎢⎡iVjVkV00001⎦⎥⎥⎤⋅⎣⎢⎢⎡100010oV0010001⎦⎥⎥⎤)−1=[x,y,z,1]⋅(⎣⎢⎢⎡100010−oV0010001⎦⎥⎥⎤⋅[iV0jV0kV001])=[x,y,z,1]⋅⎣⎢⎢⎡ixiyiz−oV⋅iVjxjyjz−oV⋅jVkxkykz−oV⋅kV0001⎦⎥⎥⎤
这就是我们最终要求的观察矩阵。