0

所以我有一个包含所有对象的场景图,并且我必须对所有内容使用我自己的矩阵类(要求,所以不是可选的,学校)。我已经编写了所有数学课,但我不确定如何在代码中准确地实现 Matrix Stack。

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

我认为这是在正确的轨道上,但我以前从未编写过代码,只是研究了它背后的理论。

我在正确的轨道上吗?

它应该看起来这个。

Identity Matrix -> Camera Matrix -> For Each Object Reset back to Identity Matrix -> Camera Matrix -> Generate Matrix from Translate and Quaternion's Multiply that with Identity Matrix -> Camera Matrix。对于每个孩子,从翻译和四元数乘以父母的矩阵生成矩阵

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

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

4

2 回答 2

1

场景是单位矩阵

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

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

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

作为对转换管道如何工作的回顾,我建议您参考https://stackoverflow.com/a/13223392/524368

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

差不多,你想的有点太复杂了。进行自己的矩阵数学运算的好处是,您可以完全自由地实现事物。

Personally I'm a fan of in-place math operation. Using this paradigm, for each step in the matrix hierachy you'd take a copy of the lower level, and do your modifications on that one. Such a tree is nicely traversed. And for every drawing operation you just load the matrix at the branch/leaf in the transform hierachy tree, you're currently traversing. And after drawing each thing, there's no need for a reset, you just load the next thing, and maybe free the memory of intermediary results.

于 2012-11-06T23:32:07.677 回答
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();
}

因此,如果您输入一个节点,则该节点的矩阵将添加到堆栈中,如果您离开它,则该矩阵将被删除。这样,您可以拥有任意深度和复杂性的图表。你已经注意到每个矩阵都会影响孩子的变换。

于 2012-11-06T23:31:33.950 回答