美文网首页
图形学笔记一 仿射变换和齐次坐标

图形学笔记一 仿射变换和齐次坐标

作者: 合肥黑 | 来源:发表于2021-12-23 07:55 被阅读0次

    本系列是在学习GAMES101-现代计算机图形学入门-闫令琪中遇到的知识总结,其中关于线代的知识可以参考之前的线代系列笔记。

    https://www.bilibili.com/video/BV1X7411F744?p=2
    https://www.bilibili.com/video/BV1X7411F744?p=3
    看过前面的线代系列,再看P2还是比较简单的,可以2倍速快速复习一下。在P3中,也可以使用基坐标的变换方式来理解那些2维变换(作者使用的是特殊点推理),比如:

    旋转
    然后紧接着就遇到了一个新的知识点:齐次坐标。嗯,我先去知乎搜索了一下,再继续看视频就无压力了,搜索到的内容如下:
    一、仿射变换

    参考https://www.zhihu.com/question/20666664/answer/157400568,这里我只节选一部分。
    简单来说,“仿射变换”就是:“线性变换”+“平移”。

    1.线性变换从几何直观有三个要点:
    • 变换前是直线的,变换后依然是直线
    • 直线比例保持不变
    • 变换前是原点的,变换后依然是原点

    总结下来,线性变换是通过矩阵乘法来实现的。

    2.仿射变换

    从几何直观只有两个要点:

    • 变换前是直线的,变换后依然是直线
    • 直线比例保持不变

    少了原点保持不变这一条。

    上一节我们说了,线性变换是通过矩阵乘法来实现的,仿射变换不能光通过矩阵乘法来实现,还得有加法。


    image.png 看这个点的移动,实际上在三维空间是怎么操作的
    二、为什么引入齐次坐标

    参考https://www.zhihu.com/question/26655998/answer/43847213
    我来回答一下,分为两个问题:

    1. 为什么引入齐次坐标可以表示平移?

    首先我们用一个矢量来表示空间中一个点:r=[rx,ry,rz]
    如果我们要将其平移,平移的矢量为:t=[tx,ty,tz]
    那么正常的做法就是:r+t=[rx+tx,ry+ty,rz+tz]

    如果不引入齐次坐标,单纯采用3X3矩阵乘法来实现平移。你想做的就是找到一个矩阵m,使得rm=r+t=[rx+tx,ry+ty,rz+tz]

    然后你就会发现你永远也找不到这样的矩阵

    找不到是因为矩阵是线性变换,只能旋转缩放,不能平移,也就是原点是不能动的,或者说你能找到一个矩阵能把原点[0 0 0]变到任意一个[tx ty tz]吗?但是增加一个维度,就是在高维空间内通过多加的那一个维度的缩放旋转可以实现低维空间内类似于平移的功能(例如楼主举的那个例子,就是纯平移的),从高维空间向低维空间看过去就是平移了。

    所以我们需要新引入一个维度,原来r=[rx,ry,rz,1]。那么我们可以找到一个4X4的矩阵来实现平移


    image.png
    2. 为什么要引入齐次坐标来表示平移?

    在计算机图形学中,坐标转换通常不是单一的,一个几何体在每一帧可能都设计了多个平移,旋转,缩放等变化,这些变化我们通常使用串接各个子变化矩阵的方式得到一个最终变化矩阵,从而减少计算量。所以我们需要将平移也表示为变化矩阵的形式。因此,只能引入齐次坐标系。

    三、 齐次坐标中区分向量和点

    参考齐次坐标的理解
    一直对齐次坐标这个概念的理解不够彻底,只见大部分的书中说道“齐次坐标在仿射变换中非常的方便”,然后就没有了后文,今天在一个叫做“三百年 重生”的博客上看到一篇关于透视投影变换的探讨的文章,其中有对齐次坐标有非常精辟的说明,特别是针对这样一句话进行了有力的证明:“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”—— F.S. Hill, JR。

    由于作者对齐次坐标真的解释的不错,我就原封不动的摘抄过来:
    对于一个向量v以及基oabc,可以找到一组坐标(v1,v2,v3),使得v = v1 a + v2 b + v3 c (1)
    而对于一个点p,则可以找到一组坐标(p1,p2,p3),使得p – o = p1 a + p2 b + p3 c (2)

    从上面对向量和点的表达,我们可以看出为了在坐标系中表示一个点(如p),我们把点的位置看作是对这个基的原点o所进行的一个位移,即一个向量——p – o(有的书中把这样的向量叫做位置向量——起始于坐标原点的特殊向量),我们在表达这个向量的同时用等价的方式表达出了点p:p = o + p1 a + p2 b + p3 c (3)

    (1)(3)是坐标系下表达一个向量和点的不同表达方式。这里可以看出,虽然都是用代数分量的形式表达向量和点,但表达一个点比一个向量需要额外的信息。如果我写出一个代数分量表达(1, 4, 7),谁知道它是个向量还是个点!

    我们现在把(1)(3)写成矩阵的形式:v = (v1 v2 v3 0) X (a b c o)

    p = (p1 p2 p3 1) X (a b c o),这里(a,b,c,o)是坐标基矩阵,右边的列向量分别是向量v和点p在基下的坐标。这样,向量和点在同一个基下就有了不同的表达:3D向量的第4个代数分量是0,而3D点的第4个代数分量是1。像这种这种用4个代数分量表示3D几何概念的方式是一种齐次坐标表示。

    这样,上面的(1, 4, 7)如果写成(1,4,7,0),它就是个向量;如果是(1,4,7,1),它就是个点。下面是如何在普通坐标(Ordinary Coordinate)和齐次坐标(Homogeneous Coordinate)之间进行转换:

    (1)从普通坐标转换成齐次坐标时

    如果(x,y,z)是个点,则变为(x,y,z,1);
    如果(x,y,z)是个向量,则变为(x,y,z,0)

    (2)从齐次坐标转换成普通坐标时

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

    以上是通过齐次坐标来区分向量和点的方式。从中可以思考得知,对于平移T、旋转R、缩放S这3个最常见的仿射变换,平移变换只对于点才有意义,因为普通向量没有位置概念,只有大小和方向.

    而旋转和缩放对于向量和点都有意义,你可以用类似上面齐次表示来检测。从中可以看出,齐次坐标用于仿射变换非常方便。

    此外,对于一个普通坐标的点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所说,仿射(线性)变换的进行更加方便。由于图形硬件已经普遍地支持齐次坐标与矩阵乘法,因此更加促进了齐次坐标使用,使得它似乎成为图形学中的一个标准。

    四、视频P4节选
    image.png

    3D向量的第4个代数分量是0,而3D点的第4个代数分量是1。像这种这种用4个代数分量表示3D几何概念的方式是一种齐次坐标表示。

    这种设计是完美的,保证了如下图中的计算仍然是有意义的:


    image.png

    上图中,一个点加另外一点,结果是两点的终点,因为w=1+1=2。

    现在,齐次坐标下的变换如下:


    image.png
    1.复合变换
    先平移再旋转,注意旋转默认是绕0,0逆时针 先旋转再平移,才是我们要的结果 image.png

    上图很容易理解吧,(x,y,1)表示齐次坐标下的变量,先左乘旋转45度,然后再左乘平移。

    2.绕任意点旋转
    image.png

    相关文章

      网友评论

          本文标题:图形学笔记一 仿射变换和齐次坐标

          本文链接:https://www.haomeiwen.com/subject/tyuvfrtx.html