【OpenGL】深入理解齐次坐标及其作用

【OpenGL】深入理解齐次坐标及其作用

一、什么是齐次坐标和齐次坐标系

齐次坐标

单从定义上来讲,齐次坐标(投影坐标)就是用N+1维来代表N维坐标(点和向量),也可说用齐次坐标来表示笛卡尔坐标,具体的数学表达式可以这样写:
在直角坐标系点坐标(x,y)末尾加上一个额外的变量w,一个点(X,Y)在齐次坐标里面变成了(x,y,w),并且有

X = x/w
Y = y/w

这也就解决了笛卡尔坐标系无法表示无穷远点的问题,按照人的视觉,两条平行线在无穷远处会相交,采用直角坐标系无法对这一现象进行描述,而当w趋近于0时,(X,Y)趋向无穷大,其齐次坐标就可表示为(x,y,0),解决了这一问题。
在这里插入图片描述

于此同时衍生了另外一个问题,笛卡尔坐标和齐次坐标转换的问题

  • (1) 笛卡尔坐标转换成齐次坐标,需要考虑坐标是点还是向量的问题,如果(x,y)是个点,就可变为(x,y,1);而如果(x,y)是个向量,则变为(x,y,0)
  • (2) 齐次坐标转换成笛卡尔坐标,如果是(x,y,2),则其笛卡尔坐标为(x/2,y/2);
  • 如果是(x,y,0),其笛卡尔坐标仍为(x,y)。

齐次坐标(针对二维)因此有如下定义

  1. 投影平面上的任何点都可以表示成 (X, Y, Z),称之为该点的’齐次坐标或投影坐标,其中 X、Y 及 Z 不全为 0。
  2. 以齐次坐标表111表示的点,若该坐标内的数值全乘上一相同非零实数,仍会表示该点。
  3. 相反地,两个齐次坐标表示同一点,当且仅当其中一个齐次坐标可由另一个齐次坐标乘上一相同非零常数得取得。
  4. 当 Z 不为 0,则该点表示欧氏平面上的 (X/Z, Y/Z)。
  5. 当 Z 为 0,则该点表示一无穷远点。
  6. 三元组 (0, 0, 0) 不表示任何点。原点表示为 (0, 0, 1)。

齐次坐标系

那怎么从空间上去理解齐次坐标系呢?

有个说法挺有意思,我们想象在宇宙中有一个绝对坐标系,对于我们现在使用的笛卡尔坐标系,其原点位于(0,0)点,当然同时也就还有无数的相同的坐标系,只不过它们的原点不同,对于笛卡尔坐标系中的点(x,y),它对于所有的笛卡尔坐标系都是相同的,有点多维宇宙的感觉,其中一个坐标系就是一个宇宙。

二、齐次坐标的作用

看了不少文章,基本都有这么一句话来概况其作用:齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换

齐次坐标在计算机图形学中有重要应用,可以用来区分向量和点,上面已经解释了点和向量的区别问题,其仿射变换主要应用如下:

2.1 "平移矩阵"扩展为3维

在图像处理时,经常会对图像进行平移操作,就会采用矩阵的形式进行计算。通过对坐标点进行齐次变换,可以将平移矩阵用3维方式进行表达,可以。
平移可表示为:
[ x 2 y 2 ] = [ x 1 y 1 ] + [ x 0 y 0 ] \begin{bmatrix} x_2 \\ y_2 \end{bmatrix} = \begin{bmatrix} x_1 \\ y_1 \end{bmatrix} + \begin{bmatrix} x_0 \\ y_0 \end{bmatrix} [x2y2]=[x1y1]+[x0y0]

齐次变换后:
[ x 2 y 2 1 ] = [ 1 0 x 0 0 1 y 0 0 0 1 ] × [ x 1 y 1 1 ] \left[\begin{array}{ccc} x_2 \\ y_2 \\ 1 \\ \end{array}\right] = \left[\begin{array}{ccc} 1 & 0 & x_0 \\ 0 & 1 & y_0 \\ 0 & 0 & 1 \\ \end{array}\right] \times \left[\begin{array}{c} x_1 \\ y_1 \\ 1 \\ \end{array}\right] x2y21 = 100010x0y01 × x1y11

2.2 旋转,缩放

  • 旋转
    对一个点绕原点逆时针旋转一个角度,用矩阵的形式表达为:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 缩放
    在这里插入图片描述
    在这里插入图片描述