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

Aktuelle Zeit: Do Jul 17, 2025 01:14

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Aug 09, 2009 21:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Moin,

ich suche schon lange nach einer Lösung für ein Problem. Vorhin hat i0n0s probiert zu helfen, aber er fand auch keine Lösung. Nun habe ich noch einige Stunden vergeudet und frage einfach mal Euch.
Beim Spiel BlackJack teilt die Bank, welche sich im Fenster oben in der Mitte befindet, Karten an alle Mitspieler aus. Die Mitspieler sitzen im Halbkreis drumherum. Jeder hat eine sogenannte Box, diese Boxen stehen alle in einem 13,3°-Winkel zueinander. Nun sollen die Karten rüberrutschen in die Boxen von der Bank aus, es muss animiert werden. Die Animation klappt gut, aber bei der Rotation haperts extrem. Mein Ziel ist es, die Karten zu drehen und dann über den Y-Wert die Karte auf das Ziel zuzubewegen. Der Winkel stimmt, aber die Transformation geht absolut in die Hose. So wie es scheint sitzt der Ursprung falsch, keine Ahnung wie das zustande kommt.
Der Ursprungscode, welcher eigentlich funktionieren sollte ist dieser:
Code:
  1. glPushMatrix;
  2.   glTranslatef((SCREEN_WIDTH div 2)-(W/2), 0.0, 0.0);
  3.   glRotatef(-Rot, 0.0, 0.0, 1.0);
  4.   glBindTexture(GL_TEXTURE_2D, KartenTex[Index]);
  5.   DrawTexture((SCREEN_WIDTH div 2)-(W/2), P, W, 96/960*SCREEN_HEIGHT, 0);
  6. glPopMatrix;

Mein Zeil ist es, den Drehpunkt an die Stelle der Bank (oben, mittig - (Bildschirmbreite/2-Kartenbreite/2)(0)) zu setzen. Daher die erste Zeile. Danach wird mithilfe des neuen Drehpunktes die Karte erstmal gedreht. Jeder Spieler hat einen Winkel über die Variable Rot zugewiesen. Der in der Mitte 0° (da er senkrecht liegt), der 1. nach links und nach rechts 13.3° usw. Danach wird die Karte wie gewöhnlich gezeichnet, es wird noch Rücksicht auf die Fensterabmessungen genommen. glPushMatrix/glPopMatrix haben den Sinn, dass nur die Karte und nicht der Hintergrund etc. gedreht wird. Die mittige Karte sitzt die am rechten Fensterrand, die anderen Karten sind nach unten und ebenfalls nach rechts verschoben (siehe Anhang).
Also gut, neuer Versuch. Dann nimmt man eben statt dem obigen glTranslatef eine Zurücksetzung auf den Ursprung (reiner Test, es ist nämlich ansonsten unbrauchbar):
Code:
  1. glTranslatef(0.0, 0.0, 0.0);

Und was passiert nun ? Die mittlere Karte ist diesmal perfekt, der Rest ist schrottreif. Die anderen Karten sind abhängig von dem Vorzeichen des Winkels nach oben oder nach unten verschoben. Die x-Werte sind auch in einem bestimmten Verhältnis falsch bei allen Karten außer der senkrechten zur Bank. Ist das Vorzeichen der Gradzahl negativ, haut die Karte nach unten ab, ist sie positiv nach oben (siehe Anhang).

Nun mal zur Initialisierung. Vor jeder Kartenrutsch-Animation werden aufgrund von eventuellen Sprüngen zu 3D und zurück (die woanders nötig sind) diese Zeilen ausgeführt:
Code:
  1. glMatrixMode(GL_PROJECTION);
  2.   glLoadIdentity;
  3.   glOrtho(0, Width, Height, 0, 0, 128);
  4. glMatrixMode(GL_MODELVIEW);

Setzt man das glLoadIdentity hinter das glOrtho, ist die komplette GUI so verzerrt, dass man nichts mehr bedienen kann, viele Sachen sind einfach nicht da - schwarz. Man kann daher nicht mal das eigentliche Spiel starten um zu testen, ob sich was geändert hat. Warum weiß ich nicht.

Es ist schwierig, da das Projekt eben doch recht umfangreich ist. Klar, wer will kann auch mal reinschauen, aber ich weiß ja nicht ob ich mir das an Eurer Stelle antun wollte. Es ist zwar kommentiert, aber Arbeit ist es allemal und ich kann und will so etwas auch nicht verlangen.

In den Anhängen sieht man in rot die sogenannten Boxen (das Ziel der rutschenden Karten), in schwarz jeweils einen dreier Kartenstapel. Es ist skizzenhaft, so ist es wesentlich übersichtlicher als mit Grafiken.

Habt Ihr eine Idee, woran es liegen könnte ?

Gruß
Nils


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 10, 2009 09:10 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Moin,

den Hauptfehler konnte ich gerade beseitigen. Um die Karte zu zeichnen wird wie oben im Code steht DrawTexture verwendet.
Code:
  1. procedure DrawTexture(pX, pY, pW, pH, pZ : Single);
  2. begin
  3.   glBegin(GL_QUADS);
  4.     glTexCoord2f(1, 0);
  5.     glVertex3f(pX+pW, pY   , -pZ);
  6.     glTexCoord2f(0, 0);
  7.     glVertex3f(pX   , pY   , -pZ);
  8.     glTexCoord2f(0, 1);
  9.     glVertex3f(pX   , pY+pH, -pZ);
  10.     glTexCoord2f(1, 1);
  11.     glVertex3f(pX+pW, pY+pH, -pZ);
  12.   glEnd;
  13. end;

Wenn man nun die Matrix transliert, dann darf man natürlich nicht eine weitere Verschiebung in DrawTexture machen. Daher:
Code:
  1. DrawTexture((SCREEN_WIDTH div 2)-(W/2), P, W, 96/960*SCREEN_HEIGHT, 0); // Falsch
  2. DrawTexture(0.0, P, W, 96/960*SCREEN_HEIGHT, 0); // Richtig

Und siehe da: Es sieht schon besser aus, aber nicht perfekt, denn die Karten rechts liegen leicht höher als die links. Ich habe nochmal genau geschaut und einen kleinen weiteren Fehler gefunden. Wenn ich den Rotationspunkt setze, dann soll der doch die Bildschirmmitte sein. Also spielt die Kartenbreite keine Rolle:
Code:
  1. glTranslatef((SCREEN_WIDTH div 2)-(W/2), 0.0, 0.0); // Falsch
  2. glTranslatef(SCREEN_WIDTH div 2, 0.0, 0.0); // Richtig

Da nun aber die Karte in die Mitte der Box soll muss sie doch noch um W/2 nach links verschoben werden. Aber das darf nicht über den Drehpunkt wie im Ursprungscode sondern nur über DrawTexture gemacht werden:
Code:
  1. DrawTexture(-W/2, P, W, 96/960*SCREEN_HEIGHT, 0);

Und nun sitzen die Karten von der Drehung her vollkommen symmetrisch zueinander. Ich habe nur noch ein Problem, der Winkel scheint nicht so ganz zu stimmen, denn sie sitzen nicht in den Boxen. Das probiere ich auch noch zu lösen, aber erstmal hier der aktuelle Standpunkt.

Gruß
Nils


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.007s | 16 Queries | GZIP : On ]