2010-03-17 104 views
17

我开始学习3D渲染,并且一直在取得良好进展。我已经拿起了很多关于矩阵和可以对它们执行的一般操作。了解OpenGL矩阵

有一件事情我还不太下面是OpenGL的使用矩阵。我看到这个(事情就是这样吧)颇多:

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

所以我最了解,就是它是一个标准化的(无级)4维,列主矩阵。而且这个矩阵特别被称为“单位矩阵”。

一些问题:

  • 什么是 “第n个” 维度?
  • 这些应用程序如何以及何时应用?

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

+0

查阅“游戏和互动应用基础数学”一书。 –

+2

归一化的向量不是“无量级”。归一化矢量的长度/数量为1. – alesplin

+0

谢谢!我想我对理解感到厌烦。至少我是在正确的轨道上。 ;) –

回答

3

可能帮助您开始的简短答案是,您称之为“第n个”维度并不代表任何可视化的数量。它被添加为一个实用的工具,使矩阵乘法,导致翻译和透视投影。直观的3x3矩阵不能做这些事情。

表示空间中某个点的3d值始终会附加1作为第四个值以使此技巧有效。表示方向的3d值(即,如果您熟悉该术语,则为法线)在第四个点中附加0。

59

在大多数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 ] 

之一为第四分量的原因是使矩阵表示的翻译。

使用矩阵的优点是可以通过矩阵乘法将多个变换组合成一个变换。 (x,y,z,1)而不是(x,y,z,w),并且使最后一行代替(x,y,z,1),如果目的不过矩阵总是[0 0 0 1],正如对于2D图形通常所做的那样。事实上,4成分的矢量将通过该式映射回正常的3-矢量矢量:

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

这被称为homogeneous coordinates允许这使得透视投影表达与矩阵也可与所有其他转换再次结合。

例如,由于对象距离越远应该在屏幕上变小,我们变换如果我们应用投影矩阵

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

那么真实的三维坐标转换成二维使用式

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

现在3D坐标将变为

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

所以我们只需要将z - 协调投影到2D。

+2

我希望我能理解你的例子,但我并没有真正理解它。我道歉。 –

+1

@ Omega OpenGL红皮书的这一部分可能有助于http://www.glprogramming.com/red/appendixf.html#name1 – Swiss

+0

@Omega也许基础知识也是有用的[http://en.wikipedia.org/wiki/Matrix_multiplication]。 – Luca