Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 13:25

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Animation einer Kugel
BeitragVerfasst: Do Dez 27, 2012 16:35 
Offline
DGL Member

Registriert: Do Dez 27, 2012 15:29
Beiträge: 12
Wohnort: Berlin
Programmiersprache: c++
Hallo Leute, ich bin neu hier und möchte gleich mal starten mit meinen ersten Fragen.
Kurz zu mir, ich hab vor ein paar Tagen angefangen mich mit openGL zu beschäftigen, weil ich eigentlich schon immer davon träume mal ein Spielchen zu programmieren. Ich nutze OpenGL in Verbindung mit c++ auf LINUX.
Berfuflich habe ich täglich mit PHP und JavaScript zu tun, mit c++ bin ich allerdings noch relativ frisch. Aber das wird schon.
Ok, nun zum Problem.
Ich hab mir vorgenommen zu Anfang einen Breakout-Klon zu programmieren.
Dabei will ich das ganze in mehrere kleine Abschnitte einteilen um öfter mal ein Erfolgserlebniss zu haben.
Das ganze soll auch erstmal in 2D umgesetzt werden.

Ich bin jetzt soweit das ich ein Panel, mit dem man den ball fängt, gerendert habe, und eine "Kugel" habe ich auch schon gerendert.
Kugel in anführungszeichen weil es eigentlich nur viele Punkte sind die ich mit GL_LINE_LOOP verbunden habe (bessere möglichkeiten höre ich gern!)

Das Panel lässt sich auch schon mit den Tasten "a" und "d" nach rechts und links bewegen.
Nun komm ich an den Punkt wo es glaub ich echt schwierig wird für mich als Anfänger.
Die Kugel soll sich natürlich über den Bildschirm bewegen. Daran scheitere ich jetzt allerdings.
Könnt ihr mir da eventuell den ein oder anderen Tipp geben wie das zu realisieren wäre?

Gruß Maik


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Animation einer Kugel
BeitragVerfasst: Do Dez 27, 2012 17:01 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Moin, Die Kugel (bzw. der Kreis da es ja 2D ist ;-)) wird in deinem Falle nicht animiert, sonder bewegt.
Da du eine Bewegung (die des Panels) ja scheinbar schon realisiert hast, sollte das doch mit der Kugel nicht wirklich anders sein.
Natürlich brauchst du sowas wie Physik, da die "Kugel" ja bei Kollision abgelenkt wird und sich in eine andere Richtung weiterbewegt. (im Optimalfall Einfallswinkel = Ausfallswinkel)
Wie hast du denn die Bewegung des Panels bewerkstelligt?

Grüße!

PS: stell dich doch kurz im Member-Forum vor :)

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Animation einer Kugel
BeitragVerfasst: Do Dez 27, 2012 18:05 
Offline
DGL Member

Registriert: Do Dez 27, 2012 15:29
Beiträge: 12
Wohnort: Berlin
Programmiersprache: c++
moin, danke für die Antwort.

Ok, dann ist das eine Bewegung, ich lass mich ja gern Belehren :D....

Für die Bewegung des Panels fange ich den Tastendruck ab und ändere dann dementsprechend die Position mi glTranslatef(i,0,0);
Hier mal ein bissl code
Code:
  1. case SDL_KEYDOWN:   //und SDL_KEYDOWN werden gleich behandelt
  2.                
  3.                 if( event.key.keysym.sym == SDLK_a){
  4.                     if(i==-4){
  5.                         i=i;
  6.                     } else {
  7.                         --i;
  8.                     }
  9.                 }
  10.                 if( event.key.keysym.sym == SDLK_d){
  11.                     if(i==4){
  12.                         i=i;
  13.                     } else {
  14.                         ++i;
  15.                     }
  16.                 }
  17.                 break;


Kann natürlich sein das das sehr schlechter code ist... Wie gesagt, absoluter newbie auf dem gebiet.

