超直观理解齐次坐标(webgl基础)

1,988 阅读4分钟

计算机图形学中的数学是与矩阵乘法紧密联系的。例如缩放、旋转、剪切 变换。但是平移并不直接对应于矩阵乘法, 因为平移并不是线性变换。 为了解决这个问题,常规方法是引入齐次坐标。 齐次坐标的引入可能会让一些初学者理解的不那么直观,这里我尝试以一个非常直观的角度去理解齐次坐标的平移。

二维空间下的线性变换和齐次坐标变换

首先我们在二维坐标系下画放一个正方形:

假设这个正方形右上角是 [1,1]。我们对这个正方形所有的点乘以如下矩阵:

1001(1) \begin{matrix} 1 & 0 \\ 0 & 1 \end{matrix} \tag{1}

当然了这个是单位矩阵, 正方形一动没动。 然后我把这个矩阵变一下:

1101(2) \begin{matrix} 1 & 1 \\ 0 & 1 \end{matrix} \tag{2}

带入具体的点 [1,1] 算一下, 变成了[2, 1], 对[1, 0] 算一下变成了[1, 0], 对 [0,1] 算一下变成了 [1,1] 。所以矩阵(2) 是一个剪切变换, 让这个正方形变成了平行四边形。

那么我们来实现二维空间下的平移变换, 按照齐次坐标定义, 我们把正方形的所有点用三维坐标表示, 比如[1,0] => [1,0,1] 然后平移的三维矩阵为:

10h01k001(3) \begin{matrix} 1 & 0 & h \\ 0 & 1 & k \\ 0 & 0 & 1 \\ \end{matrix} \tag{3}

其中h是x轴平移的量, k是y轴平移的量。[x,y,1] => [x + h , y + k, 1], 最后把x, y 都除以 w (就是增加的那个1) 得到平移后的坐标是[x + h, y + k]。至此我们用齐次二维坐标的方法把二维的平移也用矩阵乘法来表示了。

重点来了, 上面三维向量和三维矩阵的乘法我们用来表示二维的平移, 同时他也是三维下的线性变换!我们看看从三维的视角看看这同一个式子得直观表现。首先我们弄一个正方体:

对他进行矩阵(3)的变换后, 比如让h = 1, k = 1。那么点[1,1,1]变成了 [2,2,1], [1,0,1] 变成了[2,1,1] 。这几个点都是正方体顶面上的点,那么底层的点,比如[1,1,0] ,由于第三项是0,算完之后还是[1,1 0]所以地面没变。所以正方体变成了如下这个造型:

上平面平移了出去,下平面不动,这个就是正方体的剪切变换呀! 所谓二维平移就是我们舍去(除以w)了三维的信息, 仅仅留下了上平面的的信息,也就是得到了上平面的平移信息。也就是二维的平移了。

注: 这里的w为1仅仅是比较好描述, 他可以是其他数: 2,3,4等等。 比如 [1,1,1] [2,2,2] [3,3,3]都是 [1,1]的齐次二维坐标。这也正是齐次(homogeneous,同质的)的含义,即一个坐标有无数个齐次坐标的表示,这些坐标本质表示的都是同一个点。 在图中的表示就是上面的正方体更高了。 不过最后都要除回来就行了。

三维空间下的线性变换和齐次坐标变换

有了二维的理解,三维的就很好理解了。 三维空间的点如果表示平移的话, 就得引入三维的齐次坐标就是思维向量了,比如 [1,2,1,1]。同样的。 对应平移矩阵为:

100i010j001k0001(3) \begin{matrix} 1 & 0 & 0 & i \\ 0 & 1 & 0 & j \\ 0 & 0 & 1 & k \\ 0 & 0 & 0 & 1 \end{matrix} \tag{3}

如上变换会把[x,y,z,1] 变为 [x+i, y+j , z+k, 1] 然后在除以w [x/w, y/w,z/w] = [x+i, y+j,z+k] 也就得到了是哪位空间的平移变换。形象的理解就是四维空间的超立方体在进行剪切换边,然后把他的“上面(立方体)” 拍到我们这个三维空间。

如果四维想象不太出来。这里可以帮助里联想: 如果你是一个二维人。一个三维空间立方体切你所在的平面,你的视角里会突然出现一个直线,然后这个直线在不停的变换,最后突然消失。现在你是一个三维的人(现在不就是嚒哈哈) ,想象一个超立方体在切我们所在的空间, 你的视野会突然出现一个立方体, 然后这个立方体在不停的变化, 最后突然在眼前消失了。