fps mit glutWarpPoiner???

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: fps mit glutWarpPoiner???

Beitrag von Xin » Do Jul 22, 2010 9:50 pm

Hallo Papa ;-)

Ich kapiere die Darstellung irgendwie nie, deswegen war ich mal so frei und habe einen Würfel dazugepackt, damit ich mich etwas orientieren kann. An der Linie kann ich mich nicht orientieren.
Ich habe die Tastatur etwas erweitert, weil die Maussteuerung mit etwas suspekt ist: q, e und 2 und x.

Ich verstehe das Kreuz als Zielkreuz? Dann muss es immer an der gleichen Stelle gezeichnet werden, nämlich einfach vor die Kamera.

Wenn Du etwas zeichnest, sagst Du, wo Du das jeweilge Teil vor die Kamera stellst - die Kamera selbst bewegt sich nie. Ich zeichne also erst den Kubus irgendwo in den Raum, lade dann die Identitätsmatrix und werfe das Kreuz damit vor die bisherige Sicht.

Code: Alles auswählen

#include <iostream>
#include <stdlib.h> 


#ifdef __APPLE__
#include <OpenGL/OpenGL.h>
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif


float RotAtX = 0.0f;
float RotAtY = 0.0f;
float lx = 0.0f;
float ly = 0.0f;
float lz = 0.0f;
float mx;
float my;
float oldx;
float oldy;
float GW;
float GH;
GLenum inf;


void WarpPointer(int val){

   glutWarpPointer((GW / 2), (GH / 2)); //warp to screen middle

}



void HandleMouseMotion(int x, int y){ //handles the movement of the mouse

   mx = x;
   my = y;

   if(mx != (GW / 2) && my != (GH / 2)){

      if(mx < (GW / 2)){

         if(mx < oldx){

            RotAtY -= ((oldx - mx)*0.25);

            glutPostRedisplay();

         }
         if(mx > oldx){
            
            RotAtY -= ((mx - oldx)*0.25);

            glutPostRedisplay();

         }

      }
      else if(mx > (GW / 2)){       

         if(mx < oldx){

            RotAtY += ((oldx - mx)*0.25);

            glutPostRedisplay();

         }
         if(mx > oldx){
            
            RotAtY += ((mx - oldx)*0.25);

            glutPostRedisplay();

         }
      }
      if(my < (GH / 2)){

         if(my < oldy){

            RotAtX += ((oldy - my)*0.25);

            glutPostRedisplay();

         }
         if(my > oldy){
            
            RotAtX += ((my - oldy)*0.25);

            glutPostRedisplay();

         }
      }
      else if(my > (GH / 2)){

         if(my < oldy){

            RotAtX -= ((oldy - my)*0.25);

            glutPostRedisplay();

         }
         if(my > oldy){
            
            RotAtX -= ((my - oldy)*0.25);

            glutPostRedisplay();

         }
      }
   }
   oldx = mx;
   oldy = my;
   glutTimerFunc(1000, WarpPointer, 0); //warp every 10 sec
   glutPostRedisplay(); //tells that window needs to be redisplayed
}



void Init(){ //Enables and sets funcs

   glEnable(GL_DEPTH_TEST);
   glEnable(GL_COLOR_MATERIAL);
   glutSetCursor(GLUT_CURSOR_NONE); //no Cursor

}



void resize(int w, int h){ //set the scene if resized

   glViewport(0, 0, w, h);
   GH = h;
   GW = w;

   glMatrixMode(GL_PROJECTION);

   glLoadIdentity();
   gluPerspective(45.0, (double)w / (double)h, 0.1, 200.0);
}


void handle_keyboard(unsigned char key, int x, int y){ //handle keyboard
   if(key == 27){
      exit(0);
   }
   else if(key == 'w'){
      lz=lz+0.5f;
   }
   else if(key == 's'){
      lz=lz-0.5f;
   }
   else if(key == 'a'){
      lx=lx+0.5f;
   }
   else if(key == 'd'){
      lx=lx-0.5f;
   }
   else if(key == ' '){
      ly=ly-0.5f;
   }
   else if(key == 'c'){
      ly=ly+0.5f;
   }
   else if(key == 'q'){
      RotAtY+=0.5f;
   }
   else if(key == 'e'){
      RotAtY-=0.5f;
   }
   else if(key == '2'){
      RotAtX+=0.5f;
   }
   else if(key == 'x'){
      RotAtX-=0.5f;
   }
   
   glutPostRedisplay(); //window need to be redisplayed
}


