PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kamera und Kollisionen


ngari
2011-01-07, 21:13:02
Hallo,

ich habe mir vor ein paar Wochen mal vorgenommen, eine Art Minecraftklon zu entwickeln --- mittlerweile stehen die Basisklassen (Welt wird als Octree modelliert, OpenGL ueber LWJGL fuers Display). Nun habe ich das Problem, dass ich von den Kamerakoordinaten nicht zu welchen in meinem Octree komme. Um das zu beheben habe ich die letzten paar Tage gegruebelt und etliche Ansaetze probiert, bekam allerdings nur Fail heraus. (Und uebers Suchen habe ich auch die leise Vermutung, dass mein Ansatz vom Prinzip her nicht funktionieren kann. Ich habe OpenGL bisher nur fuer 2D-Sachen mit Rasterisierung benutzt, insofern sind da meine Faehigkeiten eher beschraenkt.)

Die Kamera hat einen Positionsvektor und drei Richtungsvektoren --- das Fliegen im Ghostmode funktioniert prima (und mittlerweile auch beschraenkt auf x- und z-Achsen bewegung ohne Spruenge). Außerdem habe ich 'ne Klasse, zu deren Octreekoordinaten vor der Kameraausrichtung verschoben wird --- die Kamerakomponenten werden passend zwischen 0.0f und 1.0f gehalten und die Octreekoordinaten angepasst. Sollte diese Anpassung in an einer Octreeposition landen, die nicht null ist, gaebe es eine Kollision, nur kann ich immer noch seelenruhig durch Texturen fliegen.

Coda
2011-01-07, 23:46:35
Erklär nochmal. Ich versteh's nach dem dritten Lesen immer noch nicht.

Allgemeine Anmerkungen:
Dein Octree und deine Spielerposition sind nicht im gleichen Koordinatensystem? Wenn ja, wieso nicht?

Wichtig bei Spieler-Kollisionserkennung ist, dass man testen muss ob das Player-Objekt (Ellipse ist einfach) in der Zeit seit dem letzten Physik-Tick nichts "durchquert" hat. Stichwort "continuous collision detection".

ngari
2011-01-08, 12:56:40
Erklär nochmal. Ich versteh's nach dem dritten Lesen immer noch nicht.


Mein Octree wird so durchloffen, dass jede Node die Matrix pusht, bevor sie ein glTranslate() (passend zum Index) aufruft. In den Blaettern wird der Wuerfel dann bei der aktuellen Position gezeichnet und die Matrix vom Stack gepoppt. D.h. wenn der Wuerfel mit dem Index 0 der ist, der unten links und nah bei der Kamera ist, sollte der der ja bei der Position (0,0,0) gezeichnet werden. Die Koordinaten in der Modelviewmatrix passen so weit. Wenn ich die Kamera bewege, veraendert sich ja die Modelviewmatrix, da ich die Kamera setze, bevor ich den Octree durchlaufe.
Jetzt dachte ich mir, dass ich die Kameraposition auf Werte zwischen 0 und 1 beschraenken kann --- mehr oder weniger feine Bewegungen --- waehrend ich groeßere Bewegungen ueber ein glTranslate() entsprechend der Position des Spielers im Octree mache.


Allgemeine Anmerkungen:
Dein Octree und deine Spielerposition sind nicht im gleichen Koordinatensystem? Wenn ja, wieso nicht?
Das ist die Preisfrage. Meine Kamera hat die Objektkoordinaten in OpenGL --- was fuer Koordinaten aber mein Octree hat, habe ich mittlerweile keine Ahnung mehr. Anfangs dachte ich, dass er auch Objektkoordinaten haette, was sich dann aber bald als falsch herausstellte.

Coda
2011-01-08, 13:03:57
Jetzt dachte ich mir, dass ich die Kameraposition auf Werte zwischen 0 und 1 beschraenken kann --- mehr oder weniger feine Bewegungen --- waehrend ich groeßere Bewegungen ueber ein glTranslate() entsprechend der Position des Spielers im Octree mache.
Wieso das denn? Das hört sich sehr obskur an.

Die Objekte sollte man für Kamerabewegungen nicht verschieben müssen. Die Translation/Rotation der Welt so, dass die Kamera an der richtigen Position ist gehört in die View-Matrix.

Das ist die Preisfrage. Meine Kamera hat die Objektkoordinaten in OpenGL
Die Kamera hat sicher keine Objektkoordinaten, die wären sonst immer (0, 0, 0) weil das Ding keine Ausdehnung hat. Meinst du Weltkoordinaten?

was fuer Koordinaten aber mein Octree hat, habe ich mittlerweile keine Ahnung mehr. Anfangs dachte ich, dass er auch Objektkoordinaten haette, was sich dann aber bald als falsch herausstellte.
Dann solltest du das vielleicht mal rausfinden, bevor du weitermachst X-D

ngari
2011-01-08, 14:18:22
Dann solltest du das vielleicht mal rausfinden, bevor du weitermachst X-D
`Kleine' Frage: Wie? Dass die Kamera in Weltkoordinaten (ja, noch keinen Kaffee...) ist, habe ich herausgefunden, indem ich einen (0,0,0,1)-Vektor mit den verschiedenen Matrizen und deren Inversen multipliziert habe und dann bei der Inversen der ModelView dann meine Kamerakoordinaten rauskamen. Beim Octree habe ich ja aber die Koordinaten eigentlich in der Struktur drin --- und festgelegt werden die ja dann beim Zeichenloop ueber glTranslate().

Coda
2011-01-09, 03:33:47
Da hilft nur darüber nachdenken und evtl. mal auf dem Blatt rechnen.