Für die Bewegung des kreises (was eigenltich ja ne kugel sein soll, aber ich ja 2D :D ) brauch ich ja nun kein event abwarten. Die Kugel soll sich ja immer bewegen.
Für den Anfang reicht es auch wenn die sich erstmal nur von rechts nach links bewegt. Den Rest schaff ich dann schon irgendwie, glaub ich.
rufe halt in der Endlosschleife die die objekte rendert für das panel die gltranslatef auf. Allerdings schaff ichs irgendwie nicht eine translation einzubauen die nur auf die kugel zugreift. Das ist mir irgendwie noch ein Rätsel.
p.s. Stelle mich noch im Forum vor :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Animation einer Kugel
BeitragVerfasst: Do Dez 27, 2012 18:39 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Also an sich musst du nichts anderes auch mit der Kugel machen.
Du musst natürlich die Matrizen für die übrigen (sich nicht bewegenden Objekte sichern. (falls du daran noch nicht gedacht hast)
Stichworte: push- und popMatrix
Zusätzlich musst du halt berechnen, wie sich die Kugel bewegt. Das lässt sich häufig gut durch einen Vektor lösen.
Dieso Berechnungen können natürlich recht komplexe Ausmaße annehmen, je nachdem ob man z.B. Beschleunigung, elastische stöße usw. einbeziehen will.
Zu Anfang sollte es reichen eine konstante Geschwindigkeit anzunehmen.

Grüße

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Animation einer Kugel
BeitragVerfasst: Do Dez 27, 2012 18:57 
Offline
DGL Member

Registriert: Do Dez 27, 2012 15:29
Beiträge: 12
Wohnort: Berlin
Programmiersprache: c++
Hm, schein wohl aufwändiger zu werden als gedacht.
Matrizen sichern, popMatrix und push sagen mir noch gar nichts.
oOo


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Animation einer Kugel
BeitragVerfasst: Do Dez 27, 2012 19:35 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Das ist nicht weiter schwer...
Poste mal deine Renderschleife dann kann man es leicht erklären

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Animation einer Kugel
BeitragVerfasst: Do Dez 27, 2012 19:38 
Offline
DGL Member

Registriert: Do Dez 27, 2012 15:29
Beiträge: 12
Wohnort: Berlin
Programmiersprache: c++
Code:
  1. glMatrixMode( GL_PROJECTION);   //Matrixstack wählen
  2.         glLoadIdentity();               //Matrix zurück setzen
  3.  
  4.         //Eine orthogonale Projektionsmatrix zum Stack dazu multiplizieren
  5.         glOrtho(-5.3, 5.3, -4, 4, 0.5, 1.5);    //Dieses mal Sichtbereich auf
  6.                                             //-2 bis 2 x-Richtung
  7.                                             //-1.5 bis 1.5 in y-Richtung und
  8.                                             //-1 bis 1 in z-Richtung begrenzt
  9.  
  10.         //Farbe zum löschen setzen (Auch außerhalb der Endlosschleife)
  11.         glClearColor(1.0, 1.0, 1.0,1.0);
  12.         //glEnable(GL_DEPTH_TEST); //Tiefentest mit z-buffer aktivieren
  13.         //glRotatef(30,1,1,0);
  14.         while(true){
  15.             //--------------------------
  16.             //Nachrichten verarbeiten
  17.             //--------------------------
  18.  
  19.             if(!pollEvents()){
  20.                 break;
  21.             }
  22.             glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  //Aktuellen Bildpuffer löschen
  23.             glMatrixMode(GL_MODELVIEW);
  24.                 glLoadIdentity();
  25.             //--------------------------
  26.             //Kugel zeichnen
  27.             //--------------------------
  28.  
  29.             DrawCircle();  
  30.                    
  31.             //------------------------
  32.             //Einen Quader zeichnen
  33.             //------------------------             
  34.             glTranslatef( i, 0, 0);
  35.                 glBegin(GL_QUADS); 
  36.                     glColor3f(0.3,0.3,0.3);
  37.                     glVertex3f(1.5, -3, -1);
  38.                     glVertex3f(-1.5, -3, -1);
  39.                     glVertex3f(-1.5,-3.2,-1);
  40.                     glVertex3f(1.5, -3.2, -1);
  41.                 glEnd();
  42.             SDL_GL_SwapBuffers();   //Bildpuffer vertauschen
  43.                                 //Wichtig ist, dass wir die Puffer erst nach
  44.                                 //der letzen Zeichenoperation tauschen
  45.  
  46.         }


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Animation einer Kugel
BeitragVerfasst: Do Dez 27, 2012 19:49 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
dann noch mal drawCircle() bitte :)

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Animation einer Kugel
BeitragVerfasst: Do Dez 27, 2012 19:57 
Offline
DGL Member

