Начертайте куб и го завъртете: част от куба изчезва

В този код се опитвам да начертая куб. Опитвам се да начертая всички върхове на лица обратно на часовниковата стрелка.
Проблемът е, че ако не завъртя куба, се изчертава само червеното лице, ако вместо това го завъртя на 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;
}

Ето какво виждам:

Прозорец

Но трябва да видя завъртян куб, така че трябва да видя частта от другото лице вдясно. Съмнението ми е, че греша, като начертая върховете обратно на часовниковата стрелка, или нещо друго.

PS: кодът е остарял, защото в моя университет нямам възможност да изучавам най-новата версия на OpenGL и трябва да използвам GLUT.


person Ramy Al Zuhouri    schedule 13.11.2012    source източник


Отговори (1)


Няколко проблема:

  1. Вашата настройка на проекционната матрица не е разумна.

    Първо, трябва да решите дали искате ортографска или перспективна проекция.

    Ако искате ортографски, използвайте gluOrtho2d. Ако искате проекция в перспектива, използвайте gluPerspective. Използването на двете ще генерира странна трансформация, която със сигурност не е това, което искате.

  2. gluPerspective не може да има отрицателна близка равнина. Близката равнина трябва да е по-голяма от нула, може би нещо малко като 1, с далечна равнина, определяща колко далеч от камерата искате да бъде равнината на задния клип. Тъй като изглежда, че използвате единици от стотици, може да препоръчам задна равнина от 1000 или така.

  3. Извиквате gluLookAt, но изтривате матрицата на изгледа, като извиквате glLoadIdentity в display(). Ако искате матрица за изглед, не я изтривайте, след като сте я програмирали.

person Tim    schedule 13.11.2012
comment
Всичко е наред, с изключение на това, че сега мога да го направя само с ортографска проекция, а не с проспективна проекция. Стойностите на gluPerspective, които опитвам, са 45, 1, 1, 1000 и не виждам куба в прозореца. - person Ramy Al Zuhouri; 13.11.2012