opengl - 使用旧的 OpenGL 功能将单独的旋转应用于多个四边形

标签 opengl

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

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() ,这完全停止了所有板的旋转。

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

最佳答案

由于递归,有点黑客,但这是我可以在短时间内想到的最佳基本情况:

试试这个:

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/

相关文章:

c++ - 如何访问转换后的 openegl 模型 View 矩阵 [尝试过 glGetFloatv()]?

c++ - 为什么这不起作用(glm::make_mat4)?

opengl - 在片段着色器和顶点着色器中计算光照的点积有区别吗?

c++ - 如何在OpenGL中更新 "forward"运动

python - 带有 Snow Leopard 的 Python 中的 OpenGL?

c++ - OpenGL 中的 Oren-Nayar 光照(如何在片段着色器中计算 View 方向)

c++ - OpenGL "paint"程序

c - 在 OpenGL 上,有什么方法可以更新特定位置的纹理吗?

c++ - GLSL 隔行扫描似乎在 3DTV 上甚至跳过了行

macos - 如何在 Mac OS X 中检测 "invalid drawable"?