Opengl es WebGL-除了推送和;弹出矩阵?

Opengl es WebGL-除了推送和;弹出矩阵?,opengl-es,webgl,Opengl Es,Webgl,我阅读了以下关于使用场景/图形“系统”(下面的参考链接)时不需要渲染时的推/弹出方法的帖子 我现在很好奇,如果不需要矩阵push/pop,如何正确地渲染(和变换)一组对象,比如无处不在的旋转车轮和螺栓的示例 见参考资料: 推和弹出所实现的只是一个矩阵堆栈。矩阵堆栈实现的全部功能是存储和恢复以前的活动矩阵。因此,这是一种管理场景的方便方法,原因与调用堆栈是运行程序的方便方法相同,但它远远不是必需的 例如,您可能只需要摄像头矩阵,M,对于每个对象i,对象矩阵Oi 然后依次为每个对象计算GL的旧MOD

我阅读了以下关于使用场景/图形“系统”(下面的参考链接)时不需要渲染时的推/弹出方法的帖子

我现在很好奇,如果不需要矩阵push/pop,如何正确地渲染(和变换)一组对象,比如无处不在的旋转车轮和螺栓的示例

见参考资料:

推和弹出所实现的只是一个矩阵堆栈。矩阵堆栈实现的全部功能是存储和恢复以前的活动矩阵。因此,这是一种管理场景的方便方法,原因与调用堆栈是运行程序的方便方法相同,但它远远不是必需的

例如,您可能只需要摄像头矩阵,
M
,对于每个对象
i
,对象矩阵
Oi

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

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

没有堆叠

同样的事情也适用于任何仅仅是一个简单的对象列表的游戏场(旁白:为了简单起见,我忽略了广泛的阶段模型剔除)

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

一种解决方案可能与战区解决方案基本相同,即依次迭代每个对象,但现在这样做了:

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
    }
这里有一个堆栈,但它是调用堆栈


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

谢谢。所以让我直说吧。我应该为每个对象设置一个对象矩阵(我在代码中称之为“模型矩阵”)?目前我只有这个对象/模型矩阵的一个实例(我对每个对象重复使用相同的矩阵,在开始对每个对象使用矩阵之前清除矩阵(设置标识)。然而,我主要困惑的是如何在父对象上进行变换并影响其所有子对象。如果不使用push/pop,我如何做到这一点?你认为push和popping能实现什么?如果您有摄影机、父对象和子对象矩阵
C
P
O
,那么您可以将
C
P
O
组合在一起作为模型视图。只是在任何时候把它们放在一个堆栈上,然后就没有堆栈了。不管你用什么方法来了解模型之间的关系。我说的是另一种方法,在这种方法中不会出现矩阵推/弹出。在这种情况下,我键入的所有内容都准确地回答了你的问题。这就是堆栈的含义:-只要不实现一个堆栈,就不会有一个。使用你现有的任何其他结构来描述你的场景——通常是某种树,但它可能只是一个平面阵列或一系列阵列。存储问题与3d数学完全无关。