为什么我会使用OpenGL的矩阵堆栈(而不是包装我自己的矩阵类而只是使用它)?我不确定为什么这么简单的任务会如此复杂。是否有一些特殊用例?
如果没有必要,有什么好的替代品呢?
答案 0 :(得分:11)
OpenGL的矩阵堆栈(有多个 - 每个矩阵模式一个)用于分层模型。也就是说,您可以定义子对象(例如,轮子)相对于其父体(例如,汽车)的绑定,而不考虑绘制子项时父项的位置/方向。也就是说,它允许您轻松直观地组合变换。
matix堆栈(以及一般的GL矩阵运算)不能替代通用矩阵数学库。它们只是存在以允许组合变换有效地应用于顶点数据。正如其他人所说,随着固定功能管道的消亡,这个功能已从OpenGL中删除,因为着色器程序的需求不如旧管道的需要统一。
答案 1 :(得分:2)
您主要使用内置矩阵堆栈,因为OpenGL会自动应用它们。它们已在最近的OpenGL版本中被删除,因此至少有少数人显然认为它们是不必要的。就个人而言,我认为这是一个糟糕的决定,但这就是生活。另一种方法是自己实现它们 - 唯一的安慰是对于3D图形的大多数用途,你通常不得不自己做一些矩阵乘法(等等),所以它经常不会产生很多差。
答案 2 :(得分:2)
矩阵堆栈用于连接矩阵。通常用于层次模型,其中转换相对于另一个表达。可以在堆栈上加载矩阵并转换该空间中的顶点,然后通过弹出堆栈返回到父空间。您可以在代码中自己管理所有这些,并且通常您更喜欢 - 特别是除了简单绘图或经常访问它们之外,矩阵用于其他事情的情况。动画系统将是一个典型的例子。
答案 3 :(得分:1)
没有必要 - 您可以自己完成所有自己的矩阵工作并始终调用glLoadMatrix - 但是,没有必要更换它。如果您正在使用VBO和显示列表,那么您只会让生活变得困难。
答案 4 :(得分:0)
矩阵是您提供的几何体(顶点)改变坐标系和投影的机制,最终最终在像素空间中的屏幕上。因此,在这个意义上,一些矩阵表示不同的坐标系(例如,诸如腿的分层模型的父/子关系),并且一些表示从世界空间到视图空间到设备(像素)空间的变换。基本上它们是一种机制,通过它您可以操纵顶点,但它们在语义上与诸如此类的操作相对应。它们堆叠在一起,便于用它们编程。