【问题标题】:Understanding OpenGL Matrices了解 OpenGL 矩阵
【发布时间】:2010-03-17 19:09:41
【问题描述】:

我开始学习 3D 渲染,并且取得了不错的进展。我学到了很多关于矩阵和可以对它们执行的一般操作的知识。

我仍然不太了解的一件事是 OpenGL 对矩阵的使用。我经常看到这个(以及类似的东西):

x y z n
-------
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

所以我最好的理解是,它是一个归一化(无大小)的 4 维列主矩阵。另外,这个矩阵特别被称为“恒等矩阵”。

一些问题:

  • 什么是“nth”维度?
  • 如何以及何时应用这些?

我最大的困惑在于 OpenGL 如何使用此类数据。

【问题讨论】:

标签: opengl 3d-rendering


【解决方案1】:

在大多数 3D 图形中,点由 4 分量向量 (x, y, z, w) 表示,其中 w = 1。应用于点的通常操作包括平移、缩放、旋转、反射、倾斜和组合这些。

这些变换可以用一个叫做“矩阵”的数学对象来表示。矩阵适用于这样的向量:

[ a b c tx ] [ x ]   [ a*x + b*y + c*z + tx*w ]
| d e f ty | | y | = | d*x + e*y + f*z + ty*w |
| g h i tz | | z |   | g*x + h*y + i*z + tz*w |
[ p q r s  ] [ w ]   [ p*x + q*y + r*z +  s*w ]

例如,缩放表示为

[ 2 . . . ] [ x ]   [ 2x ]
| . 2 . . | | y | = | 2y |
| . . 2 . | | z |   | 2z |
[ . . . 1 ] [ 1 ]   [ 1  ]

翻译成

[ 1 . . dx ] [ x ]   [ x + dx ]
| . 1 . dy | | y | = | y + dy |
| . . 1 dz | | z |   | z + dz |
[ . . . 1  ] [ 1 ]   [   1    ]

第 4 个组件的原因之一是使平移可以用矩阵表示。

使用矩阵的优点是可以通过矩阵乘法将多个变换合并为一个。

现在,如果目的只是将翻译放在桌面上,那么我会说 (x, y, z, 1) 而不是 (x, y, z, w) 并制作矩阵的最后一行总是[0 0 0 1],就像通常用于 2D 图形一样。实际上,4-component 向量会通过这个公式映射回正常的 3-vector 向量:

[ x(3D) ]   [ x / w ]
| y(3D) ] = | y / w |
[ z(3D) ]   [ z / w ]

这称为homogeneous coordinates允许这样使得透视投影也可以用矩阵表达,它可以再次与所有其他变换结合。

例如,由于更远的物体在屏幕上应该更小,我们使用公式将 3D 坐标转换为 2D

x(2D) = x(3D) / (10 * z(3D))
y(2D) = y(3D) / (10 * z(3D))

现在如果我们应用投影矩阵

[ 1 . .  . ] [ x ]   [  x   ]
| . 1 .  . | | y | = |  y   |
| . . 1  . | | z |   |  z   |
[ . . 10 . ] [ 1 ]   [ 10*z ]

那么真正的3D坐标就变成了

x(3D) := x/w = x/10z
y(3D) := y/w = y/10z
z(3D) := z/w = 0.1

所以我们只需要将 z 坐标切掉以投影到 2D。

【讨论】:

  • 我希望我能理解你的例子,但我并没有真正理解。我很抱歉。
  • @Omega OpenGL 红皮书的这一部分可能会有所帮助glprogramming.com/red/appendixf.html#name1
  • @Omega 也许基础知识也很有用 [en.wikipedia.org/wiki/Matrix_multiplication].
  • 一点一点我明白了。请记住,我还必须了解 OpenGL 的实现。我想我知道 OpenGL 使用矩阵作为基本数据类型来定义各种转换。似乎 API 中的很多函数都是用来生成这些矩阵的。无论如何,我肯定一直在研究你可以对它们执行的各种算术运算。
【解决方案2】:

可能会帮助您入门的简短回答是,您所称的“第 n 个”维度并不代表任何可视化的数量。它被添加为一种实用工具,以启用导致平移和透视投影的矩阵乘法。直观的 3x3 矩阵无法做到这些。

代表空间点的 3d 值总是附加 1 作为第四个值,以使这个技巧起作用。表示方向的 3d 值(即法线,如果您熟悉该术语)在第四个位置附加 0。

【讨论】:

    猜你喜欢
    • 2016-06-17
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多