矩阵的几何意义

变换transform

变换指的是,把一些数据,如点方向矢量颜色等通过一定方式进行转换的过程。

线性变换

保留矢量加和标量乘的变换,满足$f(x)+f(y)=f(x+y)$ 和 $kf(x)=f(kx)​$

#####缩放

旋转
错切
镜像
正交投影

平移变换

平移变换不满足线性变换

仿射变换

3x3矩阵不能表示平移操作,所以扩展到了4x4矩阵,成为齐次坐标空间homogeneous space,当使用4x4矩阵对一个点进行变换时,平移,缩放,旋转都会施加于该点,但如果对于一个方向矢量,平移的效果就会被忽略。

齐次坐标

齐次坐标 是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易于进行仿射(线性)几何变换。

  • 普通坐标到齐次坐标
    如果是一个点(1,4,7),则变为(1,4,7,1)
    如果是一个向量(x,y,z),则变为(x, y, z, 0)

  • 齐次坐标转换成普通坐标时

    如果是(x,y,z,1),则知道它是个点,变成(x,y,z)
    如果是(x,y,z,0),则知道它是个向量,仍然变成(x,y,z)

  • 对于一个普通坐标的P=(Px, Py, Pz),有对应的一族齐次坐标(wPx, wPy, wPz, w),其中w不等于零。比如,P(1, 4, 7)的齐次坐标有(1, 4, 7, 1)、(2, 8, 14, 2)、(-0.1, -0.4, -0.7, -0.1)等等。因此,如果把一个点从普通坐标变成齐次坐标,给x,y,z乘上同一个非零数w,然后增加第4个分量w;如果把一个齐次坐标转换成普通坐标,把前三个坐标同时除以第4个坐标,然后去掉第4个分量

    由于齐次坐标使用了4个分量来表达3D概念,使得平移变换可以使用矩阵进行,从而如F.S. Hill, JR所说,仿射(线性)变换的进行更加方便。由于图形硬件已经普遍地支持齐次坐标与矩阵乘法,因此更加促进了齐次坐标使用,使得它似乎成为图形学中的一个标准。

  • 在unity中 可用在剪裁空间中 使得w有特殊含义

  • 齐次坐标使得平移变换可以用矩阵进行,正如fshill jr所说的仿射变换更加方便

坐标空间

模型空间
世界空间
观察空间

是摄像机空间,以摄像机为原点属于右手坐标系,+x指向右边+y指向上方+z指向摄像机的后方即unity世界坐标系的-z方向,这符合openGL

剪裁空间

clip space 也被称为齐次剪裁空间,用于变换的矩阵叫做剪裁矩阵clip matrix 或者投影矩阵projection matrix
视椎体是空间的一个区域有六个剪裁平面组成,分透视投影和正交投影
近剪裁平面和远剪裁平面
透视投影的视椎体是一个金字塔形,侧面的4个剪裁平面将会在摄像机处相交
正交投影的视椎体是一个长方体
如果直接使用视椎体定义的空间进行剪裁,那么不同的视椎体需要不同的处理过程,而且对于透视投影的视椎体来说,想要判断一个顶点是否处在一个金字塔内部是比较麻烦的。因此需要用一种更加通用的、方便的、和整洁的方式进行裁剪工作,这种方式就是通过一投影矩阵把顶点转换到一个裁剪空间中。
投影矩阵有两个目的:

  • 为投影做准备。经过投影矩阵的变换后,顶点的w分量将会具有特殊的意义

  • 对xyz分量进行缩放。经过投影矩阵的缩放后,我们可以直接使用w分量作为一个范围值,如果xyz都在这个范围内就说明这个顶点在剪裁空间中。点的w分量是1,矢量的w是0

    推导起来比较麻烦但是推导出来的投影矩阵的第四个w分量将有更加丰富的含义-w<x<w -w<y<w -w<z<w

屏幕空间

屏幕空间是一个二维空间,那么怎么把顶点从剪裁空间投影到屏幕空间中,来生成对应的2D坐标呢:

  • 需要进行标准齐次除法(homogeneous division)

    齐次除法也叫透视除法,是用齐次坐标系的w分量去除x,y,z分量。在openGL中得到的坐标叫做归一化的设备坐标normalized device coordinates(NDC),经过这一步可以将顶点坐标从齐次裁剪坐标空间转换到NDC中。经过透视投影变换后的裁剪空间,经过齐次除法后会变换到一个立方体内。每个分量范围都是[-1,1]

  • 屏幕映射

    可以根据变换后的x和y坐标来映射输出窗口的对应像素坐标。z分量用于深度缓冲

    总结:从剪裁空间到屏幕空间,首先进行齐次除法 把裁剪空间的坐标投影到 标准归一化设备坐标系中NDC,然后再映射到屏幕空间中 xy分量映射到屏幕的像素,z分量用于深度缓冲。

    顶点从模型空间转换到屏幕空间的过程

1
2
3
4
5
graph LR
A[模型空间]-->|模型变换|B[世界空间]
B-->|观察变换|C[观察空间]
C-->|投影矩阵|D[裁剪空间]
D-->|齐次除法和屏幕映射|E[屏幕空间]