在 OpenGL 中设置 3D 空间的尺寸

Posted

技术标签:

【中文标题】在 OpenGL 中设置 3D 空间的尺寸【英文标题】:Setting dimensions of 3D space in OpenGL 【发布时间】:2015-12-03 09:43:12 【问题描述】:
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <freeglut.h>
#include <FreeImage.h>

void display(void) 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    GLint viewport[4];
    glGetIntegerv(GL_VIEWPORT, viewport);
    double aspect = (double)viewport[2] / (double)viewport[3];
    gluPerspective(60, aspect, 1, 100);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0,0,-35);
    static float angle = 0;
    angle += 4.0f;
    //magenta middle cube
    glPushMatrix();
    glTranslatef(0, 0, 0);
    glRotatef(angle, 0.1, 0.2, 0.5);
    glColor3ub(224,8,133);
    glutSolidCube(5);
    glPopMatrix();
    //yellow right cube
    glPushMatrix();
    glTranslatef(10, 5, 0);
    glRotatef(angle, 0.2, 0.3, 0.1);
    glColor3ub(250, 224, 20);
    glutSolidCube(5);
    glPopMatrix();
    //cyan left cube
    glPushMatrix();
    glTranslatef(-10, -5, 0);
    glRotatef(angle, 0.3, 0.2, 0.6);
    glColor3ub(0, 162, 211);
    glutSolidCube(5);
    glPopMatrix();
    glFlush();
    glutSwapBuffers();


void repeat(int val) 
    glutPostRedisplay();
    glutTimerFunc(10, repeat, 0);


int main(int argc, char** argv)

    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
    glutInitWindowSize(500,500);
    glutCreateWindow("SIMPLE DISPLAY");
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_COLOR_MATERIAL);
    glShadeModel(GL_SMOOTH);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-500,500,-500,500,-500,500);
    glutDisplayFunc(display);
    glutTimerFunc(0, repeat, 0);
    glutMainLoop();
    return 0;

我有在 3 空间中绘制三个立方体并旋转它们的代码。我注意到尽管使用了glOrtho(-500,500,-500,500,-500,500),但工作区域非常小。在三个方向上平移立方体使工作区域看起来只有 50x50x50(在 z 维度上不确定,因为它会在消失之前返回 50,但无法确认前面的距离)。将立方体 25 向左或向右平移会使其超出窗口边界。

我以为glOrtho()设置工作区大小,本例为1000x1000x1000?

【问题讨论】:

您绝对应该将所有相关代码添加到问题本身。否则当 pastebin 代码被删除时,这个问题和答案没有意义。 我认为代码可能太长而无法放入 Q 本身,但没问题。 【参考方案1】:

您正在通过gluPerspective 调用覆盖显示函数开头的glOrtho 调用。您只能应用一个投影,透视或正交。

glOrtho 没有定义屏幕的大小,而是一个正交投影矩阵(只要相机不移动,它就可以被视为工作区域的大小)。

【讨论】:

以上是关于在 OpenGL 中设置 3D 空间的尺寸的主要内容,如果未能解决你的问题,请参考以下文章

在 CodeBlocks 中设置 OpenGL

opengl如何在MFC中设置双缓冲

如何在OpenGL中设置背景颜色

如何在 Visual Studio / OpenGL 中设置 GPU [重复]

在 OpenGL 中设置透明背景颜色不起作用

如何在雪豹上的 XCode 中设置 opengl/glut 进行编程?