void drawCube()
{
  glBegin( GL_QUAD_STRIP );
    glVertex3f( -0.5,  0.5,  0.5 );
    glVertex3f( -0.5, -0.5,  0.5 );

    glVertex3f(  0.5,  0.5,  0.5 );
    glVertex3f(  0.5, -0.5,  0.5 );

    glVertex3f(  0.5,  0.5, -0.5 );
    glVertex3f(  0.5, -0.5, -0.5 );
    
    glVertex3f( -0.5,  0.5, -0.5 );
    glVertex3f( -0.5, -0.5, -0.5 );

    glVertex3f( -0.5,  0.5,  0.5 );
    glVertex3f( -0.5, -0.5,  0.5 );
  glEnd();
  
  glBegin( GL_QUADS );
    glVertex3f( -0.5, 0.5, -0.5 );
    glVertex3f( 0.5, 0.5, -0.5 );
    glVertex3f( 0.5, 0.5, 0.5 );
    glVertex3f( -0.5, 0.5, 0.5 );
    
    glVertex3f( -0.5, -0.5, -0.5 );
    glVertex3f( -0.5, -0.5, 0.5 );
    glVertex3f( 0.5, -0.5, 0.5 );
    glVertex3f( 0.5, -0.5, -0.5 );
  glEnd();
}


void DrawScene(){ //draw the scene

   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   glMatrixMode(GL_MODELVIEW);
   glPushMatrix();

   glLoadIdentity();
   glRotatef(RotAtY, 0.0f, 1.0f, 0.0f);
   glRotatef(RotAtX, 1.0f, 0.0f, 0.0f);
   
   glTranslatef(lx, ly, lz -16 );

   drawCube();

   glLoadIdentity();
   glBegin(GL_LINES);

   glColor3f(1.0f, 0.0f, 0.0f);
   glVertex3f(-10.0f, 0.0f, -6.0f);
   glVertex3f(10.f, 0.0f, -6.0f);

   glColor3f(0.0f, 1.0f, 0.0f);
   glVertex3f(0.0f, -10.0f, -6.0f);
   glVertex3f(0.0f, 10.0f, -6.0f);

   glColor3f(1.0f, 0.0f, 1.0f);
   glVertex3f(0.0f, 0.0f, -16.0f);
   glVertex3f(0.0f, 0.0f, 4.0f);

   glEnd();

   glPopMatrix();

   glutSwapBuffers();
}



int main(int argc, char** argv){

   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

   glutGameModeString("1280x800:32@100"); //fullscreen options

   if(glutGameModeGet(inf) != 0){ 

      exit(1);

   }

   glutEnterGameMode(); //enter fullscreen

   Init(); //enable modes

   glutDisplayFunc(DrawScene);
   glutKeyboardFunc(handle_keyboard);
    glutReshapeFunc(resize);
   glutPassiveMotionFunc(HandleMouseMotion); 
   

   glutMainLoop();
}
Als Tipp vielleicht noch, dass wenn Du Dich um 90 Grad nach links drehst, dann gehst Du entlang der X-Achse, wenn Du 'W' drückst. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

paparoach777
Beiträge: 52
Registriert: Mi Mai 12, 2010 3:48 pm

Re: fps mit glutWarpPoiner???

Beitrag von paparoach777 » Fr Jul 23, 2010 6:53 pm

Ne ich habe mir eigentlich vorgestellt dass das koordinatenkreuz fest in der scene verankert ist und sich die kamera halt nur sich drumrumbewegt.

also so ähnlich wie eine wand bei normalen first person shootern
return EXIT_FAILURE;

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: fps mit glutWarpPoiner???

Beitrag von Xin » Fr Jul 23, 2010 8:08 pm

paparoach777 hat geschrieben:Ne ich habe mir eigentlich vorgestellt dass das koordinatenkreuz fest in der scene verankert ist und sich die kamera halt nur sich drumrumbewegt.

also so ähnlich wie eine wand bei normalen first person shootern
Dann musst Du das Kreuz einfach nach da verschieben, wo jetzt der Kubus gezeichnet wird.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

paparoach777
Beiträge: 52
Registriert: Mi Mai 12, 2010 3:48 pm

Re: fps mit glutWarpPoiner???

Beitrag von paparoach777 » Fr Jul 23, 2010 8:14 pm

Hatte ich das nicht gemacht???
return EXIT_FAILURE;

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: fps mit glutWarpPoiner???

Beitrag von Xin » Fr Jul 23, 2010 8:21 pm

Ich habe das Kreuz als Fadenkreuz interpretiert und um mich zu orientieren halt den Kubus genommen. Du kannst den Würfel ja auch zur Wand umformen, dann erkennt man das auch als Wand ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

