Matrix Stack,glLoadMatrix和glMultMatrix使用场景图和相机?

时间:2012-11-06 21:58:21

标签: c++ opengl matrix

所以我有一个场景图来保存我的所有对象,我必须使用我自己的矩阵类来处理所有事情(要求,所以不是可选的,学校)。我已经编写了所有的数学课程,但我不确定如何在代码中完全实现Matrix Stack。

我对它是如何工作有理论上的理解。基本上我的场景是单位矩阵,然后我必须使用我使用我的Matrix 4类创建的相机矩阵,然后我必须循环遍历场景图和glMultMatrix每个级别与其父级。

我认为这是在正确的轨道上,但我以前从未对此进行编码,只研究了背后的理论。

我是否在正确的轨道上?

应该看看这个。

身份矩阵 - >相机矩阵 - > 对于每个对象 重置回Identity Matrix - >相机矩阵 - >从翻译和四元数的乘法生成矩阵与身份矩阵 - >相机矩阵。 为每个孩子 从翻译和四元数乘以父矩阵

生成矩阵

所以基本上我没有glMatrixMode,只是因为我的场景图而存在的矩阵堆栈。

我希望这是在正确的轨道上。

2 个答案:

答案 0 :(得分:1)

  

场景是单位矩阵

不,单位矩阵只是一个矩阵,乘以不会改变任何东西。

  

我必须遍历场景图和glMultMatrix每个级别及其父级。

不是真的。做自己的矩阵数学的想法,不是依靠OpenGL为你做任何事情。这包括矩阵乘法。如果你实际使用OpenGL固定函数矩阵,你可以使用glLoadMatrix。但最好采用现代方式:使用着色器并将矩阵作为制服提供。

作为转换管道工作原理的概述,我建议你https://stackoverflow.com/a/13223392/524368

  

我希望这是在正确的轨道上。

差不多,你觉得有点太复杂了。做自己的矩阵数学的好处是,你可以通过哪种方式实现自由。

就个人而言,我是现场数学运算的粉丝。使用这个范例,对于矩阵层次结构中的每个步骤,您将获取较低级别的副本,并对该层次进行修改。这样的树很好地遍历了。对于每个绘图操作,您只需在变换层次树中的分支/叶子处加载矩阵,您当前正在遍历。在绘制每个东西之后,不需要重置,你只需加载下一个东西,也许可以释放中间结果的记忆。

答案 1 :(得分:0)

嗯,你是在正确的轨道上,但大多数情况下处理方式有点不同。

我们假设堆栈的顶部是活动矩阵。所以在开始时我们有一个带有单位矩阵的堆栈。你应该熟悉push和pop调用。这些基本上如下:

push(Matrix m)
{
    newMatrix = stack.top() * m; //Or the other way round. This depends on the matrix definition and the function of the * operator
    put newMatrix on stack;
}
pop()
{
    remove first element from stack;
}

您已经发现首先需要投影和视图矩阵。所以:

push(cameraMatrix);

然后你可以迭代场景图。我假设您有一个简单的递归迭代,它为每个子进程调用以下方法:

iterate_node(node)
{
    generate matrix from translate and quaternions
    push(matrix);
    for each (children of this node)
        iterate_node(child)
    next
    pop();
}

因此,如果您输入节点,节点的矩阵将添加到堆栈中,如果您离开,则删除矩阵。这样,您就可以获得任意深度和复杂度的图形。你已经注意到每个矩阵都会影响孩子们的转变。