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

Aktuelle Zeit: Fr Jul 04, 2025 19:45

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Spielfeld drehen und verschieben
BeitragVerfasst: Fr Aug 07, 2009 19:51 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 23, 2009 04:33
Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Hallo, ich bin gerade mal wieder am rumprobieren für mein Spiel. Es handelt sich im Prinzip um ein 2D-Spiel welches ich jedoch in den 3D-Raum bringen will.

Das Spielfeld liegt vor dem Spieler - wie ein Mensch-ärger-dich-nicht-feld - und kann mit der Maus gedreht und gezoomt werden.

Code:
  1.  
  2.   glLoadIdentity;
  3.   glTranslatef(0,0,map_view.Zoom);
  4.   glRotatef(map_view.x_winkel,1,0,0);
  5.   glRotatef(map_view.z_Winkel,0,0,1);
  6.   glTranslatef(map_view.x,map_view.y,0); // <-- Problem
  7.  


Also zuerst wird das Spielfeld auf der z-Achse verschoben, dann wird es auf der x-achse gekippt und schließlich um die z-achse rotiert. Als letztes soll das Spielfeld nach rechts/link bzw. oben/unten bewegt werden, so dass der richtige Ausschnitt gewählt wird.

Problem: wenn ich als erstes Tranlate x,y aufrufe, dann funktioniert das rotieren nicht mehr wie gewünscht. Rufe ich translate x,y so wie im Quelltext auf, dann ist im Prinzip alles super, nur wird das Spielfeld halt nicht nach oben/unten rechts/links bewegt, sondern Abhängig von der z-Rotierung in der "echten" x-y Ebene. Gibt es da irgendeinen Trick wie ich OpenGL dazu bringen kann die fertig gedrehte Matrix sozusagen "einzunorden"? Oder muss ich die Operanden für glTranslatef selber neu berechnen?

//edit Hier noch rasch zur Veranschaulichung
Bild

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 07, 2009 20:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Mir ist nicht 100%ig klar was du genau erreichen willst, aber versuche mal:
Code:
  1. glLoadIdentity;
  2. glRotatef(map_view.x_winkel,1,0,0);
  3. glRotatef(map_view.z_Winkel,0,0,1);
  4. glTranslatef(map_view.x,map_view.y,map_view.Zoom);


P.S.: gluLookAt könnte für dich ganz hilfreich sein.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 07, 2009 20:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 23, 2009 04:33
Beiträge: 157
Programmiersprache: Turbo Delphi Pro
@code: ne, wenn ich das mache kippt sich das Spielfeld nicht mehr um die x-achse, sondern es dreht sich um den betrachter. Ausserdem lässt sich das SPielfeld dann immer noch nicht nach oben/unten/links/rechts verschieben.
@gluLookAt werd ich mir gleich mal anschauen.

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 07, 2009 20:49 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Ich bin mir nicht so ganz sicher es das ist was du willst, aber vielleicht geht es wenn du die Translates beide am Anfang machst. Ich denke dann wird das Spielfeld auf seine Position verschoben und nurnoch um sich selbst rotiert. Dann kann man auch wie bei Coolcat die Translates zusammenfassen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 07, 2009 22:58 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hi,

schonma das versucht:
Code:
  1. glLoadIdentity;
  2. glTranslatef(0,0,map_view.Zoom);
  3. glRotatef(map_view.x_winkel,1,0,0);
  4. glTranslatef(map_view.x,map_view.y,0);
  5. glRotatef(map_view.z_Winkel,0,0,1);


Dabei frage ich mich, ob du wirklich um die Z-Achse drehst?! Weil das is ja die Achse die aus dem Bildschirm raus kommt und damit wäre das ein Roll un kein Turn...
Af jedenfall hab ich mit diesem Code (und glRotatef(map_view.y_Winkel,0,1,0); ) das Ergebniss was du wolltest.

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 08, 2009 13:43 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 23, 2009 04:33
Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Ansich geht das, nur wird dann das Spielfeld um seinen Mittelpunkt gedreht (oder gerollt wie auch immer), nicht mehr um den Mittelpunkt der aktuellen Ansicht.

Ich lade mal die exe hoch, dann wird es vielleicht klarer was ich erreichen will.

http://s200005540.online.de/verschiedenes/spiel.rar

Die Maussteuerung ist leider noch nicht optimal das sag ich gleich, aber mehr oder weniger geht es so:

- Mit der Linken Maustaste kann man das Spielfeld in allen Himmelsrichtungen verschieben. (Das was eben noch nicht richtig funzt).
- Mit der rechten Taste kann das Spielfeld gedreht werden, und zwar mit der aktuellen Ansicht als Punkt um den gedreht wird,
- Ebenfalls mit der rechten Taste wird das Spielfeld gekippt, wobei die Kippung immer vom Bildschirm weg ist, also nicht mit rotiert wird, was ja für ein Spiel nicht gut wäre
- Mit dem Mausrad kann gezoomt werden

Ausserdem kann man mit laden ein Objekt laden, welches sich mit der Mittleren Taste auf dem Brett positionieren lässt, einen ICE und ein Haus habe ich mitgeliefert.

//edit
Ach ja was ich noch dazu sagen sollte: das Spielbrett wird ausgehend vom Punkt 0,0 in alle Richtungen aufgebaut. Derzeit besteht das SPielfeld aus 101x101 Kästchen, die zugehörige Schleife geht von -50,-50 bis 50,50

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 08, 2009 15:26 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Achso, jetzt versteh ich das.
Ich denke aber nicht das man das mit so einfachen Translates und Rotates schafft. Im Prinzip kannst du Rotieren, Verschieben, wieder Rotieren und so weiter. D.h. man verbindet nicht nur die paar Transformationen sondern alle Bewegungen die jemals gemacht wurden. Also entweder du speicherst die Matrix und rechnest immer die neuen Transformationen dazu oder du musst abhängig von der Drehung die Translation ausrechnen.
Oder man benutzt gluLookAt, wobei man dann natürlich auch die Verschiebung der Position von der Kamerablickrichtung abhängig machen muss.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 08, 2009 17:55 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

das is ganz easy, wenn man weiß wie es geht^^
Ich hab damit schon öfter Probleme gehabt un bin in solchen Sachen schon etwas geübt. Du musst einfach die 2D Mausbewegung auf dem Fenster an die Kamera anpassen und damit die neuen X bzw. Z Position berechnen:
Code:
  1.   if ssLeft in Shift then
  2.     begin
  3.       DeltaX := (OldMousePos.X - X)/100;
  4.       DeltaY := (OldMousePos.Y - Y)/100;
  5.       PosX := PosX - DeltaX * cos(Cam[1]/180*Pi);
  6.       PosZ := PosZ - DeltaY * cos(Cam[1]/180*Pi);
  7.       PosX := PosX + DeltaY * sin(Cam[1]/180*Pi); //warum das hier + is weiß ich net, hab ich beim testen raus gefunden xD
  8.       PosZ := PosZ - DeltaX * sin(Cam[1]/180*Pi);
  9.     end;

Hab auch nochma alles hochgeladen, da kannst dir das nochma in ruhe angucken...

MfG Bergmannn


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

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 09, 2009 20:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 23, 2009 04:33
Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Hey vielen Dank schonmal :D werde mir das mal anschauen :D

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)


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

Registriert: Do Jul 23, 2009 04:33
Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Vielen dank nochmal, klappt super! Weil bei mir im Vergleich zu deinem Beispiel Y und Z Achse vertauscht sind musste ich bei mir das + in die letzte Zeile (Zeile 8 in deinem Code-Zitat) setzen (auch durch ausprobieren gefunden ^^). Du hattest sogar mein Mausproblem gelöst :D (was ich aber nicht wusste und daher gerade eben selbst gecodet habe bevor ich mir dein Beispiel anschaute... naja meine Blödheit ^^)

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 11, 2009 14:46 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
K, das freut mich^^
aber mal ne frage, warum hast du deine Welt gedreht? Warum lässt du nich die Z-Achse aus dem Bildschirm raus kommen, so wie es eig. schon Standart ist?!

MfG Bergmann

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 11, 2009 15:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jul 23, 2009 04:33
Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Bergmann89 hat geschrieben:
K, das freut mich^^
aber mal ne frage, warum hast du deine Welt gedreht? Warum lässt du nich die Z-Achse aus dem Bildschirm raus kommen, so wie es eig. schon Standart ist?!

MfG Bergmann


Öhm... genau das tut sie eigentlich... jedenfalls im Normalfall, also wenn das Brett Parallel zum Bildschirm liegt. Wenn der Spieler es flach "auf den Boden" kippt natürlich nicht mehr, aber das ist auch ein Extremfall...

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 11, 2009 20:59 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Axo. also hast du sozusagen ne draufsicht. Na gut eig is ja auch ega wie man das macht, solange man selber damit klar kommt un das ergebniss das selbe is ^^

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


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


Wer ist online?

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