paparoach777
Beiträge: 52
Registriert: Mi Mai 12, 2010 3:48 pm

Re: fps mit glutWarpPoiner???

Beitrag von paparoach777 » Fr Jul 23, 2010 8:30 pm

naja das objekt dass gezeichnet wird ist mir eigentlich montentan erst einmal egal, mir geht es eher um die steuerung...

wobei wir wieder bei dem 'w' problem wären. Wenn man den code (den vorletzten glaub ich, zumindest den letzten den ich gepostet hab) compiliert und ausführt, dann kann man mit 'w' egal in welche richtung man gerade schaut, sich immer nur in die gleiche richtung sich bewegen...

Was meiner meinung nach nicht wirklich normal ist :lol:
return EXIT_FAILURE;

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: fps mit glutWarpPoiner???

Beitrag von Xin » Fr Jul 23, 2010 8:57 pm

paparoach777 hat geschrieben:naja das objekt dass gezeichnet wird ist mir eigentlich montentan erst einmal egal, mir geht es eher um die steuerung...

wobei wir wieder bei dem 'w' problem wären. Wenn man den code (den vorletzten glaub ich, zumindest den letzten den ich gepostet hab) compiliert und ausführt, dann kann man mit 'w' egal in welche richtung man gerade schaut, sich immer nur in die gleiche richtung sich bewegen...

Was meiner meinung nach nicht wirklich normal ist :lol:
Wenn Du startest guckst Du von +Z nach -Z.
Wenn Du Dich um 90 Grad nach links drehst, dann geht 'w' immernoch in Richtung negative Z-Achse.
Du guckst aber von +X nach -X.... Du musst also beim drehen überlegen, um wieviel Grad Du dich gedreht hast. Mit cos und sin muss Du dann Deine X und Z-Position entsprechend ihres Anteils korrigieren.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

paparoach777
Beiträge: 52
Registriert: Mi Mai 12, 2010 3:48 pm

Re: fps mit glutWarpPoiner???

Beitrag von paparoach777 » Sa Jul 24, 2010 12:36 pm

was ist cos und sin????

und wie berechnet man das mit der drehung?
return EXIT_FAILURE;

hofian
Beiträge: 62
Registriert: Do Sep 24, 2009 6:59 pm

Re: fps mit glutWarpPoiner???

Beitrag von hofian » Sa Jul 24, 2010 1:16 pm

was ist cos und sin????
Puuhhh, jetzt greife ich knapp 2 Jahre im Lehrplan voraus, aber irgendwie meine ich es verstanden zu haben:

cos
Abkürzung für cosine, englisch für Kosinus.
sin
Abkürzung für sine, englisch für Sinus.

Beide gehören zu den trigonometrischen Funktionen, also zu den Winkelfunktionen.
Beide arbeiten am Einheitskreis (hui, der Wiki-Artikel ist noch etwas dürftig ;) ), demzufolge solltest du dich auch mit Bogenmaß und Gradmaß, bzw. um dein Vorhaben umzusetzen, musst du es tun.
und wie berechnet man das mit der drehung?
Mögliche Umsetzung (in einer Ebene, in OpenGL: es gibt nur x und z):
Angenommen, du hast eine Figur, die sich am Punkt (0|0) befindet. Sie blickt nach vorne, also nach -z (in den Bildschirm hinein). Ihre Drehung ist demzufolge 0°. Nun rechnest du das Gradmaß (und 0° ist Gradmaß) in Bogenmaß um:

Code: Alles auswählen

bogenmass = ( gradmass/180 ) * PI
Das Ergebnis ist 0. :D
Nun berechnest du Sinus und Kosinus aus dem Bogenmaß. Hierfür gibt es den Header <math.h>.

Code: Alles auswählen

verschiebung_nach_minus_z = cos( bogenmass );
verschiebung_nach_minus_x = sin( bogenmass );
So, eigentlich ist das ganze doch ein bisschen verwirrend geworden, aber mit etwas Geduld habe ich in einem meiner Projekte auch schon hinbekommen, das Wissen habe ich allerdings komplett selbst angeeignet. Mögliche Fehler kann ich nicht ausschließen, Code Beispiele sind nicht mehr als "Pseudo Code". :)

paparoach777
Beiträge: 52
Registriert: Mi Mai 12, 2010 3:48 pm

Re: fps mit glutWarpPoiner???

Beitrag von paparoach777 » Sa Jul 24, 2010 3:30 pm

danke für die Antwort

Ich musste mir das aber dreimal durchlesen bis ich es kappiert habe :lol:
return EXIT_FAILURE;

Antworten