Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[OpenGL] Problem z wyświetlaniem sześcianów w zależności od kąta patrzenia

Ostatnio zmodyfikowano 2012-03-17 08:43
Autor Wiadomość
Mrusio
Temat założony przez niniejszego użytkownika
[OpenGL] Problem z wyświetlaniem sześcianów w zależności od kąta patrzenia
» 2012-03-16 14:18:28
Witam

Uczę się openGL, zrobiłem kamerę sterowaną przez użytkownika i chciałem dodać na scenę kilka sześcianów obok siebie. Wszystko wygląda ok jeśli patrzymy z jednej strony:
http://imageshack.us/photo/my-images/3/openglok.jpg/
ale jeśli pójdziemy spojrzeć z drugiej strony to dzieje się takie coś:
http://imageshack.us/photo/my-images/217/openglnook.jpg/
może ktoś wpadnie na to gdzie leży problem? bo prawdę mówiąc nie wiem nawet który kawałek kodu wkleić, aby pokazać.

Pozdrawiam
P-52691
wojownik266
» 2012-03-16 14:43:33
No to wklej cały!
P-52692
ison
» 2012-03-16 14:49:45
gdzieś wyłączasz depth test
P-52693
Mrusio
Temat założony przez niniejszego użytkownika
» 2012-03-16 15:09:04
nie wyłączam nigdzie.
Mam w funkcji inicjalizującej:

C/C++
void init( char * title, int width, int height, int argc, char * argv[] ) {
    glutInit( & argc, argv ); // inicjalizacja biblioteki GLUT
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB ); // inicjalizacja bufora ramki
    glutInitWindowSize( width, height ); // rozmiary głównego okna programu
    //glutFullScreen(); //fullscren
    glutCreateWindow( title ); // utworzenie głównego okna programu
    glutDisplayFunc( Display ); // dołączenie funkcji generującej scenę 3D
    glutIdleFunc( Display );
    glutReshapeFunc( Reshape ); // dołączenie funkcji wywoływanej przy zmianie rozmiaru okna
   
    glutKeyboardFunc( pressKey );
    glutIgnoreKeyRepeat( 1 );
    glutKeyboardUpFunc( releaseKey );
   
    glutSpecialFunc( pressSpecKey ); // dołączenie funkcji obsługi klawiszy funkcyjnych i klawiszy kursora
    glutIgnoreKeyRepeat( 1 );
    glutSpecialUpFunc( releaseSpecKey );
   
    //mycha
    glutEntryFunc( mouseDetect );
    glutMouseFunc( mouseButton );
    //glutMotionFunc(mouseMove);//wcisniety klawisz i poruszanie
    glutPassiveMotionFunc( mouseMove ); //poruszanie bez wcisnietego klawisza
   
   
    //tekstury
    glEnable( GL_TEXTURE_2D );
   
   
   
    glutWarpPointer( glutGet( GLUT_WINDOW_WIDTH ) / 2, glutGet( GLUT_WINDOW_HEIGHT ) / 2 ); //ustawienie kursora na środku, aby kamera dzialala jak trzeba
   
    glutSetCursor( GLUT_CURSOR_NONE ); //ukrycie kursora
   
    // OpenGL init
    glEnable( GL_DEPTH_TEST );
    glDepthFunc( GL_LEQUAL );
   
    glEnable( GL_CULL_FACE ); //zeby nie rysowalo tego czego nie widac (za scianami itp)
    glCullFace( GL_BACK );
    glFrontFace( GL_CCW ); //czyli strona przednia to ta, której wierzchołki ułożone są przeciwnie do ruchu wskazówek zegara
   
   
    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
   
   
    glutMainLoop(); // wprowadzenie programu do obsługi pętli komunikatów
}

