我开始学习3D渲染,进展不错。我已经学会了很多关于矩阵及其一般操作的知识。
但有一件事情我仍然不太明白,那就是OpenGL对矩阵的使用。我经常看到像这样的东西:
x y z n
-------
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
据我所知,它是一个规范化(无量纲)的4维列主矩阵。同时,这个特定的矩阵被称为“单位矩阵”。
一些问题:
- 第N维是什么?
- 如何以及何时应用它们?
我最大的疑惑来自于OpenGL如何利用这种数据。
我开始学习3D渲染,进展不错。我已经学会了很多关于矩阵及其一般操作的知识。
但有一件事情我仍然不太明白,那就是OpenGL对矩阵的使用。我经常看到像这样的东西:
x y z n
-------
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
据我所知,它是一个规范化(无量纲)的4维列主矩阵。同时,这个特定的矩阵被称为“单位矩阵”。
一些问题:
我最大的疑惑来自于OpenGL如何利用这种数据。
[ 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 ]
第四个组件的原因之一是使翻译可以用矩阵表示。
使用矩阵的优点在于,通过矩阵乘法可以将多个变换组合成一个。
现在,如果目的只是为了将翻译放在桌面上,那么我会使用 (x、y、z、1) 而不是 (x、y、z、w),并始终将矩阵的最后一行设置为 [0 0 0 1]
,就像通常用于二维图形一样。实际上,这个四分量向量将通过以下公式映射回正常的三分量向量:
[ x(3D) ] [ x / w ]
| y(3D) ] = | y / w |
[ z(3D) ] [ z / w ]
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 ]
x(3D) := x/w = x/10z
y(3D) := y/w = y/10z
z(3D) := z/w = 0.1
所以我们只需要去掉z坐标来投射到二维平面。