了解OpenGL中的转换矩阵

1234

假设我们想将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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

了解OpenGL投影矩阵

来自分类Dev

了解SVG中的矩阵

来自分类Dev

了解OpenGL中的绑定?

来自分类Dev

了解OpenGL中的照明

来自分类Java

了解Java中的转换

来自分类Dev

MATLAB中的矩阵转换

来自分类Dev

Python中的OpenGL透视矩阵

来自分类Dev

OpenGL ES 2.0 矢量转换无法通过矩阵乘法(在顶点着色器中)工作

来自分类Dev

了解Sklearn中Tfidfvectorizer的矩阵输出

来自分类Dev

了解GLM- openGL中的相机翻译

来自分类Dev

对在opengl中翻译相机有了解的问题

来自分类Dev

了解 OpenGL 中的光与材料属性

来自分类Dev

Python中的矩阵镜像/转换

来自分类Dev

在OpenGL中查找旋转矩阵

来自分类Dev

在OpenGL中存储模型矩阵的最佳位置?

来自分类Dev

openGL中的矩阵旋转/平移/缩放

来自分类Dev

检测矩阵是否在OpenGL中镜像对象

来自分类Dev

误解OpenGL中的模型-视图-投影矩阵

来自分类Dev

OpenGL:push / pop矩阵VS来回转换

来自分类Dev

OpenGL转换不适用于GLM矩阵

来自分类Dev

使用GLM(旋转)为OpenGL创建转换矩阵

来自分类Dev

通过转换矩阵而不是glTranslate()在OpenGL中移动模型

来自分类Dev

OpenGL/SharpGL 转换的简单代码(不含矩阵理论课)

来自分类Dev

OpenGL glm :: translate不会像希望的那样转换矩阵

来自分类Dev

了解 postgresql 中的显式类型转换

来自分类Dev

了解SQL中的显式类型转换

来自分类Dev

在CUDA中处理矩阵:了解基本概念

来自分类Dev

试图了解WebGL中透视矩阵背后的数学

来自分类Dev

将转换矩阵应用于视图矩阵不起作用(android opengl2)