在做作业的时候,发现和很多其他同学遇到一样的问题:旋转了90°。在作业3的小牛的时候,倒立的图像实在是看不过去了,就打算回头来研究一下这个问题了
学习
- 原因
参考[1][2],先说一下问题原因:代码里面传过来的近平面和远平面都是正数,但是在课程视频里面说的n, f都是负数,看范围也可以看出来是是要写成[f, n]。
- 解决
看了一下参考[1][2]中一些同学说的方法,把正负取反,以及乘以一个变换矩阵,都觉得怪怪的,所以手动推导一遍投影矩阵,直接应用这个公式看看。
透视投影矩阵推导
一些设定
-
坐标系:右手坐标系

-
向量记法:列向量
V = ( x y z 1 ) V = \begin{pmatrix} x \\ y \\ z \\ 1 \\ \end{pmatrix} V=⎝ ⎛xyz1⎠ ⎞
- 摄像机是在原点,并且朝向z轴负方向看
这个会导致空间中任意一个要归一化标准立方体的范围是[l,r]x[b,t]x[f,n]

推导过程
简单思路就是,先把透视投影矩阵转换到正交投影矩阵
- 正交投影矩阵
直接参考视频《Lecture 04 Transform Cont.》。先平移再缩放,这里因为是列向量表示法,所以是缩放矩阵x平移矩阵。
M o r t h o = [ 2 r − l 0 0 0 0 2 t − b 0 0 0 0 2 n − f 0 0 0 0 1 ] [ 1 0 0 − r + l 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ] M_{ortho} = \begin{bmatrix} \dfrac{2}{r-l} & 0 & 0 & 0 \\ 0 & \dfrac{2}{t-b} & 0 & 0 \\ 0 & 0 & \dfrac{2}{n-f} & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & -\dfrac{r+l}{2} \\ 0 & 1 & 0 & -\dfrac{t+b}{2} \\ 0 & 0 & 1 & -\dfrac{n+f}{2} \\ 0 & 0 & 0 & 1 \\ \end{bmatrix} Mortho=⎣ ⎡r−l20000t−b20000n−f200001⎦ ⎤⎣ ⎡100001000010−2r+l−2t+b−2n+f1⎦ ⎤
- 齐次坐标空间性质
对于3D空间中任意一点(x, y, z),其次坐标乘以任意一个非0的实数都表示的是3D空间中的同一个点。即(x, y, z, 1) == (xz, yz, z^2, z != 0),这里乘以特殊的z也是满足这个性质的。
- 透视投影视锥体上点投影到正交投影的立方体上
对于任意一点(x, y, z)投影到(x’, y’, z’) - y->y’

可以很容易求出来(相似三角形)
y ′ = n z y y' = \dfrac{n}{z}y y′=zny
- x->x’

同理可得
x ′ = n z x x' = \dfrac{n}{z}x x′=znx
- 根据其次坐标空间性质,变换后的点都乘以z
( n x / z n y / z ? 1 ) = ( n x n y ? z ) \begin{pmatrix} nx/z \\ ny/z \\ ? \\ 1 \\ \end{pmatrix} = \begin{pmatrix} nx \\ ny \\ ? \\ z \\ \end{pmatrix} ⎝ ⎛nx/zny/z?1⎠ ⎞=⎝ ⎛nxny?z⎠ ⎞
现在z不知道,接下来构建矩阵
M p e r s p − > o r t h o ( x y z 1 ) = ( n x / z n y / z ? z ) = ( n x n y ? z ) M_{persp->ortho} \begin{pmatrix} x \\ y \\ z \\ 1 \\ \end{pmatrix} = \begin{pmatrix} nx/z \\ ny/z \\ ? \\ z \\ \end{pmatrix} = \begin{pmatrix} nx \\ ny \\ ? \\ z \\ \end{pmatrix} Mpersp−>ortho⎝ ⎛xyz1⎠ ⎞=⎝ ⎛nx/zny/z?z⎠ ⎞=⎝ ⎛nxny?z⎠ ⎞
- 初步可得
M p e r s p − > o r t h o = [ n 0 0 0 0 n 0 0 ? ? ? ? 0 0 1 0 ] M_{persp->ortho} = \begin{bmatrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ ? & ? & ? & ? \\ 0 & 0 & 1 & 0 \\ \end{bmatrix} Mpersp−>ortho=⎣ ⎡n0?00n?000?100?0⎦ ⎤
-
根据两个特例来求上面这个矩阵
(1)对于近平面上的点,变换前后没有任何变化
(2)对于远平面上的中心点,变换前后没有变换 -
近平面上的点满足条件
M p e r s p − > o r t h o ( x y n 1 ) = [ n 0 0 0 0 n 0 0 ? ? ? ? 0 0 1 0 ] ( x y n 1 ) = ( x y n 1 ) = = ( n x n y n 2 n ) M_{persp->ortho} \begin{pmatrix} x \\ y \\ n \\ 1 \\ \end{pmatrix} = \begin{bmatrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ ? & ? & ? & ? \\ 0 & 0 & 1 & 0 \\ \end{bmatrix} \begin{pmatrix} x \\ y \\ n \\ 1 \\ \end{pmatrix} = \begin{pmatrix} x \\ y \\ n \\ 1 \\ \end{pmatrix}== \begin{pmatrix} nx \\ ny \\ n^2 \\ n \\ \end{pmatrix} Mpersp−>ortho⎝
⎛xyn1⎠
⎞=⎣
⎡n0?00n?000?100?0⎦
⎤⎝
⎛xyn1⎠
⎞=⎝
⎛xyn1⎠
⎞==⎝
⎛nxnyn2n⎠
⎞
可知第三行前面两个和xy无关,但是可能和后面两个有关,设为A和B。所以矩阵可以写成如下形式:
M p e r s p − > o r t h o = [ n 0 0 0 0 n 0 0 0 0 A B 0 0 1 0 ] M_{persp->ortho} = \begin{bmatrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & A & B \\ 0 & 0 & 1 & 0 \\ \end{bmatrix} Mp

本文详细介绍了3D透视投影矩阵的推导过程,包括设定条件、推导步骤及齐次坐标空间性质等内容,并对比了不同书籍中的差异。
最低0.47元/天 解锁文章
1182





