为什么我的 OpenGL 对象相对于最后一个绘制的对象绘制

Why are my OpenGL objects drawing relative to the last object drawn?

本文关键字:绘制 对象 我的 最后一个 相对于 为什么 OpenGL      更新时间:2023-10-16

我很确定这是因为我对GL_MODELVIEW矩阵的工作原理缺乏了解。以下是正在发生的事情的屏幕截图:http://youtu.be/3F7FLkVI7kA

如您所见,最底部的三角形是正在绘制的第一个三角形,并且按照我期望其他 2 个三角形移动的方式移动。第二个三角形相对于第一个三角形移动和旋转,第三个三角形相对于该组合移动和旋转。

我想要的是所有三个三角形在3D空间中都是静止的,但旋转(就像第一个三角形一样)。

源:

// Main loop
do {
    // Clear Screen
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // Update camera
    glfwGetCursorPos(window, &cursorX, &cursorY);
    cam.update(0.001f, (int)cursorX, (int)cursorY);
    // Reset Matrix
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    // move camera
    glRotatef(cam.rotation.x, 1.0f, 0.0f, 0.0f);
    glRotatef(cam.rotation.y, 0.0f, 1.0f, 0.0f);
    // translate modelview matrix to position of the camera - everything should now draw relative to camera position
    glTranslatef(-cam.position.x, cam.position.y, -cam.position.z);
    // Draw ground
    drawGroundGrid(-25.0f);
    drawSpinningTriangle(0.0f, 0.0f, -5.0f);
    drawSpinningTriangle(3.14f, 3.0f, -6.0f);
    drawSpinningTriangle(-6.0f, 12.0f, -5.0f);
    // Swap buffers - back buffer is now front buffer to be rendered to next frame
    glfwSwapBuffers(window);
    glfwPollEvents();
    calcFPS();
} while (!glfwGetKey(window, GLFW_KEY_ESCAPE) && !glfwWindowShouldClose(window));// Main Loop End
[...]
void drawSpinningTriangle(float x, float y, float z) {
    glMatrixMode(GL_MODELVIEW);
    glTranslatef(x, y, z);
    glRotatef(glfwGetTime() * 50.0f, 0.0f, 1.0f, 0.0f);
    glBegin(GL_TRIANGLES);
    {
        // Red vertex
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);
        // Yellow vertex
        glColor3f(1.0f, 1.0f, 0.0f);
        glVertex3f(-1.0f, -1.0f, 0.0f);
        // White vertex
        glColor3f(1.0f, 1.0f, 1.0f);
        glVertex3f(1.0f, -1.0f, 0.0f);
    }
    glEnd();
}

首先不推荐使用矩阵堆栈。管理自己的矩阵要好得多

其次,您应该在转换之前和绘制之后推送矩阵和弹出矩阵:

void drawSpinningTriangle(float x, float y, float z) {
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glTranslatef(x, y, z);
    glRotatef(glfwGetTime() * 50.0f, 0.0f, 1.0f, 0.0f);
    glBegin(GL_TRIANGLES);
    {
        // Red vertex
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);
        // Yellow vertex
        glColor3f(1.0f, 1.0f, 0.0f);
        glVertex3f(-1.0f, -1.0f, 0.0f);
        // White vertex
        glColor3f(1.0f, 1.0f, 1.0f);
        glVertex3f(1.0f, -1.0f, 0.0f);
    }
    glEnd();
    glPopMatrix();
}

这将保存并恢复最顶层的矩阵,以便删除 2 个调用之间的任何更改。