2009-08-27 25 views
12

Also arbeite ich gerade an einigen FPS-Spiele-Programmierung in OpenGL (speziell JOGL) nur zum Spaß und ich wollte wissen, was wäre die empfohlene Möglichkeit, um eine FPS-ähnliche Kamera zu erstellen?Wie würde man eine FPS-Kamera implementieren?

Im Moment habe ich im Grunde einen Vektor für die Richtung, in die der Spieler blickt, die durch Drücken der "w" oder Vorwärts-Taste zur aktuellen Spielerposition hinzugefügt wird. Das Negativ dieses Vektors wird natürlich für den "s" - oder Rückwärtsschlüssel verwendet. Für "a", links und "d", rechts verwende ich die Normale des Richtungsvektors. (Ich bin mir bewusst, dass dies den Spieler fliegen lassen würde, aber das ist im Moment kein Problem)

Beim Bewegen der Maus wird der Richtungsvektor mit Trigonometrie und Matrizen gedreht. Alle Vektoren sind natürlich zur einfachen Geschwindigkeitssteuerung normalisiert.

Ist das der übliche und/oder gute Weg oder gibt es einen leichteren/besseren Weg?

Antwort

6

Die Art und Weise I haben immer gesehen es getan ist mit zwei Winkeln, Gieren und Pitch. Die zwei Achsen der Mausbewegung entsprechen Änderungen in diesen Winkeln.

Sie können den Vektor forward einfach mit einer sphärisch-rechtwinkligen Koordinatentransformation berechnen. (Abstand = Breitengrad = φ, Gieren = Längengrad = θ)

Sie können einen festen Vektor up verwenden (sagen wir (0,0,1)), aber das bedeutet, dass Sie nicht direkt nach oben oder unten schauen können. (Die meisten Spiele lösen das, indem Sie nicht steiler als 89,999 Grad aussehen.)

Der Vektor right ist dann das Kreuzprodukt der Vorwärts- und Aufwärtsvektoren. Es wird immer parallel zur Grundebene sein, da der Aufwärtsvektor immer senkrecht zur Grundebene ist.

Links/Rechts-Tasten verwenden dann den Vektor +/-right. Für einen Vektor forward parallel zur Grundebene können Sie das Kreuzprodukt der Vektoren right und up nehmen.

Wie für den GL-Teil, können Sie einfach gluLookAt() mit dem Ursprung des Spielers, dem Ursprung plus dem forward Vektor und dem up Vektor verwenden.

Oh, und bitte, fügen Sie bitte eine "Invert Mouse" -Option hinzu.

Edit: Here ‚s eine alternative Lösung, die von dem 89,9 Problem entledigte, in einer anderen Frage gestellt, welche den right Vektor ersten Gebäude beinhalten (ohne Tonhöheninformation) und dann forward und up.

4

Ja, das ist im Wesentlichen die Art, wie ich es immer gesehen habe.

+0

Ok, danke. Ich wollte nur sicherstellen, dass ich nichts verpasse. Einen schönen Tag noch! –

1

Ja, aber am Ende werden Sie verschiedene andere Attribute der Kamera hinzufügen wollen. Um es buchstabieren n00b: halten Sie es sauber, wenn Sie Quake oder CS imitieren möchten. Am Ende könnte BoBing, FoV, Bewegungsfilterung, Netzwerkverzögerung und mehr sein.

Kameras sind eigentlich eine der schwierigeren Teile in einem guten Spiel zu machen. Aus diesem Grund sind die Entwickler in der Regel mit einer sehr langweiligen, festen 1st/3rd Person zufrieden.

1

Sie könnten Quaternions für Ihre Kameradrehung verwenden. Obwohl ich es selbst nicht versucht habe, sind sie nützlich, um gimbal lock zu vermeiden.

+1

Gimbal Lock kann nicht in FPSs passieren; Tatsächlich ist die Kopplung von Euler-Winkeln mit Mausbewegungen eine massive Vereinfachung ohne jegliches Risiko. –

+0

Wirklich, ok denke ich muss auf meinem 3D nachlesen. – crunchdog

+0

Jonas hat recht, es besteht nur die Gefahr eines Kardanverschlusses, wenn Sie mindestens 3 Umdrehungen kombinieren. Der Artikel, den du zitierst, ist einfach falsch. Sie können eine kardanische Sperre mit Matrizen und Quaternionen haben, wenn und nur wenn Sie Eulersche Transformationen verwenden. Es gibt nur zwei Arten, das zu beheben, einige nicht lineare Behandlungen für die Singularitäten an Polen oder nicht-eulerische Transformationen, die einfacher mit ... Quaternionen ausgedrückt werden können :) – gouessej

Verwandte Themen