详细的世界坐标转屏幕坐标及投影矩阵的推导

投影矩阵网上推导一大堆,怎么构建矩阵,怎么运用透视除法等都有说,但说清楚为什么这样做的貌似不多。我现在尝试用矩阵乘法的本质去说明投影矩阵是怎么推导的。

以下向量统一用列向量表示法。

1.坐标转换 

坐标的表达形式(Fundamentals of Computer Graphics, 4th page 135)

看上图,p在世界坐标系下的坐标值有两种表示法:

p=o+x_{p}x+y_{p}y           

 p=e+u_{p}u+v_{p}v  

其中:

(x_{p},y_{p})=(2.5,0.9)

(u_{p},v_{p})=(0.5,-0.7)

u,v是e坐标系下的标准正交基。

从图中可以看到,p在o坐标系下的坐标是(2.5,0.9),在e坐标系下是(0.5,-0.7)。

但按上面两个公式,算出来的值都是(2.5,0.9)。

我们把 p=e+u_{p}u+v_{p}v 的方程化为矩阵:

从矩阵可以看出(x,y)->(u,v)的转换关系。如下式:

那么,e坐标系下的坐标可由下式求的:

\begin{bmatrix} u_{p}\\ v_{p}\\ 1 \end{bmatrix}= {\begin{bmatrix} u &v &e \\ 0 & 0& 1 \end{bmatrix}}^{-1}p_{xy}

由于[u v]是正交矩阵,所以有:

\begin{bmatrix} u &v \end{bmatrix}^{-1} =\begin{bmatrix} u &v \end{bmatrix}^{t} =\begin{bmatrix} u^{t}\\ v^{t} \end{bmatrix}

\begin{bmatrix} u_{p}\\ v_{p}\\ 1 \end{bmatrix}= \begin{bmatrix} x_{u} &y_{u} &0 \\ x_{v} & y_{v} & 0\\ 0 &0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 &-x_{e} \\ 0 & 1 &-y_{e} \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x_{p}\\ y_{p}\\ 1 \end{bmatrix}

说了这么多,目的是为了引出下面的推导,世界坐标转到摄像机空间坐标

上式可写为:

\begin{bmatrix} u_{p}\\ v_{p}\\ 1 \end{bmatrix}= \begin{bmatrix} u^t &0 \\ v^t & 0\\ 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 &-x_{e} \\ 0 & 1 &-y_{e} \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x_{p}\\ y_{p}\\ 1 \end{bmatrix}

2.摄像机矩阵推导

先明确一点:这里说的摄像机矩阵是指世界空间到摄像机的矩阵

摄像机空间的三个基分别是向量right,up,look,世界空间中的位置是P。以R表示摄像机right向量,U表示up向量,V表示look向量,我们的目的是把R,U,V三个向量分别转换到x,y,z向量。

由于这个向量比较难转换,我们换种思路,把x,y,z轴转到RUV的矩阵是:

R_{view}^{-1} = \begin{bmatrix} R_{x} & U_{x} & V_{x} & 0\\R_{y} & U_{y} & V_{y} & 0\\ R_{z} & U_{z} & V_{z} & 0\\ 0 & 0 & 0 & 1 \end{bmatrix}

由于该矩阵是正交矩阵,那么有

R_{view} = (R_{view}^{-1})^{t} = \begin{bmatrix} R^t & 0\\ U^t & 0\\ V^t & 0\\ 0 & 1 \end{bmatrix} =\begin{bmatrix} R_{x} & R_{y} & R_{z} & 0\\U_{x} & U_{y} & U_{z} & 0\\ V_{x} & V_{y} & V_{z} & 0\\ 0 & 0 & 0 & 1 \end{bmatrix}

回想一下,在空间中绕一点P旋转,是不是,可以看成先把P移到原点,然后旋转,再移动回P点上。

而摄像机空间,是把摄像机的坐标移动到原点,再把各个轴旋转到xyz轴上。

假设摄像机世界坐标是P,矩阵如下:

