首页 > 技术文章 > 观察矩阵推导

back-to-the-past 2020-01-31 16:41 原文

顾名思义,观察矩阵的作用就是将一个点从世界坐标系转换到观察坐标系,这个点的实际位置并不发生变化。参考上一篇文章,问题就转化成了,假设任意点\(\vec p\),它在世界坐标系\(W\)下的坐标为\((x, y, z)\),求在观察坐标系\(V\)下的坐标\((x', y', z')\)。套用公式,可得:

\[\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 \]

其中\(o\)为坐标系的原点坐标。将上述基向量看作世界坐标系\(W\)下的向量,可以写成矩阵形式:

\[[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} \]

其中,\(\vec i_V,\vec j_V,\vec k_V, \vec o_V\)是观察坐标系\(V\)的基向量和原点在世界坐标系\(W\)的表示。一般来说,建立观察矩阵提供的参数是摄像机的世界坐标\((Q_x, Q_y, Q_z)\),摄像机观察的目标点的世界坐标\((T_x, T_y, T_z)\),代表世界up方向的向量\((U_x, U_y, U_z)\)。分别求出上面矩阵的各个向量:

\[\vec o_V = (Q_x, Q_y, Q_z) \]

\[\vec k_V = (T_x - Q_x, T_y - Q_y, T_z - Q_Z) \]

\[\vec i_V = \vec{up} \times \vec k_v \]

\[\vec j_v = \vec k_v \times \vec i_v \]

注意要将它们进行归一化。归一化之后,可以得到

\[[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} \]

这就是我们最终要求的观察矩阵。

推荐阅读