提问:在现实生活中我们如何将一个三维的世界变成一个二维的平面
- 我们在三维世界中准备好一些模型(模型变换 model transformation)
- 我们架设好我们的相机(视图变换 view transformation)
- 我们将模型投影到我们的相机上(投影变换 projection transformation)
在计算机图形学中将这三步简称为MVG
- 定义该 veiw 的位置e
- 定义向什么地方看g^(look-at/gaze direction)
- 定义一个向上的方向t^
在计算机图形学中我们通常将view的位置e 放在原点,将view的朝向g^ 与 -Z 重合,将视图的上方向t^ 与 Y 重合
view-transformationTview=000000000000−Xe−Ye−Ze1
- 旋转到 g^,t^ 与
-Z,Y重合并不是很方便计算,但我们可以先反过来求-Z,Y 与 g^,t^重合
Rview−=xg×tyg×tzg×t0xtytzt0x−gy−gz−g00001
- 我们再求逆就可以获得旋转后的视图矩阵,且因为旋转矩阵为正交矩阵,正交矩阵的逆等于它的转置
Rview=xg×txtx−g0yg×tyty−g0zg×tztz−g00001
正交于正交矩阵
正交是指两个向量之间的夹角为 90 度,即它们垂直且不相关。两个正交向量之积为 0,也就是说它们没有共同的方向,因此可以相互抵消。正交性对分析几何中的物理性质非常重要,例如在力学和电磁学中,它们可以用来表示不同的力或不同的电磁场。
正交矩阵是一种特殊的矩阵,它具有以下特性:它的列向量之间相互正交、它的行向量之间相互正交,而且它的转置也是它自己(即 AT=A)
我们先进行平移变换Tview然后在进行旋转变换Rview就可以得到视图变换Mview
Mview=RviewTview
投影分为
projection-transformation我们先定义一个立方体,用[l,r]表示左和右,用[t,b]表示上和下,用[f,n]表示远和近,然后我们将这个立方体先平移到中心与原点对齐,再将他们的宽度都缩放成各方向长度都为2的标准矩阵
因为我们是从 -Z 往里看的,所以这里的n实际上是大于f的
projection-transformationMortho=r−l20000t−b20000n−f200001100001000010−2r+l−2t+b−2n+f1
在透视投影中,我们可以将它简单的分为两步
- 我们先将投影的远平面f挤压到与近平面n的长宽都有一样
- 然后我们在做一次正交投影就好了

我们先观察其中当个向量的变化

不难发现这实际上是一个相识三角形,从中我们可以得出
y′=zny
同理
x′=znx
在奇次坐标中
(xyz1)=(kxkykzk=0)=(zxzyz2z=0)
它们表示的都是空间中的同一个点
xyz1=>nx/zny/zunknown1==nxnystill unknownz
这样我们可以得出压缩矩形的前两行
Mp−>o=n0?00n?000?100?0
现在我们只剩下z列没有求出来,我们再观察压缩模型
perspective-orthographic- 在近平面n的任何一个点的(xyz)都不会发生变化
- 在远平面f的任何一个点的z也不会发生变化
所以在近平面n中,我们可以却定z行的前两列为0,切它经过矩阵之后永远等于它自己
xyn1=>xyn1==xnynn2n(00AB)xyn1=n2
即
An+B=n2
在远屏幕f上
00f1=>00f1==00f2fAf+B=f2
将以上两个方程组成方程组
{An+B=n2Af+B=f2得出:{A=n+fB=−fn
这里我们就补全了我们的压缩矩阵
Mp−>o=n0000n0000n+f100−fn0
perspective-orthographic- 在近平面n的任何一个点的(xyz)都不会发生变化
- 在远平面f的任何一个点的z也不会发生变化
现在我们只要将压缩后的视图进行正交投影就得到了我们的透视投影的矩阵
Mpresp=MorthoMp−>o
疑问?: 当nf中间的任意一个平面被压缩时它的z是远离我们的近平面还是靠近?
我们带入一个特殊的平面2n+f
(xy2n+f 1)00 n+f−fn=2(n+f)2−fn=2n2+f2
因为:
2n2+f2>0
所z′一定是远离z的