Frage

Zur Zeit arbeite ich mein erstes FPS-Spiel mit JOGL auf der Gestaltung. (Java-Bindings für OpenGL).

Bisher habe ich es gelungen, die ‚Welt‘ (eine Reihe von Würfeln) und ein Player-Modell zu generieren. Ich habe die Kollisionserkennung zwischen dem Spieler und den Würfeln Arbeiten groß.

Jetzt versuche ich, in den Geschützen hinzuzufügen. Ich habe die Pistole Modelle korrekt und Laden auf Player-Modell gezeichnet. Die erste Waffe Ich versuche, eine Laserpistole zu implementieren, die schießen und momentaner Line-of-sight-Laser bei was auch immer Sie sind mit dem Ziel an. Bevor ich auf die Umsetzung der feindlichen Modelle arbeiten, würde Ich mag die Kollisionserkennung zwischen dem Laser und den Wänden zum Laufen bringen.

Mein Laser, zur Zeit, wird durch eine Reihe von kleinen Würfeln gezogen, eine nach der anderen. Der erste Würfel ist am Ende der Spieler Pistole gezogen, dann zieht sie kontinuierlich von dort. Die Idee war, zeichnete die Würfel des Lasers fortzusetzen, bis eine Kollision mit etwas, nämlich dem Würfel in der Welt erkannt wurde.

Ich weiß, dass die Positionen der Würfel in der Welt. Das Problem ist, dass ich glMatrixPush nenne meinen Charakter Modell zu zeichnen. Der Laser wird dann innerhalb dieses Models-View gezogen. Was bedeutet, dass ich mein altes Koordinatensystem verloren - so dass ich die Welt in einem System zeichnen, dann den Lazer in einem anderen. Innerhalb dieses Spielers Matrix, ich habe mehrmals glRotate und glTranslate gehen rufen, um alles auf dem Weg zu synchronisieren ist die Kamera zu drehen. Der Lazer wird dann gebaut, indem sie entlang der z-Achse des neuen Systems zu übersetzen.

Mein Problem ist durch all diese Veränderungen, die, ich habe keine Ahnung mehr, wo mein Laser in der Karte existiert Koordinatensystem, in erster Linie aufgrund der Drehungen der Kamera beteiligt ist.

Kennt jemand eine Methode - oder irgendwelche Ideen haben, denn wie dieses Problem zu lösen? Ich glaube, dass ich einen Weg brauchen, um die neuen Koordinaten des Lasers in die alten Koordinaten der Karte zu konvertieren, aber ich bin nicht sicher, wie zum Verhängnis all der Transformationen zu gehen, die es getan haben. Es gibt auch einige Funktionen von OpenGL zur Verfügung gestellt werden kann, diese Art von Problem zu behandeln, die ich bin nur nicht bewusst.

War es hilfreich?

Lösung

Der Punkt, der in der ersten Antwort gemacht wurde ist, dass man nie auf der Matrix abhängen sollte das Objekt an erster Stelle zu positionieren. Sie sollten den Überblick über die Position und Rotation des Lasers werden zu halten, bevor Sie denken, auch nur darüber zu ziehen. Dann nutzen Sie die übersetzen und drehen Befehle sie setzen, wo Sie wissen, sollte es sein.

Sie versuchen, die Dinge rückwärts zu tun, und ja, dass Sie die Matrix Mathematik zu tun haben, bedeutet würden, und OpenGL nicht im Auge behalten davon, weil die Modelview Matrix die einzige Sache ist, dass OpenGL halten tut Spur von Positionen in Bezug auf das Objekt. OpenGL hat kein Konzept von „Weltraum“ oder „Kameraraum“. Es gibt nur die Matrix, die alle Eingaben durch multipliziert werden. Es ist elegant, einfach ... aber in einigen Fällen wir es vorziehen, die Art und Weise DirectX ein eine separate Ansicht Matrix und Modellmatrix hat.

Also, wenn Sie nicht wissen, wo ein Objekt ohne Matrix Math befindet, dann würde ich, dass ein grundlegendes Designproblem betrachten. Wenn Sie nicht Notwendigkeit , um die Objektposition zu kennen, dann nach herzenslust-Matrix-Transformation, aber wenn Sie tun müssen ist es Position, starten mit der Position.

(ziemlich viel, was die erste Antwort sagt, nur in einer anderen Art und Weise ...)

Andere Tipps

Sie sollten nicht den Laser als räumliches Kind des Charakters in Betracht ziehen, dass es abfeuert. Sobald seine abgefeuert worden, der Laser ist eine Einheit der eigenen, so sollten Sie machen, wie folgt:

glPushMatrix(viewMatrix);
glPushMatrix(playerMatrix);
DrawPlayer();
glPopMatrix();
glPushMatrix(laserMatrix);
DrawLaser();
glPopMatrix();
glPopMatrix();

Auch sicher sein, dass Sie nicht mischen Ihre Rendering-Transformationslogik mit dem Spiel Logik. Sie sollten die Weltraumposition Ihrer Objekte immer speichern zu können, für Kreuzungen testen, unabhängig von Ihrem aktuellen OpenGL-Matrix-Stack.

Denken Sie daran, mit räumlichen Eltern / Kind-Beziehungen, vorsichtig zu sein. In der Praxis sind sie nicht so häufig. Weitere Informationen Google über die Probleme der Szenengraphen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top