Registriert: Do Dez 27, 2012 15:29
Beiträge: 12
Wohnort: Berlin
Programmiersprache: c++
hm, ok... das ist halt auch noch nicht richtig, sollte ja eigentlich ne ganze Fläche sein, ist aber erstmal nur ein kreis.
Code:
  1. void DrawCircle(){
  2.     glBegin(GL_LINE_LOOP);
  3.  
  4.         glColor3f(1,0,0);
  5.         float winkel = 2*PI/32;
  6.         for(int f = 0; f < 32; f++){
  7.             float x = cos(f*winkel)*0.3;
  8.             float y = sin(f*winkel)*0.3;
  9.             glVertex3f(x, y, -1);
  10.         }
  11.     glEnd();
  12. }


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Animation einer Kugel
BeitragVerfasst: Do Dez 27, 2012 20:11 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Also:

Du berechnest mit deiner Formel ja Punkte auf einer Kreisbahn um ein Zentrum P(0,0)
Willst du den Kreis jetzt Positionieren, so kannst du die ModelviewMatrix beeinflussen.
Bevor du OpenGL die Vertex-Daten übergibst sicherst du die aktuelle Matrix mit glPushMatrix und verschiebst deinen Koordinatenursprung mit glTranslate an die entsprechende stelle. Danach zeichnest du den Kreis und stellst die Matrix mit glPopMatrix wieder her.
Code:
  1. glPushMatrix();
  2. glTranslate(...);
  3. drawCircle();
  4. glPopMatrix()
Die Bezeichnungen Push und Pop deuten es bereits an, die Matrizen sind in einem Stack organisiert.

Genauer kannst du das alles hier nachlesen: http://wiki.delphigl.com/index.php/Tutorial_Matrix2

Einen "gefüllten" Kreis kannst du auch mit z.B. Triangles oder TriangleFan zeichnen.

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Animation einer Kugel
BeitragVerfasst: Do Dez 27, 2012 20:17 
Offline
DGL Member

Registriert: Do Dez 27, 2012 15:29
Beiträge: 12
Wohnort: Berlin
Programmiersprache: c++
hm, ok.... ganz ehrlich versteh ich da gerade busbahnhof. Da muss ich wohl noch üben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Animation einer Kugel
BeitragVerfasst: Do Dez 27, 2012 20:24 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Dein Spiel scheint ja momentan ein statisches Modell zu sein.
Versuche einfach mal die Kugel mit den 3 Befehlen die ich dir eben genannt habe an eine andere Stelle zu verschieben.

Stellt OpenGL denn bisher alles dar wie es soll?

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Animation einer Kugel
BeitragVerfasst: Do Dez 27, 2012 20:30 
Offline
DGL Member

Registriert: Do Dez 27, 2012 15:29
Beiträge: 12
Wohnort: Berlin
Programmiersprache: c++
ja, bis jetzt hab ich im unteren bereich das panel und den kreis mittig darüber. Ich hatte es auch schon das ich die kugel verschieben kann, aber da hat sich das panel immer mit bewegt. Hier mal ein screen dazu.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Animation einer Kugel
BeitragVerfasst: Do Dez 27, 2012 20:40 
Offline
DGL Member

Registriert: Do Dez 27, 2012 15:29
Beiträge: 12
Wohnort: Berlin
Programmiersprache: c++
Ok, jetzt wird es klarer... Jetzt sieht das ganze so aus:
Code:
  1. //--------------------------
  2.             //Kugel zeichnen
  3.             //--------------------------
  4.             DrawCircle();
  5.             glPushMatrix();
  6.                 glTranslatef(1,1,0);
  7.                 DrawCircle();
  8.             glPopMatrix();
  9.             glPushMatrix();
  10.                 glTranslatef(2,2,0);
  11.                 DrawCircle();
  12.             glPopMatrix();
  13.  

und anbei nochmal ein screen.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Animation einer Kugel
BeitragVerfasst: Do Dez 27, 2012 20:58 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Jo, das ist der erste Schritt dahin.
Schaut doch schon mal gut aus.

Jetzt musst du halt dafür sorgen, dass der Kreis sich bewegt statt blöd an einer stelle zu hängen.
Wie gesagt, du wirst Kollisionsberechnungen brauchen damit dein Ball auch an Kanten anstößt und dessen Richtung beeinflusst wird.
Vorerst musst du aber dafür sorgen, dass sich der Ball bewegt.
Dazu würde ich eine Klasse Ball o.Ä. schreiben, die eine Position enthält und einen Vektor der dessen Bewegung darstellt.
Bei jedem frame musst du also die Position berechnen, und die aktuelle Position durch glTranslate übergeben. An der Stelle kannst du dann den Ball zeichnen.

Da habe ich allerdings auch wenig Erfahrung mit.

Grüße

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 19 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]