[GELÖST]SDL + OpenGL Anfängerproblem



  • Hallo,

    Ich habe ein Problem beim Anzeigen von Objekten mit OpenGL. Immer wenn ich versuche ein Objekt mit glTranslate an der z-Achse nach hinten in den Raum zu schieben, verschwindet es, wenn z < -1 und auch wenn z > 1. Wenn ich also versuche mein einfaches Dreieck mit glTranslatef(1.5f, 0,0f, -6.0f) zu verschieben ist es weg. Das ganze läuft unter Linux.

    Hier ist der gesamte code, ich muss allerdings gestehen das ich mir das zum großen Teil zusammenkopiert habe. Aber bevor ich jetzt Ratschläge bekomme wie: Wenn du den Code garnicht verstest lies doch lieber erstmal ein Tutorial,
    1.) Ich verstehe den code, und
    2.) Ich habe bereits diverse Tutorials gelesen.
    3.) Kann ich ein wenig mit Blender umgehen und somit auch mit einem dreidimensionalen Koordinatensystem.

    Wahrscheinlich liegt die Lösung in einer Umgebungsvariable die nicht/falsch gesetzt wurde, oder einer Funktion die nicht/an der falschen Stelle aufgerufen wurde. Da liegt mein Problem, ich kenne noch nicht so viele Befehle, und solange ich dieses Problem habe kann ich mit diesem Code nicht weiter lernen.

    #include <stdlib.h>
    #include "SDL.h"           
    #include "SDL_image.h"     
    #include "time.h"          
    #include "SDL_opengl.h"
    #define TRUE 1
    #define FALSE 0
    
    void Render()
        {    
             glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
    
             glTranslatef(-1.5,0.0,0.0);        //<-- Problemstelle
             glTranslatef(0.0, 0.0,-6.0);       //<-- Problemstelle                               
             glBegin(GL_TRIANGLES);
             glVertex3f(-1.0,-1.0, 0.0);  
             glVertex3f( 1.0,-1.0, 0.0);
             glVertex3f( 0.0, 1.0, 0.0);
             glEnd;
    
             SDL_GL_SwapBuffers();  
        }
    
    void Init_OpenGL()     
        {
              SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);    
    
              glClearColor(0.0f, 0.0f, 0.0f, 0.0f);           
    
              glShadeModel(GL_SMOOTH);                        
        }
    
    int main(int argc, char *argv[])
        {
             SDL_Event ev;
             int done = FALSE;
    
             SDL_SetVideoMode(800, 600, 32, SDL_OPENGL);
    
             Init_OpenGL();
    
             while(!done)
             {
                  SDL_PollEvent(&ev);
    
                  if(ev.type == SDL_QUIT || ev.key.keysym.sym == SDLK_ESCAPE)
                       done = TRUE;
    
                  Render();
             }
    
             SDL_Quit();
             return 0;
        }
    

    Ich Danke euch schon mal im voraus für die Beantwortung dieser, wahrscheinlich banalen, Frage 🙂


  • Mod

    wo setzt du den viewport (aufruf an glOrtho glPerspective)



  • Meinst du diese Funktion: http://wiki.delphigl.com/index.php/gluPerspective? Wenn du diese meinst, was währen denn vernünftige Werte z.B. für fovy und aspect?

    ps: Danke für die schnelle Antwort, man fühlt sich gleich gut aufgehoben 😉 👍


  • Mod

    je nach dem was du eigentlich fuer nen view willst, has du glortho/glfrustum bzw gluperspective zur wahl, es haengt also nicht nur von den werten ab.

    bei nehe kannst du dir im tutorial genaueres anschauen.
    z.B. http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=17

    glOrtho(0,640,0,480,-1,1);
    


  • Soweit ich das im Tutorial verstanden habe gehört das in mein Void Render, aber wenn ich das dort rein kopiere, dann sehe ich aber nur schwarz, auch wenn das irgendwo anders hinein kopiere. Und gluPerspective kann ich nicht nutzen weil ich den Befehl zum Linken der Bibliothek nicht kenne....

    Edit: Ich habe jetzt gluPerspective benutzt, und ein kleines Skript geschrieben, mit dem man ein Dreieck hin und her, bzw. rauf und runter bewegen kann. Dabei ist mir dann aufgefallen, das der Bildschirm garnicht aktualisiert wird. Wie kann ich das ändern?

    #include <stdlib.h>
    #include "SDL.h"           
    #include "SDL_image.h"     
    #include "time.h"          
    #include "SDL_opengl.h"
    #include "GL/glu.h"
    #define TRUE 1
    #define FALSE 0
    
    float y = 0.0;
    float x = 0.0;
    Uint8 *keys;
    
    void Render()
        {    
    
            keys = SDL_GetKeyState(NULL);
           if (keys[SDLK_UP]) {
    
                   y = y + 0.001;
    
           }
           if (keys[SDLK_DOWN]) {
    
                   y = y - 0.001;
    
           }
           if (keys[SDLK_RIGHT]) {
    
                   x = x + 0.001;
    
           }
           if (keys[SDLK_LEFT]) {
    
                   x = x - 0.001;
    
           }
    
             glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
             glMatrixMode(GL_MODELVIEW);  
             //glTranslatef(-1.5,0.0,0.0);        
             //glTranslatef(0.0, 0.0,-6.0);
             glLoadIdentity();      							                             
             glBegin(GL_TRIANGLES);
             glVertex3f(x-0.3,y-0.3, 0.0);  
             glVertex3f(x+0.3,y-0.3, 0.0);
             glVertex3f( x, y+0.3, 0.0);
             glEnd;
             SDL_GL_SwapBuffers();  
        }
    
    void Init_OpenGL()     
        {
    
              SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 10);    
    
              glClearColor(0.0f, 0.0f, 0.0f, 0.0f);           
    
              glLoadIdentity();
    
              gluPerspective(0.50f,800/600,0.1f,100.0f);
    
              glShadeModel(GL_SMOOTH);                        
        }
    
    int main(int argc, char *argv[])
        {
             SDL_Event ev;
             int done = FALSE;
    
             SDL_SetVideoMode(800, 600, 32, SDL_OPENGL);
    
             Init_OpenGL();
    
             while(!done)
             {
                  SDL_PollEvent(&ev);
    
                  if(ev.type == SDL_QUIT || ev.key.keysym.sym == SDLK_ESCAPE)
                       done = TRUE;
    
                  Render();
             }
    
             SDL_Quit();
             return 0;
        }
    


  • Hat keiner eine Antwort? 😞



  • Will mir denn wirklich keiner sagen wie man den Bildschirm aktualisiert? 😕



  • Woher weißt du, dass der Bildschirm nicht aktualisiert wird?



  • glBegin(GL_TRIANGLES);
      glVertex3f(x-0.3,y-0.3, 0.0);  
      glVertex3f(x+0.3,y-0.3, 0.0);
      glVertex3f( x, y+0.3, 0.0);
    glEnd;
    

    Wie willst du so eigentlich das Dreieck ueberhaupt sehen? Da z = 0, liegt es ja direkt vor der Kamera, da du aber bei

    gluPerspective(0.50f,800/600,0.1f,100.0f);
    

    zNear auf 0.1 setzt, wirst du niz sehen koennen, was naeher als 0,1 Einheiten vor der Kamera liegt. (also entweder die z-Koordinate anpassen oder vorher ein entsprechendes Translate durchfuehren)



  • Ja ich seh ein weißes Dreieck, habs auf z = -1 geändert, funktioniert auch wenn ich das auf z.B. z=-60 setze, also besser als vorher.
    Woher ich weiß das der Bildschirm nicht aktualisiert wird?
    Wie ich weiter schon geschrieben habe, habe ich ein Skript geschrieben mit dem man das Dreieck mit den Pfeiltasten hoch und runter bzw. hin und her bewegen kann. Es zieht dabei einen weißen streifen hinter sich her, ergo: Der Bildschirm wird nicht aktualisiert.



  • Du setzt mit glClearColor nur die Farbe, die man erhält wenn der Bildschirm gelöscht wird. Um den Farbpuffer selbst zu löscht muss man glClear(GL_COLOR_BUFFER_BIT) aufrufen.



  • Macht er auch, Zeile 39.

    Was mich aber irritiert:

    Isodrink schrieb:

    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 10);
    

    Als Wert wirklich 10? Nicht nur 1 (an) oder 0 (aus)?



  • Das muss

    glEnd();
    

    heißen, nicht einfach nur

    glEnd;
    

    So ruft er doch gar keine Funktion auf.



  • 10? hmmm 😕
    Naja ich hab jetzt alles berichtigt und jetzt funktioniert es, danke! 🙂



  • TdZ schrieb:

    glEnd;
    

    So ruft er doch gar keine Funktion auf.

    Stimmt. Sowas übersieht man ganz schnell.

    @Isodrink:
    Na Glückwunsch.


Anmelden zum Antworten