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:
glLoadIdentity;
glTranslatef(0,0,map_view.Zoom);
glRotatef(map_view.x_winkel,1,0,0);
glRotatef(map_view.z_Winkel,0,0,1);
glTranslatef(map_view.x,map_view.y,0);// <-- Problem
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
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen. (Koreanisches Sprichwort)
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)
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.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hi,
schonma das versucht:
Code:
glLoadIdentity;
glTranslatef(0,0,map_view.Zoom);
glRotatef(map_view.x_winkel,1,0,0);
glTranslatef(map_view.x,map_view.y,0);
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.
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.
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)
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.
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:
if ssLeft in Shift then
begin
DeltaX :=(OldMousePos.X- X)/100;
DeltaY :=(OldMousePos.Y- Y)/100;
PosX := PosX - DeltaX *cos(Cam[1]/180*Pi);
PosZ := PosZ - DeltaY *cos(Cam[1]/180*Pi);
PosX := PosX + DeltaY *sin(Cam[1]/180*Pi);//warum das hier + is weiß ich net, hab ich beim testen raus gefunden xD
PosZ := PosZ - DeltaX *sin(Cam[1]/180*Pi);
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.
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 (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)
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?!
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)
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 ^^
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.