OpenGL-变换、齐次坐标(未完)

学习于《OpenGL编程指南》、强推:caster99博主的详解jeffasd大神的齐次坐标理解齐次坐标百度百科
OpenGL采用的是相机模型,就是把视图变换操作类比为使用照相机拍摄照片的过程,具体步骤如下:
1.将准备拍摄的对象移动到场景中的指定位置。(模型变换,Model Transform)

2.将相机移动到准备拍摄的位置,将它对准某个方向。(视图变换,View Transform

3.设置相机的焦距,或调整缩放比例。(投影变换,Projection Transform)

4.变换调整拍摄照片到需要的图片大小。(视口变换)
前三个可以用变换矩阵实现

齐次坐标(homogeneous coordinates)

齐次坐标在电脑图形内无处不在,因为该坐标允许平移、旋转、缩放及透视投影等可表示为矩阵与向量相乘的一般向量运算。依据链式法则,任何此类运算的序列均可相乘为单一个矩阵,从而实现简单且有效之处理。与此相反,若使用笛卡儿坐标,平移及透视投影不能表示成矩阵相乘,虽然其他的运算可以。现在的OpenGL及Direct3D图形卡均利用齐次坐标的优点,以具4个暂存器的向量处理器来实作顶点着色引擎。

引进齐次坐标有什么必要,它有什么优点呢?

齐次坐标外文参考: http://www.songho.ca/math/homogeneous/homogeneous.html
问题导入:两条平行线可以相交于一点
在欧氏几何空间,同一平面的两条平行线不能相交,这是我们都熟悉的一种场景。
然而,在透视空间里面,两条平行线可以相交,例如:火车轨道随着我们的视线越来越窄,最后两条平行线在无穷远处交于一点。

欧氏空间(或者笛卡尔空间)描述2D/3D几何非常适合,但是这种方法却不适合处理透视空间的问题(实际上,欧氏几何是透视几何的一个子集合),2维笛卡尔坐标可以表示为(x,y)。

如果一个点在无穷远处,这个点的坐标将会(∞,∞),在欧氏空间,这变得没有意义。平行线在透视空间的无穷远处交于一点,但是在欧氏空间却不能,数学家发现了用齐次坐标可以解决这个问题。

简而言之,齐次坐标就是用N+1维来代表N维坐标

我们可以在一个2D笛卡尔坐标末尾加上一个额外的变量w来形成2D齐次坐标,因此,一个点(X,Y)在齐次坐标里面变成了(x,y,w),并且有

X = x/w
Y = y/w

例如,笛卡尔坐标系下(1,2)的齐次坐标可以表示为(1,2,1),如果点(1,2)移动到无限远处,在笛卡尔坐标下它变为(∞,∞),然后它的齐次坐标表示为(1,2,0),因为(1/0, 2/0) = (∞,∞),我们可以不用”∞"来表示一个无穷远处的点了。

齐次坐标转化为笛卡尔坐标

我们把齐次坐标转化为笛卡尔坐标的方法是前面n-1个坐标分量分别除以最后一个分量即可。
在这里插入图片描述
转化齐次坐标到笛卡尔坐标的过程中,我们有一个发现,例如:
在这里插入图片描述
你会发现(1, 2, 3), (2, 4, 6) 和(4, 8, 12)对应同一个Euclidean point (1/3, 2/3),任何标量的乘积,例如(1a, 2a, 3a) 对应 笛卡尔空间里面的(1/3, 2/3) 。因此,这些点是“齐次的”,因为他们代表了笛卡尔坐标系里面的同一个点。换句话说,齐次坐标有规模不变性。

证明:两条线在空间上可以产生视觉上的相交。

考虑如下方程组:
在这里插入图片描述

我们知道在笛卡尔坐标系里面,该方程组无解,因为C ≠ D,如果C=D,两条直线就相同了。

让我们在透视空间里面,用齐次坐标x/w, y/w代替x ,y,
在这里插入图片描述
现在我们有一个解(x, y, 0),两条直线相交于(x, y, 0),这个点在无穷远处。

综合:

许多图形应用涉及到几何变换,主要包括平移、旋转、缩放。以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来可以表示为p’ = m1p+ m2(注:因为习惯的原因,实际使用时一般使用变化矩阵左乘向量)(m1旋转缩放矩阵, m2为平移矩阵, p为原向量 ,p’为变换后的向量)。引入齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为p’ = pM的形式。即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。
其次,它可以表示无穷远的点。

假设3维向量x,我们对这个向量进行线性变换Tx,但无论T为任意33矩阵,都无法完成向量的平移操作(比如x=(0,0,0),Tx无论如何也不可能变换到(1,0,0))。
这里我们就需要用到齐次坐标,使用齐次坐标的目的也就是通过增加额外的数值来完成向量的平移操作。熟悉OpenGL的已经知道了,将三维数据植入思维坐标空间当中就行了。就是将x=(0,0,0)转变成x=(0,0,0,1)。T也转变成4
4矩阵。

齐次坐标所表达的其实是方向而不是位置。比如x1=(1,2,3,1)和x2=(2,4,6,2)其实在3维坐标系中表示的是同一个位置。此外,最后一个分量w越大,那么齐次坐标将处于更远的位置。当OpenGL准备显示集合体的时候,它会使用左后一个分量除以前三个分量,从而将其次坐标重新变换到3维坐标系中,因此w越大的物体也会显示的越小。w为0.0的时候,由于坐标位于无限近的位置,以至于显示可能会呈现出无限大。这个概念非常重要,因为下面投影矩阵就是利用这个概念!

猜你喜欢

转载自blog.csdn.net/weixin_42785489/article/details/88911102