2016-05-21 8 views
1

Ich habe kürzlich die LearnOpenGL-Tutorials bis einschließlich ihres Beleuchtungsteils verfolgt. Zuvor, für einen Grafik-orientierten Mathematikkurs, habe ich Lunar Lander wie Physik in 2D gemacht, und jetzt versuche ich das in 3D zu übersetzen. Während die Physik selbst gut läuft, kämpfe ich mit der Kamera. Zuerst war es einfach eine Kamera, die hinter dem Objekt schwebte und ihm folgte, was ziemlich einfach war. Aber jetzt versuche ich, die Rotation basierend auf der Mauseingabe zu implementieren, und ich kann es einfach nicht gut aussehen lassen.Berechnung der Position einer Third-Person-Kamera

Was ich will ist eine normale Third-Person-Kamera wie in jedem modernen 3D-Spiel. Ich versuche derzeit nur, die X- und Z-Position basierend auf dem Gieren zu setzen (xoffset wird durch Mauseingabe geliefert). Meine Ansicht Matrix wird wie folgt berechnet:

glm::lookAt(cameraPosition, focusTarget, cameraUp); 

Mein Fokussierzielzone ist einfach der normalisierten Vektors zwischen der aktuellen und der Position camera der übergeordneten Objekts (der eine der Kamera folgen soll). Der Aufwärtsvektor ist das normierte Kreuzprodukt des rechten Vektors und des Zielvektors, und der rechte Vektor ist das normalisierte Kreuzprodukt des Zielvektors und des Welt-oben-Vektors (0,0 f, 1,0 f, 0,0 f).

I berechnen die Position der Kamera wie folgt aus:

glm::vec4 cp; 
cp.x = hoverRadius * sin(glm::radians(yaw)); 
cp.z = hoverRadius * cos(glm::radians(yaw)); 

cameraPosition = glm::vec3(parentPosition->x + cp.x, parentPosition->y + 3.0f, parentPosition->z + cp.z + 20.0f); 

Es machte Sinn mir der X- und Z-Werte aus der Sinus- und Cosinus zu stützen, der Gier als der Winkel verwendet wird, aber das Ergebnis Enden aussehen wie das, wenn ich meine Maus nach links und rechts wischen:

https://zippy.gfycat.com/TediousElementaryBarnswallow.webm

Offensichtlich ist dies nicht das, was ich will. Erstens, weil die Entfernung von der Kugel nicht gleich bleibt und zweitens, weil sie in einer Ellipse hinter der Kugel umkreist und nicht um sie herum.

Also, weiß jemand, wie man das beheben kann? Könnte mir jemand stattdessen auf eine Ressource/Anleitung verweisen, die mir bei der Programmierung einer funktionalen Third-Person-Kamera helfen könnte? Ich habe es stundenlang gegoogelt und habe es nicht geschafft, selbst etwas zu finden, aber ich weiß auch nicht wirklich, was ich googeln soll.

Wenn Sie weitere Details zu meinem Code benötigen, stelle ich Ihnen gerne meinen gesamten Kameracode zur Verfügung (der größtenteils auf der LearnOpenGL-Kameraklasse basiert).

Antwort

0

Es sieht irgendwo so aus, die Kameramatrix ist auf der X-Achse skaliert, sind Sie sicher, dass es irgendwo kein glm :: scale gibt, vielleicht eine Multiplikation im Vertex-Shader?

Wissen Sie auch, dass Sie glm::rotate und glm::translate auf Vektoren oder auf Positionen verwenden können, anstatt Kosinus und Winkel manuell zu berechnen? Es gibt viele überladene Operatoren in GLM auch, dass Sie helfen, Ihren Code besser lesbar zu machen, Beispiel:

glm::vec3 offset(0, 3, 20); 
glm::vec3 cp = glm::rotate(glm::vec3(0, 0, hoverRadius), yaw, glm::vec3(0, 1, 0)); 

cameraPosition = parentPosition + cp + offset; 

(Ich bin nicht sicher, ob dieser Code vollständig gültig ist, ich es nicht getestet, aber aus dem Speicher, sollte es ungefähr tun, was Sie getan haben)