了解OpenGL矩阵

Ale*_*zzi 19 opengl 3d-rendering

我开始学习3D渲染,我一直在取得很好的进展.我已经了解了很多关于矩阵和可以在它们上执行的一般操作.

我还没有完全关注的一件事是OpenGL使用矩阵.我看到这个(以及类似的东西)相当多:

x y z n
-------
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Run Code Online (Sandbox Code Playgroud)

所以我最好的理解是,它是一个标准化(无量级)的4维列主矩阵.此外,该矩阵特别称为"单位矩阵".

一些问题:

  • 什么是"第n"维度?
  • 这些如何以及何时适用?

我最大的困惑来自于OpenGL如何利用这种数据.

ken*_*ytm 61

在大多数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 ]
Run Code Online (Sandbox Code Playgroud)

例如,缩放表示为

[ 2 . . . ] [ x ]   [ 2x ]
| . 2 . . | | y | = | 2y |
| . . 2 . | | z |   | 2z |
[ . . . 1 ] [ 1 ]   [ 1  ]
Run Code Online (Sandbox Code Playgroud)

和翻译

[ 1 . . dx ] [ x ]   [ x + dx ]
| . 1 . dy | | y | = | y + dy |
| . . 1 dz | | z |   | z + dz |
[ . . . 1  ] [ 1 ]   [   1    ]
Run Code Online (Sandbox Code Playgroud)

第四个组成部分的原因之一是使矩阵可以表示平移.

使用矩阵的优点是可以通过矩阵乘法将多个变换组合成一个变换.

现在,如果目的只是为了在表上进行翻译,那么我会说(x,y,z,1)而不是(x,y,z,w)并且总是将矩阵的最后一行[0 0 0 1]作为通常用于2D图形.实际上,通过以下公式将4分量矢量映射回正常的3矢量矢量:

[ x(3D) ]   [ x / w ]
| y(3D) ] = | y / w |
[ z(3D) ]   [ z / w ]
Run Code Online (Sandbox Code Playgroud)

这称为齐次坐标.允许这使得透视投影也可以用矩阵表示,其可以再次与所有其他变换组合.

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

x(2D) = x(3D) / (10 * z(3D))
y(2D) = y(3D) / (10 * z(3D))
Run Code Online (Sandbox Code Playgroud)

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

[ 1 . .  . ] [ x ]   [  x   ]
| . 1 .  . | | y | = |  y   |
| . . 1  . | | z |   |  z   |
[ . . 10 . ] [ 1 ]   [ 10*z ]
Run Code Online (Sandbox Code Playgroud)

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

x(3D) := x/w = x/10z
y(3D) := y/w = y/10z
z(3D) := z/w = 0.1
Run Code Online (Sandbox Code Playgroud)

所以我们只需要将z坐标切出来投影到2D.

  • 我希望我能理解你的例子,但我并没有真正理解你的例子.我道歉. (2认同)

Ala*_*lan 3

可能有助于您入门的简短答案是,您所说的“第 n”维并不代表任何可可视化的数量。它被添加为一个实用工具,可以实现引起平移和透视投影的矩阵乘法。直观的 3x3 矩阵无法做到这些事情。

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