透视投影变换矩阵的推导过程如下: 假设有一个三维点 $(X,Y,Z)$,它在相机坐标系中的坐标为 $(X_c,Y_c,Z_c)$。相机坐标系的原点为相机位置,$Z_c$ 轴指向相机朝向的反方向,$X_c$ 和 $Y_c$ 轴分别与相机的右方向和下方向对齐。 为了把相机坐标系中的点映射到图像平面上,我们需要进行透视投影变换。首先,我们将相机坐标系中的点换为齐次坐标 $(X_c,Y_c,Z_c,1)$。然后,我们将它乘以一个投影矩阵 $P$,得到一个新的齐次坐标 $(u,v,w,1)$: $$ \begin{bmatrix} u \\ v \\ w \\ 1 \\ \end{bmatrix} = P \cdot \begin{bmatrix} X_c \\ Y_c \\ Z_c \\ 1 \\ \end{bmatrix} $$ 其中,$u$ 和 $v$ 分别表示图像平面上的坐标,$w$ 用来进行透视除法,保证 $u$ 和 $v$ 的值在图像平面上。 投影矩阵 $P$ 可以分解为相机内参矩阵 $K$ 和相机外参矩阵 $[R|t]$ 的乘积: $$ P = K [R|t] $$ 其中,$K$ 是一个 $3 \times 3$ 的矩阵,包含了相机的内部参数,如焦距、主点等。$[R|t]$ 是一个 $3 \times 4$ 的矩阵,包含了相机的外部参数,如相机的旋和平移。 为了推导 $P$ 的具体形式,我们可以先考虑一个简单的情况:相机坐标系的原点与图像平面重合,且相机的朝向与图像平面平行。这种情况下,投影矩阵可以表示为: $$ P = \begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix} $$ 其中,$f$ 是焦距,表示相机到图像平面的距离。 当相机坐标系的原点和图像平面不重合时,我们可以使用相机外参矩阵 $[R|t]$ 来把相机坐标系的原点变换到图像平面上。具体来说,我们可以将相机坐标系的原点变换为 $(X_c',Y_c',Z_c')$,其中 $(X_c',Y_c',0)$ 是图像平面上的点。这个变换可以表示为: $$ \begin{bmatrix} X_c' \\ Y_c' \\ Z_c' \\ 1 \\ \end{bmatrix} = [R|t] \cdot \begin{bmatrix} 0 \\ 0 \\ 0 \\ 1 \\ \end{bmatrix} $$ 然后,我们可以把 $(X,Y,Z)$ 变换为 $(X',Y',Z')$,其中 $(X',Y')$ 是图像平面上的坐标。这个变换可以表示为: $$ \begin{bmatrix} X' \\ Y' \\ Z' \\ 1 \\ \end{bmatrix} = [R|t] \cdot \begin{bmatrix} X \\ Y \\ Z \\ 1 \\ \end{bmatrix} $$ 最后,我们可以将 $(X',Y',Z')$ 投影到图像平面上,得到一个新的齐次坐标 $(u,v,w,1)$。这个投影可以表示为: $$ \begin{bmatrix} u \\ v \\ w \\ 1 \\ \end{bmatrix} = K \cdot \begin{bmatrix} X'/Z' \\ Y'/Z' \\ 1 \\ \end{bmatrix} $$ 将以上三个变换组合起来,我们可以得到透视投影变换矩阵的形式: $$ P = K [R|t] = \begin{bmatrix} f_x & 0 & c_x & 0 \\ 0 & f_y & c_y & 0 \\ 0 & 0 & 1 & 0 \\ \end{bmatrix} \begin{bmatrix} r_{11} & r_{12} & r_{13} & t_1 \\ r_{21} & r_{22} & r_{23} & t_2 \\ r_{31} & r_{32} & r_{33} & t_3 \\ \end{bmatrix} $$ 其中,$f_x$ 和 $f_y$ 是 $K$ 矩阵的对角线元素,分别表示 $x$ 和 $y$ 方向上的焦距;$c_x$ 和 $c_y$ 是 $K$ 矩阵的中心点,表示图像平面上的主点;$r_{ij}$ 和 $t_i$ 是 $[R|t]$ 矩阵的元素,表示相机的旋和平移。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值