2022-10-29 齐次坐标与透视
一、齐次坐标
问题:两条平行线可以相交?
在欧氏空间(几何学)中,同一平面上的两条平行线不能相交,或者说不能永远相交。这是一个大家都熟悉的常识。
但是,在投影空间中就不一样了,比如,下图上的火车铁路在远离眼睛的时候会变得更窄。最后,两条平行的铁轨在地平线处相交,也就是无限远处的一点。

欧氏空间(或笛卡尔空间)能很好地描述我们的2D/3D几何,但它们不足以处理投影空间(实际上,欧氏几何是投影几何的一个子集(w=1))。一个2D点的笛卡尔坐标可以表示为(x,y)。
如果这个点远去到无穷远呢?无穷远处的点在欧氏空间中无法具体展示。在投影空间中,平行线会在无穷远处相遇,但在欧氏空间中却做不到。
那么数学家如何用数学的方法来描述这个问题呢?
解决方案: 齐次坐标
由 August Ferdinand Möbius(不错,就是那个莫比乌斯圈的那位) 提出的齐次坐标,使图形和几何学的计算在投影空间中成为可能。齐次坐标是用N+1个数来表示N维坐标的一种方式。
要制作二维齐次坐标,我们只需在现有坐标中增加一个额外的变量w。因此,笛卡尔坐标中的一点,(X,Y)在齐次坐标中就变成了(x,y,w)。而笛卡儿坐标中的X和Y在齐次坐标中的x、y和w则重新表达为
X = x/w
Y = y/w
为什么叫 “齐次”呢?
如前所述,为了将齐次坐标(x,y,w)转换为笛卡尔坐标,我们只需将x和y除以w即可。

将Homogeneous转换为Cartesian,我们可以发现一个重要的事实。让我们看看下面的例子。

如你所见 (1, 2, 3), (2, 4, 6)和(4, 8, 12)这三个点对应于同一个欧氏点(1/3, 2/3). 而任何乘以a的数(1a,2a,3a)与欧氏空间中的(1/3,2/3)是同一个点。因此,这些点是 “homogeneous/齐次 “的,因为它们在欧氏空间(或笛卡尔空间)中代表同一个点。换句话说,齐次坐标是与乘数a不相关的。

二、透视投影矩阵推导
通过第一节的描述,我们可以得出下述结论:
(x,y,z,1)与(ax,ay,az,a)代表的点在三维笛卡尔空间的是一致的,即(x,y,z)
即在顶点着色器中
将
vec4 clip_Position=u_MvpMatrix*a_Position;
gl_Position=clip_Position;
替换为:
vec4 clip_Position=u_MvpMatrix*a_Position;
gl_Position=vec4(clip_Position.x/clip_Position.w,clip_Position.y/clip_Position.w,clip_Position.z/clip_Position.w,1.0);
效果是完全一样的!
有了这个前提,现在开始透视投影矩阵的推导,首先上一张图片:

透视投影转化为设备坐标可以分为两个过程
1)所观察的物体在一个半截面的方锥形中,设坐标为P,将P投影到近截面上,坐标为P’,保留z值;如下图:

推导P'很简单,就是几何概念相似三角形,推导过程如下图:

2)P’归一化到一个长宽高都为1的立方体中,这个立方体位置在摄像机位置处

推导P'’的过程如下:
首先先明确一个概念:近截面的长为W,宽为H,那么近截面的X轴正方向坐标的最大坐标(H/2, 0),归一化到正方体上的坐标是(1,0),同理负坐标(-H/2, 0)对应到(-1,0),同理Y轴正方向(0, W/2)归一化到(0,1),Y轴负方向(0, -W/2)归一化到(0,-1)。
又因为P''和P'的坐标关系是线性关系:

而

由此可得:

然后令:θ=fov/2

同理可得:

设透视投影矩阵为:

利用齐次坐标变换
:

将系数代入矩阵,即为:

上述继续推导

最后得出矩阵
