我想渲染具有特定旋转的四边形,此外,此四边形在其下方呈现“叶”四边形,类似于二叉树结构。除了父母的孩子之外,每个孩子都有自己的轮换。换句话说,如果根四边形旋转,整个树随之旋转,但每个子树也可以单独旋转。所以我的递归渲染函数看起来有点像......
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(),这样就完全停止了所有平板的旋转。
有人可以告诉我这里发生了什么吗?
答案 0 :(得分:0)
由于递归而有点hackish,但这是我能提出短促通知的最佳基本情况:
试试这个:
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()
。