绘制一个立方体并旋转它:立方体的一部分消失

时间:2012-11-13 17:39:15

标签: c opengl rendering glut

在这段代码中,我尝试绘制一个立方体。我尝试逆时针绘制所有面顶点 问题是,如果我不旋转立方体只绘制红色面,如果我将其旋转5度,我只看到立方体的一部分。

#import <OpenGL/OpenGL.h>
#import <GLUT/GLUT.h>

int width=500, height=500, depth=500;

void init()
{
    glEnable(GL_DEPTH_TEST);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(200, 200,-200, 200, 200, 0, 0, 1, 0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0,width,0,height);
    gluPerspective(90, 1, -100, 100);
    glViewport(0, 0, width, height);
}

void drawCube()
{
    int vertices[8][3]= { {100,100,0} , {300,100,0}, {300,300,0}, {100,300,0}, {100,100,300} , {300,100,300}, {300,300,300}, {100,300,300} };
    glBegin(GL_QUADS);

    glColor4f(1, 0, 0, 0);
    glVertex3iv(vertices[0]);
    glVertex3iv(vertices[1]);
    glVertex3iv(vertices[2]);
    glVertex3iv(vertices[3]);

    glVertex3iv(vertices[4]);
    glVertex3iv(vertices[5]);
    glVertex3iv(vertices[6]);
    glVertex3iv(vertices[7]);

    glColor4f(0, 1, 0, 0);
    glVertex3iv(vertices[1]);
    glVertex3iv(vertices[5]);
    glVertex3iv(vertices[6]);
    glVertex3iv(vertices[4]);

    glVertex3iv(vertices[0]);
    glVertex3iv(vertices[4]);
    glVertex3iv(vertices[7]);
    glVertex3iv(vertices[3]);

    glColor4f(0, 0, 1, 0);
    glVertex3iv(vertices[3]);
    glVertex3iv(vertices[2]);
    glVertex3iv(vertices[6]);
    glVertex3iv(vertices[7]);

    glVertex3iv(vertices[0]);
    glVertex3iv(vertices[1]);
    glVertex3iv(vertices[5]);
    glVertex3iv(vertices[4]);

    glEnd();
}


void display()
{
    glClearColor(0.0, 0.0, 0.0, 0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(200,200,150);
    glRotatef(5, 0, 1, 0);
    glTranslatef(-200,-200,-150);
    drawCube();
    glutSwapBuffers();
}

void idle(void)
{
}

int main(int argc, char * argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(width, height);
    glutCreateWindow("Test");
    glutDisplayFunc(display);
    glutIdleFunc(idle);
    init();
    glutMainLoop();
    return 0;
}

这就是我所看到的:

Window

但是我应该看到一个旋转的立方体,所以我应该看到右边另一个面的一部分。我怀疑是我以逆时针顺序绘制顶点或其他东西出错了。

PS:代码已经过时,因为在我的大学,我没有机会学习最新版本的OpenGL,我必须使用GLUT。

1 个答案:

答案 0 :(得分:1)

夫妻问题:

  1. 您的投影矩阵设置并不明确。

    首先,您应该决定是否需要正交投影或透视投影。

    如果您想要拼写,请使用gluOrtho2d。如果您想要透视投影,请使用gluPerspective。使用两者将产生奇怪的转换,这肯定不是你想要的。

  2. gluPerspective不能有负近平面。近平面应该大于零,可能是像1那样小的东西,其中一个远平面定义了你想要后夹平面离相机的距离。由于您似乎使用了数百个单位,我可能会推荐1000左右的背板。

  3. 您正在调用gluLookAt,但通过调用glLoadIdentity中的display()来删除视图矩阵。如果需要视图矩阵,请在编程后不要将其擦除。