我在阅读以下有关推/弹方法的文章时,在使用场景/图形"系统"时,并不真正需要渲染。 (参考链接如下)。
我现在只是好奇,如果不需要矩阵推/弹,那么如何正确地渲染(和变换)一组对象,如旋转轮和普通旋转轮的无处不在的例子。螺栓?
答案 0 :(得分:1)
所有推动和弹出都是一个矩阵堆栈。所有矩阵堆栈都实现了先前有源矩阵的存储和恢复。因此,它是一种管理场景的便捷方式,原因与调用堆栈是一种运行程序的便捷方式相同,但它远非必需。
所以,例如您可能只有相机矩阵M
,并且对于每个对象i
,对象矩阵为Oi
。
然后依次为每个对象计算GL的旧MODELVIEW
的等价物,它只是M
和Oi
的组合。无需从堆栈中存储或恢复任何内容。您知道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示例中,您有一个隐式树,其中所有内容都是根的第一级子级。类似地,任何其他代码结构都可能影响隐式树。