WebGL - 推动和推动的替代方案是什么?弹出矩阵?

时间:2014-06-25 21:43:58

标签: opengl-es webgl

我在阅读以下有关推/弹方法的文章时,在使用场景/图形"系统"时,并不真正需要渲染。 (参考链接如下)。

我现在只是好奇,如果不需要矩阵推/弹,那么如何正确地渲染(和变换)一组对象,如旋转轮和普通旋转轮的无处不在的例子。螺栓?

参见参考: Does webGL contain push/popMatrix?

1 个答案:

答案 0 :(得分:1)

所有推动和弹出都是一个矩阵堆栈。所有矩阵堆栈都实现了先前有源矩阵的存储和恢复。因此,它是一种管理场景的便捷方式,原因与调用堆栈是一种运行程序的便捷方式相同,但它远非必需。

所以,例如您可能只有相机矩阵M,并且对于每个对象i,对象矩阵为Oi

然后依次为每个对象计算GL的旧MODELVIEW的等价物,它只是MOi的组合。无需从堆栈中存储或恢复任何内容。您知道M,而且您知道Oi,这就是您需要知道的全部内容。

编辑:例如为了论证,假设你正在写Battlezone。然后你在游戏区域有一堆物体。每个对象都有一个位置和一个旋转。一个这样的物体将是安装摄像机的播放器。您可以通过(i)从玩家的位置和旋转计算视图矩阵来绘制场景;然后(ii)循环播放场上的每个物体,从其位置和旋转计算模型矩阵;并且,对于每一个,(iii)组合两者,将结果发布到OpenGL并进行绘制对象所需的几何调用。

没有筹码。

同样的事情适用于任何只是一个平面对象列表的游戏区域(除此之外:为了简单起见,我忽略了广泛的相位模型剔除)。

现在假设某些对象是子对象,其位置和方向仅根据父对象定义。在这种情况下,无论您是否将其存储为一个,都有一个对象树。

一个解决方案可能与Battlezone解决方案基本相同,您可以依次遍历每个对象,但现在可以:

model matrix = identity
while(object is not root)
{
    compose model matrix with matrix for this object
    let object = parent object
}

所以你要从孩子到另一个孩子走路。

仍然没有堆叠。

相反,你可以翻转一下,让隐式的普通调用堆栈成为一个堆栈:

draw object: object, parent matrix: parent matrix

    child matrix = composition of parent matrix and this object's matrix
    draw object

    for(children of object)
    {
         draw object: child, parent matrix: child matrix
    }

所以那里有一个堆栈,但它是调用堆栈。

当然,您的树不必是正式的树数据结构。在Battlezone示例中,您有一个隐式树,其中所有内容都是根的第一级子级。类似地,任何其他代码结构都可能影响隐式树。