了解OpenGL中的翻译矩阵

3
假设我们想要使用向量v(a, b, c, w=0)将点p(1, 2, 3, w=1)转换为新点p'
注意:w=0代表OpenGL中的向量,w=1代表点,请纠正我如果我错了。
在仿射变换的定义中,我们有:
p + v = p'

=> p(1, 2, 3, 1) + v(a, b, c, 0) = p(1 + a, 2 + b, 3 + c, 1)

=> point + vector = point (everything works as expected)

在OpenGL中,平移矩阵如下:

1 0 0 a
0 1 0 b
0 0 1 c
0 0 0 1

我假设(a, b, c, 1)是仿射变换定义中的向量。为什么我们要使用w=1,而不是像w=0一样呢?
1 0 0 a
0 1 0 b
0 0 1 c
0 0 0 0

一个点乘以一个变换矩阵应该会得到另一个点,对吗? - undefined
2个回答

4
注意:在OpenGL中,w=0表示向量,w=1表示点,请纠正我如果我错了。
你错了。首先,这与OpenGL实际上没有什么关系。这是关于齐次坐标的,这是一个纯粹的数学概念。它通过将n维向量空间嵌入到n+1维向量空间中来实现。在3D情况下,我们使用4D齐次坐标,其定义为齐次向量(x, y, z, w)表示笛卡尔坐标中的3D点(x/w, y/w, z/w)
因此,对于任何w != 0,您可以得到某个有限点,而对于w = 0,您正在描述一个无限远的点朝特定方向。这意味着齐次坐标在这方面更强大,它们实际上可以用有限坐标描述无限远的点(这在透视变换方面非常有用,其中无限远的点被映射到有限点,反之亦然)。
作为一种快捷方式,您可以将(x,y,z,0)想象为某个方向向量。但对于一个点,它不仅是w=1,而是任何不为0的w值。从概念上讲,这意味着任何笛卡尔三维点在齐次空间中都由一条线表示(我们确实增加了一个维度,所以这实际上是有意义的)。
我假设(a,b,c,1)是仿射变换定义中的向量,为什么我们要使用w=1而不是w=0?
你的假设是错误的。关于齐次坐标的一件事是,我们不在4D空间中应用平移。我们通过在4D空间中实际进行剪切操作来获得3D空间中的平移效果
因此,我们真正想要在齐次空间中做的是:
(x + w *a, y + w*b, z+ w*c, w)

由于结果向量的三维解释将会存在,因此需要对其进行翻译。
(x + w*a) / w  == x/w + a
(y + w*b) / w  == y/w + b
(z + w*c) / w  == z/w + c

这将代表我们所追求的翻译。

为了更加清晰明了,我们来举个例子:

你在问题中所写的内容:

p(1, 2, 3, 1) + v(a, b, c, 0) = p(1 + a, 2 + b, 3 + c, 1)

明确地说,这不是我们想要做的。您所描述的是相对于4D向量空间的仿射变换。

但实际上,我们想要的是在3D笛卡尔坐标系中进行平移,因此

 (1, 2, 3) + (a, b, c) = (1 + a, 2 + b, 3 + c)

应用您的公式实际上意味着在齐次空间中进行平移,这将导致按比例缩放“w”坐标的平移,而我给出的公式将始终通过“(a、b、c)”平移点,无论我们为点选择什么“w”。
当然,如果我们选择“w = 0”,那么我们将根本不会得到任何变化,这也是正确的,因为平移永远不会改变方向 - 您的公式会改变方向。您的公式仅适用于“w = 1”的特殊情况。但关键点在于,我们实际上并没有进行向量加法,而是矩阵*向量乘法。齐次坐标只允许我们(除其他更强大的功能之外)通过矩阵乘法表示平移。但这并不意味着我们可以将最后一列解释为平移向量,就好像我们进行向量加法一样。

3

简单回答

原因在于矩阵乘法的工作方式。如果将矩阵乘以向量,则结果的w分量是矩阵第4行与向量的内积。应用变换后,点仍应保持为点,方向仍应保持为方向。如果将其设置为0向量,则结果始终为0,因此,结果向量将从位置(w = 1)更改为方向(w = 0)。

更详细的解答

仿射变换的定义为:

x' = A * x + t,

在IT技术方面,A是一种线性映射,t则是一种平移。传统上,数学家们会将线性映射以矩阵形式书写。需要注意的是,在这里t与x一样,都是三维向量。如果我们总是要处理线性映射矩阵和平移向量,那么这将变得非常麻烦(并且不太通用,考虑到投影映射)。为了解决这个问题,可以引入一个额外的维度到映射中,即所谓的齐次坐标,这允许我们将线性映射以及平移向量存储在一个组合的4x4矩阵中。这被称为增广矩阵,并且按定义而言,

  x'      A | t       x 
[   ] = [   |   ] * [   ]
  1       0 | 1       1

值得注意的是,通过仅仅乘以增广矩阵,仿射变换现在可以非常容易地组合起来,这在矩阵加向量表示中很难实现。
还要注意的是,右下角的1不是平移向量的一部分,它仍然是三维的,但是属于矩阵的增广部分。
您可能还想阅读此处关于“增广矩阵”的部分:https://en.wikipedia.org/wiki/Affine_transformation#Augmented_matrix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接