我想渲染具有一定旋转度的四边形,另外,此四边形具有在其下方渲染的“叶”四边形,类似于二叉树结构。每个孩子除了父母之外,还有自己的轮换方式。换句话说,如果根四边形旋转,则整个树都会随之旋转,但是每个子树也可以分别旋转。所以我的递归渲染函数看起来有点像这样...

RenderNode(Node current_node){
    glRotate(current_node->rotation);
    glBegin(GL_QUADS);
      // supply 4 vertices and texture mapping
    glEnd();

    RenderNode(current_node->leftChild);
    RenderNode(current_node->rightChild);
}


现在,我希望子节点的旋转角度与其父节点的旋转略有不同,但是不幸的是,情况并非如此。在单帧中调用glRotate()的次数越多,旋转动画的速度就越快,但是所有板块都位于同一平面上。似乎直到最后都没有渲染任何四边形,并且最新的变换矩阵也已应用于所有这些四边形。作为测试,我尝试将glPushMatrix()放在每次转换之前,将glPopMatrix()放在每次调用glEnd()之后,这完全停止了所有平板的旋转。

有人可以启发我这里发生的事情吗?

最佳答案

由于递归的原因,有些骇人听闻,但这是我可以在短时间内通知的最佳基本案例:

试试这个:

RenderNode(Node current_node, GLfloat parentRotation){
    if(current_node->leftChild != null) RenderNode(current_node->leftChild, parentRotation + current_node->rotation);
    if(current_node->rightChild != null) RenderNode(current_node->rightChild, parentRotation + current_node->rotation);
    glLoadIdentity();
    glRotate(current_node->rotation);
    glBegin(GL_QUADS);
      // supply 4 vertices and texture mapping
    glEnd();
}


这样,您就不必弹出或推送任何矩阵,它只会重置为每个实际几何图形渲染的单位矩阵。如果要渲染其他任何东西,只需记住在渲染网格后再次调用glLoadIdentity()即可。

关于opengl - 使用旧的OpenGL功能将单独的旋转应用于多个四边形,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15461299/

10-16 22:53