3D场景图遍历问题

rgn*_*ngl 2 opengl 3d traversal scenegraph

我实现了一个由OpenGL渲染的小场景图,所有对象都来自一个公共Node类,在OpenGL帧渲染过程中,我只是调用visit根节点的方法,并以递归方式遍历图形.我开始遍历时传递的第一个矩阵是相机矩阵.

visit方法如下所示:

void Node::visit(const QMatrix4x4 &mv) {
    QMatrix4x4 m = mv;
    m.rotate(m_rot);
    m.translate(m_pos);
    m.scale(m_scale);

    m_effectiveMV = m;

    for (int i = 0; i < m_children.size(); i++) {
        m_children[i]->visit(m_effectiveMV);
    }

    draw(); // draws if this node has anything to draw,
            // otherwise just transformation.
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当我为子节点设置旋转时,旋转相对于父节点发生,而不是在节点本身周围发生.谁能发现我在这里做错了什么?

kva*_*ark 6

假设你的矩阵方法正在做正确的事情,翻译应该是列表中的第一个:

m.translate(m_pos);
m.rotate(m_rot);
m.scale(m_scale);
Run Code Online (Sandbox Code Playgroud)

这将首先缩放和旋转顶点,然后将其转换为父系统,依此类推.