A skrzynie robię tak:
C/C++
void teksturowana_skrzynia() {
    static bool tekstura_wczytana = false;
    static GLuint texture;
    if( !tekstura_wczytana ) {
        LoadGLTextures( & texture, "C:\\Users\\Mariusz\\Desktop\\c++\\projects\\crate.bmp" );
        tekstura_wczytana = true;
    }
    glBindTexture( GL_TEXTURE_2D, texture );
    glBegin( GL_QUADS );
    // Front Face
    glTexCoord2f( 0.0f, 0.0f ); glVertex3f( - 1.0f, - 1.0f, 1.0f ); // Bottom Left Of The Texture and Quad
    glTexCoord2f( 1.0f, 0.0f ); glVertex3f( 1.0f, - 1.0f, 1.0f ); // Bottom Right Of The Texture and Quad
    glTexCoord2f( 1.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, 1.0f ); // Top Right Of The Texture and Quad
    glTexCoord2f( 0.0f, 1.0f ); glVertex3f( - 1.0f, 1.0f, 1.0f ); // Top Left Of The Texture and Quad
    // Back Face
    glTexCoord2f( 1.0f, 0.0f ); glVertex3f( - 1.0f, - 1.0f, - 1.0f ); // Bottom Right Of The Texture and Quad
    glTexCoord2f( 1.0f, 1.0f ); glVertex3f( - 1.0f, 1.0f, - 1.0f ); // Top Right Of The Texture and Quad
    glTexCoord2f( 0.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, - 1.0f ); // Top Left Of The Texture and Quad
    glTexCoord2f( 0.0f, 0.0f ); glVertex3f( 1.0f, - 1.0f, - 1.0f ); // Bottom Left Of The Texture and Quad
    // Top Face
    glTexCoord2f( 0.0f, 1.0f ); glVertex3f( - 1.0f, 1.0f, - 1.0f ); // Top Left Of The Texture and Quad
    glTexCoord2f( 0.0f, 0.0f ); glVertex3f( - 1.0f, 1.0f, 1.0f ); // Bottom Left Of The Texture and Quad
    glTexCoord2f( 1.0f, 0.0f ); glVertex3f( 1.0f, 1.0f, 1.0f ); // Bottom Right Of The Texture and Quad
    glTexCoord2f( 1.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, - 1.0f ); // Top Right Of The Texture and Quad
    // Bottom Face
    glTexCoord2f( 1.0f, 1.0f ); glVertex3f( - 1.0f, - 1.0f, - 1.0f ); // Top Right Of The Texture and Quad
    glTexCoord2f( 0.0f, 1.0f ); glVertex3f( 1.0f, - 1.0f, - 1.0f ); // Top Left Of The Texture and Quad
    glTexCoord2f( 0.0f, 0.0f ); glVertex3f( 1.0f, - 1.0f, 1.0f ); // Bottom Left Of The Texture and Quad
    glTexCoord2f( 1.0f, 0.0f ); glVertex3f( - 1.0f, - 1.0f, 1.0f ); // Bottom Right Of The Texture and Quad
    // Right face
    glTexCoord2f( 1.0f, 0.0f ); glVertex3f( 1.0f, - 1.0f, - 1.0f ); // Bottom Right Of The Texture and Quad
    glTexCoord2f( 1.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, - 1.0f ); // Top Right Of The Texture and Quad
    glTexCoord2f( 0.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, 1.0f ); // Top Left Of The Texture and Quad
    glTexCoord2f( 0.0f, 0.0f ); glVertex3f( 1.0f, - 1.0f, 1.0f ); // Bottom Left Of The Texture and Quad
    // Left Face
    glTexCoord2f( 0.0f, 0.0f ); glVertex3f( - 1.0f, - 1.0f, - 1.0f ); // Bottom Left Of The Texture and Quad
    glTexCoord2f( 1.0f, 0.0f ); glVertex3f( - 1.0f, - 1.0f, 1.0f ); // Bottom Right Of The Texture and Quad
    glTexCoord2f( 1.0f, 1.0f ); glVertex3f( - 1.0f, 1.0f, 1.0f ); // Top Right Of The Texture and Quad
    glTexCoord2f( 0.0f, 1.0f ); glVertex3f( - 1.0f, 1.0f, - 1.0f ); // Top Left Of The Texture and Quad
    glEnd();
   
}
P-52694
ison
» 2012-03-16 15:15:03
przecież ta skrzynia (czy gracz czy co to tam jest ;)) z uśmieszkiem ma inną teksturę to jak ją renderujesz za pomocą tej funkcji?
pokaż miejsce gdzie wywołujesz teksturowana_skrzynia()
P-52697
Mrusio
Temat założony przez niniejszego użytkownika
» 2012-03-16 15:23:29
ale zauważ że problem nie dotyczy tylko tej jednej. Pozostałe też nachodzą na siebie, a ta skrzynia z uśmieszkiem jest tak samo jak ta funkcja wklejona tylko inną ścieżkę ma po prostu.


Tutaj kod o który prosiłeś
C/C++
void Rysuj() {
   
   
   
    line_ground();
    uklad_wspolrzednych();
    glColor3f( 0, 1, 0.8 );
   
   
    teksturowana_skrzynia();
    glTranslatef( 2.0, 0.0, 0.0 );
    teksturowana_skrzynia();
    glTranslatef( 2.0, 0.0, 0.0 );
    teksturowana_skrzynia2();
    glTranslatef( 2.0, 0.0, 0.0 );
    teksturowana_skrzynia();
   
   
   
}

Natomiast funkcja Rysuj jest tutaj:

C/C++
void Display() {
   
   
   
    int w = glutGet( GLUT_WINDOW_WIDTH ), h = glutGet( GLUT_WINDOW_HEIGHT );
    float ratio = 1.0 * w / h;
   
   
   
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // Clear Color and Depth Buffers
   
    glMatrixMode( GL_PROJECTION ); // Use the Projection Matrix      
    glLoadIdentity(); // Reset Matrix
    gluPerspective( 45, ratio, 0, 1000 ); // Set the correct perspective.
   
   
    // Set the camera
    Kamera.Move();
    gluLookAt( Kamera.x, Kamera.y, Kamera.z, // wpółrzędne położenia obserwatora
    Kamera.LookAtX(), Kamera.LookAtY(), Kamera.LookAtZ(), // współrzędne punktu w którego kierunku jest zwrócony obserwator,
    Kamera.stompx, Kamera.stompy, Kamera.stompz );
   
   
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
   
    ///////
    Rysuj();
    /////
   
    //zmiana rzutowania
    /*rzutowanie na ekran*/
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
   
   
   
   
   
    glOrtho( 0, w, 0, h, - 2.0, 2.0 );
   
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    obiektyw_kamery( w, h );
   
   
    glutSwapBuffers();
}
P-52699
ison
» 2012-03-16 15:35:01
ale zauważ że problem nie dotyczy tylko tej jednej.
ano prawda, teraz dopiero zauważyłem.
Dziwne trochę, nie wiem czemu tak się dzieje.
w teksturowana_skrzynia2() nie wyłączasz nigdzie depth testu?
P-52701
Mrusio
Temat założony przez niniejszego użytkownika
» 2012-03-16 15:42:51
Nie wyłączam. Jeszcze wklejam dwa screeny z wyłączoną tą skrzynią z uśmieszkiem. W sensie nie wyłączoną tylko bez niej :)
http://imageshack.us/photo/my-images/72/openglnook3.jpg
a jak przejdziemy jeszcze kawałek (na screenie wyżej stoimy przed skrzyniami, na screenie niżej - za skrzyniami):
http://imageshack.us/photo/my-images/11/openglnook2.jpg
P-52703
« 1 » 2
  Strona 1 z 2 Następna strona