为什么要使用Matrix进行3D投影?

时间:2016-04-24 12:22:43

标签: opengl matrix multidimensional-array projection-matrix

在搜索投影矩阵(至少在OpenGL中)的计算后,

Matrix

当我们有这么多空值时,为什么还要使用Matrix呢?我将9个条目标记为0,只有7个条目包含有用数据。为什么不使用类似的1D数组,只是将数据存储在类似列表的形状中?这不会节省内存和时间来创建可以操纵矩阵的函数吗?我确信这整个论点也可以用在其他主题中,这让我想到了,

在投影3D环境中使用矩阵的具体原因是什么?

3 个答案:

答案 0 :(得分:2)

3D点(x,y,z)到2D图像坐标(X,Y)的投影可以计算为齐次坐标中的向量矩阵乘法:

[ a_00  a_01  a_02  a_03 ]   [ x ]    [ X W ]
[ a_10  a_11  a_12  a_13 ] * [ y ] =  [ Y W ]
[ a_20  a_21  a_22  a_23 ]   [ z ]    [ Z W ]
[ a_30  a_31  a_32  a_33 ]   [ 1 ]    [  W  ]

[ X W ]   [ x a_00 + y a_01 + z a_02 + a_03 ]
[ Y W ]   [ x a_10 + y a_11 + z a_12 + a_13 ]
[ Z W ] = [ x a_20 + y a_21 + z a_22 + a_23 ]
[  W  ]   [ x a_30 + y a_31 + z a_32 + a_33 ]

通过将第一行和第二行除以第四行来获得像素坐标(X,Y)。这一步是从齐次坐标到笛卡尔坐标的转换。

OpenGL投影矩阵的第三行设置方式Z成为投影深度,zn之间的f值(近和远的平面)映射到-1...1。它用于深度测试/剪裁。因为第四行是[0 0 -1 0],所以从齐次坐标到笛卡尔坐标的转换对应于-z的除法,这导致透视变换(具有反转的深度)。

表达投影的任何其他方式将涉及相同的步骤,即线性变换,接着是Z的除法,用于透视缩短。对于这些操作,矩阵是线性代数中的常用表示。

这不是特定于透视投影,但许多3D变换可以使用4x4矩阵表示,包括旋转,平移,缩放,剪切,反射,透视投影,正交投影等。

应该在彼此之后应用的多个变换也可以通过矩阵乘法组合成单个4x4矩阵。例如,围绕X,Y和Z轴的旋转,或MVP矩阵。这是模型 - 视图 - 投影矩阵,其将3D场景中的一个对象的局部坐标系中的3D点转换为其在屏幕上的最终像素坐标。在这些组合矩阵上,所有组件都可以是非零的。

因此优点是单个操作,矢量矩阵乘法可用于所有这些情况,而不是几个不同的操作。它在GPU硬件上以有效的方式执行。

答案 1 :(得分:1)

这不仅仅是关于单个值,还关乎矩阵的数学属性。并且零与非零值一样重要! 值的布局有意义!

具体地,同质变换矩阵的前三列(如3D投影矩阵)形成局部坐标空间的基本矢量,第四列定义平移(在透视投影的情况下,移动基底远离奇点指向原点。)

因此,在3D空间中,每个位置有3个值:您必须将这三个值转换为屏幕上的3个值(第三个值转换为用于深度比较的值)和第4个值(位置和目的地)用于透视变形。因此,对于原始位置中的4个值中的每一个,您必须知道它对输出中的每个值有多大贡献。如果它没有贡献(这同样重要),那么这就是0.所以你总共需要4·4 = 16个值。因此是一个4×4矩阵。

答案 2 :(得分:0)

投影矩阵按原样使用可能非常罕见。通常,您更有可能将投影矩阵与世界连接起来并查看矩阵并一次性乘以world-view-proj矩阵。

此外,GPU功能强大且灵活,但如果他们最擅长做的一件事,那就是对矢量进行一系列乘法增加(尽管新硬件同样有效)标量乘法加法作为向量乘法 - 加法)。矩阵向量乘法只是一系列向量乘法 - 加法,而更紧凑的结构可能效率较低。

那就是说,你的观点并非没有价值,我知道一个成功的基于固定功能的游戏控制台,其投影矩阵的硬件寄存器有限,可以充分利用投影矩阵中大多数条目的精确点通常是未使用的。