观察矩阵推导

顾名思义,观察矩阵的作用就是将一个点从世界坐标系转换到观察坐标系,这个点的实际位置并不发生变化。参考上一篇文章,问题就转化成了,假设任意点(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 = xvec i_W + yvec j_W + zvec k_W + vec o_W ]

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

[[x,y,z,1] = [x',y',z', 1] cdot egin{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} imes vec k_v ]

[vec j_v = vec k_v imes vec i_v ]

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

[[x',y',z',1] = [x,y,z,1] cdot egin{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 (egin{bmatrix} vec i_V & 0 \ vec j_V & 0 \ vec k_V & 0 \ 0 & 1 end{bmatrix} cdot egin{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 (egin{bmatrix} 1 & 0 & 0 & 0 \ 0 & 1 & 0 & 0 \ 0 & 0 & 1 & 0\ & -vec o_V & & 1 end{bmatrix} cdot egin{bmatrix} vec i_V & vec j_V & vec k_V & 0 \ 0 & 0 & 0 & 1 end{bmatrix}) \ = [x,y,z,1] cdot egin{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} ]

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

原文地址:https://www.cnblogs.com/back-to-the-past/p/12245818.html