gpt4 book ai didi

opengl - 了解 OpenGL 中的转换矩阵

转载 作者:行者123 更新时间:2023-12-02 04:02:10 25 4
gpt4 key购买 nike

假设我们要用向量 v(a, b, c, w=0) 平移一个点 p(1, 2, 3, w=1) > 到一个新点 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

最佳答案

Note: w=0 represents a vector and w=1 represent a point in OpenGL, please correct me if I'm wrong.

你错了。首先,这与 OpenGL 没有任何关系。这是关于 homogenous coordinates ,这是一个纯数学概念。它的工作原理是将一个 n 维向量空间嵌入到一个 n+1 维向量空间中。在 3D 情况下,我们使用 4D 齐次坐标,定义齐次向量 (x, y, z, w) 表示 3D 点 (x/w, y/w, z/w) 在笛卡尔坐标中。

因此,对于任何 w != 0,您都会得到一个特定的有限点,而对于 w = 0,您正在描述一个无限远的点 < em>进入特定方向。这意味着齐次坐标更强大,因为它们实际上可以用有限坐标描述无限远的点(这对于透视变换非常方便,其中无限远的点映射到有限点,反之亦然).

作为快捷方式,您可以将 (x,y,z,0) 想象成某个方向向量。但是对于一个点,它不仅仅是w=1,而是任何w值不等于0。从概念上讲,这意味着任何笛卡尔3D点由同质空间中的线表示(我们确实上升了一个维度,所以这实际上是有道理的)。

I assume (a, b, c, 1) is the vector from Affine transformation definition why we have w=1, but not 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 正确,这只是一个特例。但是这里的重点是,我们毕竟不是在做向量加法,而是矩阵*向量乘法。齐次坐标只允许我们(除其他外,更强大的东西)通过矩阵乘法表示翻译。但这并不意味着我们可以将最后一列解释为翻译向量,就像我们进行向量加法一样。

关于opengl - 了解 OpenGL 中的转换矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41353597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com