Problem mit OpenGL und SDL

FaNo86

Mitglied
Hi,

ich habe folgendes Problem und zwar kann ich die Z-Achse nicht verändern ich verstehe es nicht wieso das so ist.
Hier mal der Code
Code:
#include <SDL/SDL.h>
#include <gl/gl.h>

int main(int argc, char *argv[])
{
  SDL_Event event;
  Uint8 *key;
  int done=0;
  float cameraX=0.0f,cameraY=0.0f,cameraZ=0.0f;
  
  //Initialisierungen
  SDL_SetVideoMode(1024, 800, 32, SDL_OPENGL | SDL_HWSURFACE | SDL_NOFRAME);

  glViewport(0, 0, 1024, 800);
  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  glClearDepth(1.0);
  glDepthFunc(GL_LESS);
  glEnable(GL_DEPTH_TEST);
  glShadeModel(GL_SMOOTH);
  glMatrixMode(GL_PROJECTION);
  glMatrixMode(GL_MODELVIEW);

  //Wiederholen bis ESC gedrückt wird
  for(done = 0; !done;)
  {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();
    glTranslatef(cameraX,cameraY,cameraZ);
    
    
    glBegin(GL_TRIANGLES);
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex3f(0.0f, 1.0f,0.0f);
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex3f(-1.0f, -1.0f,0.0f);
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex3f(1.0f, -1.0f,0.0f);
    glEnd();

  
    SDL_GL_SwapBuffers();

    //Tastaturabfrage
    SDL_PollEvent(&event);
    key = SDL_GetKeyState(NULL);    //aktuellen zustand des keyboards in keys kopieren
 
      if(key[SDLK_ESCAPE])
      {
                           done=1;
      }
      if(key[SDLK_UP])
      {
                      cameraY+=0.01f;
      }
      if(key[SDLK_DOWN])
      {
                        cameraY-=0.01f;
      }
      if(key[SDLK_LEFT])
      {
                        cameraX-=0.01f;
      }
      if(key[SDLK_RIGHT])
      {
                         cameraX+=0.01f;
      }
  }
  SDL_Quit();
  return(0);
}

Wenn ich jetzt z.B bei CameraZ den wert -3.0f eingebe dann ist das Dreieck einfach verschwunden wenn ich -1.0f eingebe bleibt es in der gleichen Göße, also die KameraPos. verändert sich nicht. Wenn ich beim 3Eck die Z_pos. verändern will ist es genau das selbe.
ich hoffe ihr könnt mir helfen.
mfg Fabi
 
Zuletzt bearbeitet:
Hi.

Der Sichtkörper ist standardmäßig ein Quader der Größe (x=[-1|1], y=[-1|1] und z=[0|1])

D.h. dein Dreieck wird nicht angezeigt, da es nicht im sichtbaren Bereich liegt.

Schau dir mal die Funktionen glOrtho und glFrustum bzw. gluPerspective an.

Gruß
 
