Was ist der einfachste Weg, um eine 3rd-Person-Kamera in C ++ / DirectX9 zu implementieren?

8

Ich bin ziemlich neu in C ++ und DirectX9 und möchte eine Third-Person-Kamera implementieren. Nachdem ich etwas über Quaternion-basierte Kameras gelesen hatte, beschloss ich, es zu implementieren. Aber es hat mich wirklich umgehauen, also frage ich hier, wie man eine TP-Kamera am einfachsten implementiert.

Hier sind die Dinge, die die Kamera tun sollte:

  • Folgen Sie den in einem 3DVector gespeicherten Koordinaten (x, y, z).

  • Um das Objekt drehen (glatt)

  • Vielleicht eine Art 'Feder' = Nach dem Drehen langsam zur normalen Position hinter dem Objekt zurückkehren

Entschuldigen Sie mein schlechtes Englisch: Ich bin Deutscher und noch in der Schule!

Danke im Voraus!

BEARBEITEN:

Nach einigem Versuch habe ich es verstanden.

Das größte Problem, das ich in Betracht gezogen habe, war das richtige Extrahieren des "Richtungs" -Vektors aus der Weltmatrix.

Während meiner Recherche habe ich meistens so etwas gefunden:

D3DXVECTOR3 direction;
direction.x = worldMatrix->_13;
direction.y = worldMatrix->_23;
direction.z = worldMatrix->_33;
D3DXVec3Normalize(&direction, &direction);

Das funktioniert bei mir NICHT ! Stattdessen habe ich Folgendes getan:

D3DXVECTOR3 direction;
direction.x = worldMatrix->_13;
// Consider the .y after the .z!
direction.z = worldMatrix->_23;
direction.y = worldMatrix->_33;
D3DXVec3Normalize(&direction, &direction);

Zur Skalierung:

// The tenfold of the average distance
D3DXVec3Scale(&direction, &direction, 10.0f);

Einstellen der Positionen:

cameraPos = targetPos - direction;
// For a top-view
cameraPos.y = targetPos.y + 5;

Für Rotationen sollten Sie eine temporäre Weltmatrix (von der Position des Ziels aus) erstellen und diese nach Ihren Wünschen drehen und die Richtung extrahieren.

Das Glätten der Rotation hängt wirklich von IHREM Spiel ab!

Diese Art von 3rd-Person-Kamera ist wirklich einfach herzustellen und macht ihren Job!

Wirklich toll, danke an "jheriko", der mir die richtige Antwort gegeben hat!

Anonym Anonym
quelle
+1 für die tatsächliche Beschreibung dessen, was Sie benötigen, das ist selten (obwohl es detaillierter sein könnte, zum Beispiel ist der 3. Punkt verwirrend - haben Sie nicht impliziert, dass er sich frei dreht?).
Wondra
Ja, es sollte sich frei drehen lassen, aber ich möchte, dass es nach Abschluss der Drehung langsam zum Punkt auf der Rückseite des Players zurückkehrt!
Anonym Anonym

Antworten:

1

Was Ihnen helfen wird, ist die Transformationsmatrix für das Objekt, dem Sie folgen möchten. Sie können den Vorwärtsvektor aus dieser Matrix extrahieren. Abhängig von Ihrem Koordinatensystem und der Händigkeit der Matrix ist dies eine der Zeilen oder Spalten, in denen die 4. Komponente entfernt ist (vorausgesetzt, Sie verwenden 4x4-Transformationsmatrizen ohne Skalierungsfaktoren - Skalierungsfaktoren sind für schrecklich viele Gründe ... aber wenn Sie Skalierungsfaktoren haben, können Sie die Zeile / Spalte nach dem Entfernen der 4. Komponente normalisieren.)

Sobald Sie dies haben, können Sie die Kamera direkt hinter dem Objekt positionieren, indem Sie dies von der Objektposition subtrahieren. Um die Kamera hinein und heraus zu bewegen, können Sie den Vektor skalieren und um das Objekt drehen, können Sie eine x- und y-Drehung (oder xz / zy usw. je nach Händigkeit usw.) vornehmen, die Sie auf eine Kopie der Objektmatrix anwenden vor dem Extrahieren der Vorwärtsrichtung.

Um die Bewegung zu glätten, besteht die einfachste Lösung darin, den vorherigen Versatz und die vorherigen Winkel zu verfolgen und zu ihnen um einen von a ^ (b.dt) beschriebenen frameratenabhängigen Betrag zu lerp, wobei dt die Deltazeit und a, b die von Ihnen gewählten Parameter sind. a = 0,9 und b = 30 geben Ihnen den Effekt, sich um 90% in Richtung der Position zu bewegen, als ob Sie es jedes Bild mit 30 fps machen würden. Dies wird als "unendliche Impulsantwort" -Filter bezeichnet und ist ein klassischer Hack für diese Art der Glättung.

Dies ist möglicherweise nicht ideal. Möglicherweise möchten Sie einen Mindestabstand auswählen und auch die Winkel einschränken. Andernfalls kann die Kamera das Objekt passieren. Wenn Sie sich in einer dichten Welt befinden, die gegen dazwischen liegende Objekte klemmt oder diese verblasst, wird dies ebenfalls wichtig.

Entschuldigung, das ist lang, aber es ist kein triviales Problem, wie Sie anscheinend entdeckt haben.

hoffe das hilft. Bei Bedarf kann ich mehr Detailtiefe bereitstellen.

(ps keine Quaternionen notwendig - sie helfen wirklich nicht für dieses Problem)

Jheriko
quelle
Vielen Dank! Sie haben mir einige Ideen gegeben, wie das geht. Aber ich würde mich über einige Codebeispiele freuen, wenn Sie nichts dagegen haben. Und warum nicht Quaternionen verwenden? Ich habe gelesen, dass sie häufig für solche Dinge verwendet werden ( en.wikipedia.org/wiki/Quaternion ).
Anonym Anonym
Ich habe versucht, es so zu machen, wie Sie es beschrieben haben, habe aber immer noch einige Probleme. Die Kamera befindet sich nicht auf der Rückseite des Players, sondern zumindest irgendwo auf seiner Seite! Ich verstehe das Teil mit den X- und Y-Rotationen nicht: Was soll gedreht werden? Die Weltmatrix, der Richtungsvektor oder eine Kopie des Spielerpositionsvektors? Und wie dreht man sich? Hoffe du kannst mir helfen!
Anonym Anonym
Sie drehen den Richtungsvektor oder die Matrix, aus der Sie ihn extrahieren (die Transformationsmatrix des Objekts, nicht die Welt- oder Ansichtsmatrix), um zu drehen. Sie konstruieren Achsenwinkel-Rotationsmatrizen und multiplizieren sie oder verwenden Trigonometrie ...
jheriko