3

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

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(),在每次调用 glEnd() 之后放置 glPopMatrix(),这完全停止了所有板的旋转。

有人可以告诉我这里发生了什么吗?

4

1 回答 1

0

由于递归,有点骇人听闻,但这是我能想到的最好的基本情况:

尝试这个:

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()如果要渲染其他任何内容,请记住在渲染网格后再次调用。

于 2013-03-17T13:42:49.070 回答