schon mal danke für deine Antwort jetzt habe ich das mit dem gluPerspective eingefügt aber es kommt jetzt n Fehler und zwar: [Linker error] undefined reference to `gluPerspective@32'

hier der aktuelle Code:
Code:
#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>

int main(int argc, char *argv[])
{
  SDL_Event event;
  Uint8 *key;
  int done=0;
  int width=1024,height=800;
  float cameraX=0.0f,cameraY=0.0f,cameraZ=-1.0f;
  

  SDL_SetVideoMode(1024, 800, 32, SDL_OPENGL | SDL_HWSURFACE | SDL_NOFRAME);


        glViewport(0,0,width, height);        
        glEnable(GL_TEXTURE_2D); //enable texture mapping
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //Black Background
        glClearDepth(1.0); //enables clearing of deapth buffer
        glDepthFunc(GL_LEQUAL); //type of depth test
        glEnable(GL_DEPTH_TEST); //enables depth testing
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);      // Enable Alpha Blending (disable alpha testing)
        glEnable(GL_BLEND);                                     // Enable Blending       (disable alpha testing)
        glShadeModel(GL_SMOOTH); //enables smooth color shading
        
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity(); //Reset projection matrix
        
        gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 1.0f, 100.0f); //calculate aspect ratio of the window
        glMatrixMode(GL_MODELVIEW);

    
  for(done = 0; !done;)
  {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();
    glTranslatef(cameraX,cameraY,cameraZ);
    
    
    glBegin(GL_TRIANGLES);
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex3f(0.0f, 1.0f,0.0f);
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex3f(-1.0f, -1.0f,0.0f);
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex3f(1.0f, -1.0f,0.0f);
    glEnd();

  
    SDL_GL_SwapBuffers();
    SDL_PollEvent(&event);
    key = SDL_GetKeyState(NULL);    //aktuellen zustand des keyboards in keys kopieren
 
      if(key[SDLK_ESCAPE])
      {
                           done=1;
      }
      if(key[SDLK_UP])
      {
                      cameraY+=0.01f;
      }
      if(key[SDLK_DOWN])
      {
                        cameraY-=0.01f;
      }
      if(key[SDLK_LEFT])
      {
                        cameraX-=0.01f;
      }
      if(key[SDLK_RIGHT])
      {
                         cameraX+=0.01f;
      }
    
  }
  SDL_Quit();
  return(0);
}
 
Für die Funktion gluPerspective brauchst du die GL Util Bibliothek. Da diese Funktion allerdings auch nur die Funktion glFrustum aufruft, kannst du stattdessen diese verwenden.

Gruß
 
Es geht jetzt zwar wieder aber auf der z-Achse geht es wieder nicht

hier der Aktuelle code:
Code:
#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>

int main(int argc, char *argv[])
{
  SDL_Event event;
  Uint8 *key;
  int done=0;
  int fensterBreite=1024,fensterHoehe=800;
  float cameraX=0.0f,cameraY=0.0f,cameraZ=0.0f;
  float zNear=0.0;
  float zFar=100.0;
  float oben=100,unten=-100;  


  SDL_SetVideoMode(1024, 800, 32, SDL_OPENGL | SDL_HWSURFACE | SDL_NOFRAME);


     
        glEnable(GL_TEXTURE_2D); //enable texture mapping
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //Black Background
        glClearDepth(1.0); //enables clearing of deapth buffer
        glDepthFunc(GL_LEQUAL); //type of depth test
        glEnable(GL_DEPTH_TEST); //enables depth testing
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);      // Enable Alpha Blending (disable alpha testing)
        glEnable(GL_BLEND);                                     // Enable Blending       (disable alpha testing)
        glShadeModel(GL_SMOOTH); //enables smooth color shading
        
        
        float cx     = 0; /* hier gewünschten Mittelpunkt der Szene in X festlegen */
                      /* cx bezieht sich auf die vordere Clippingflaeche zNear */
        float halbB  = fensterBreite*0.5;
        float aspect = (float)fensterBreite/(float)fensterHoehe;

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glFrustum(cx-halbB*aspect, cx+halbB*aspect, unten, oben, zNear, zFar);
       
        glMatrixMode(GL_MODELVIEW);

    
  for(done = 0; !done;)
  {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();
    glTranslatef(cameraX,cameraY,cameraZ);
    
    
    glBegin(GL_TRIANGLES);
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex3f(0.0f, 1.0f,0.0f);
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex3f(-1.0f, -1.0f,0.0f);
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex3f(1.0f, -1.0f,0.0f);
    glEnd();

  
    SDL_GL_SwapBuffers();
    SDL_PollEvent(&event);
    key = SDL_GetKeyState(NULL);    //aktuellen zustand des keyboards in keys kopieren
 
      if(key[SDLK_ESCAPE])
      {
                           done=1;
      }
      if(key[SDLK_UP])
      {
                      cameraY+=0.01f;
      }
      if(key[SDLK_DOWN])
      {
                        cameraY-=0.01f;
      }
      if(key[SDLK_LEFT])
      {
                        cameraX-=0.01f;
      }
      if(key[SDLK_RIGHT])
      {
                         cameraX+=0.01f;
      }
    
  }
  SDL_Quit();
  return(0);
}


habe ich da irgend etwas falsch gemacht?

PS:Ich sehe das Dreieck schon aber wenn ich z.B die xachse immer um -0.1f bei jedem enter klick abziehe dann verschwindet es nach dem 20sten mal ENTER auf einen Schlag also bei -2.0f
normalerweise sollte es ja bei jedem enter drücken ein stück in den bildschirm fahren
 
Zuletzt bearbeitet:
Zurück