所以我有一个场景图来保存我的所有对象,我必须使用我自己的矩阵类来处理所有事情(要求,所以不是可选的,学校)。我已经编写了所有的数学课程,但我不确定如何在代码中完全实现Matrix Stack。
我对它是如何工作有理论上的理解。基本上我的场景是单位矩阵,然后我必须使用我使用我的Matrix 4类创建的相机矩阵,然后我必须循环遍历场景图和glMultMatrix每个级别与其父级。
我认为这是在正确的轨道上,但我以前从未对此进行编码,只研究了背后的理论。
我是否在正确的轨道上?
应该看看这个。
身份矩阵 - >相机矩阵 - > 对于每个对象 重置回Identity Matrix - >相机矩阵 - >从翻译和四元数的乘法生成矩阵与身份矩阵 - >相机矩阵。 为每个孩子 从翻译和四元数乘以父矩阵
生成矩阵所以基本上我没有glMatrixMode,只是因为我的场景图而存在的矩阵堆栈。
我希望这是在正确的轨道上。
答案 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();
}
因此,如果您输入节点,节点的矩阵将添加到堆栈中,如果您离开,则删除矩阵。这样,您就可以获得任意深度和复杂度的图形。你已经注意到每个矩阵都会影响孩子们的转变。