假设我们想将p(1, 2, 3, w=1)
带有向量v(a, b, c, w=0)
的点转换为新点p'
注意:在OpenGL中w=0
代表一个矢量并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
注意:在OpenGL中
w=0
代表一个矢量并w=1
代表一个点,如果我错了,请纠正我。
你错了。首先,这与OpenGL无关。这是关于同构坐标,这是一个纯粹的数学概念。它通过将n维向量空间嵌入到n + 1维向量空间中来工作。在3D情况下,我们使用4D均匀坐标,其定义是,均匀矢量(x, y, z, w)
代表(x/w, y/w, z/w)
笛卡尔坐标中的3D点。
结果,对于任何一个w != 0
,您都会得到一个确定的点,并且,对于一个特定的方向w = 0
,您将描述一个无限远的点。这意味着,就它们实际上可以用有限坐标描述无限远点而言,同构坐标更为强大(这对于透视变换非常有用,其中将无限远点映射到有限点,反之亦然) )。
您可以将其想象(x,y,z,0)
为某个方向向量。但是对于一个点,它不只是w=1
,而是任何 w
不等于0的值。从概念上讲,这意味着任何笛卡尔3D点都由均匀空间中的一条线表示(我们确实沿一维方向移动,所以这实际上是有道理的)。
我假设(a,b,c,1)是来自仿射变换定义的向量,为什么我们有w = 1,但没有w = 0?
您的假设是错误的。关于均匀坐标的一件事是,我们不在4D空间中应用平移。通过在4D空间中实际执行剪切操作,我们可以在3D空间中获得平移的效果。
所以我们真正想要在同质空间中做的是
(x + w *a, y + w*b, z+ w*c, w)
因为生成的矢量的3D解释将是
(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
,这只是一种特殊情况。但是这里的关键是我们毕竟不是在进行向量加法运算,而是在矩阵*向量相乘。同质坐标只允许我们(除其他功能更强大的东西外)通过矩阵乘法表示平移。但这并不意味着我们可以将最后一列解释为翻译向量,就好像我们进行了向量加法一样。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句