Search code examples
opengl3dtraversalscenegraph

3D Scene graph traversing problem


I have implemented a small scene graph to be rendered by OpenGL, all the objects derive from a common Node class and during OpenGL frame rendering I just call the visit method of the root node and it traverses the graph recursively. The first matrix I pass when beginning traversal is the camera matrix.

The visit method looks like this:

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.
}

The problem I experience is, when I set rotation for a child node, the rotation happens relative to the parent node, not around the node itself. Can anyone spot what I'm doing wrong here?


Solution

  • Assuming your matrix methods are doing the right thing, translation should be the first one in the list:

    m.translate(m_pos);
    m.rotate(m_rot);
    m.scale(m_scale);
    

    This will first scale and rotate the vertex, then translate it into the parents system and so on.