在搜索投影矩阵(至少在OpenGL中)的计算后,
当我们有这么多空值时,为什么还要使用Matrix呢?我将9个条目标记为0,只有7个条目包含有用数据。为什么不使用类似的1D数组,只是将数据存储在类似列表的形状中?这不会节省内存和时间来创建可以操纵矩阵的函数吗?我确信这整个论点也可以用在其他主题中,这让我想到了,
在投影3D环境中使用矩阵的具体原因是什么?
答案 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
成为投影深度,z
和n
之间的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功能强大且灵活,但如果他们最擅长做的一件事,那就是对矢量进行一系列乘法增加(尽管新硬件同样有效)标量乘法加法作为向量乘法 - 加法)。矩阵向量乘法只是一系列向量乘法 - 加法,而更紧凑的结构可能效率较低。
那就是说,你的观点并非没有价值,我知道一个成功的基于固定功能的游戏控制台,其投影矩阵的硬件寄存器有限,可以充分利用投影矩阵中大多数条目的精确点通常是未使用的。