Du bist nicht angemeldet.

Werbeanzeige

1

18.12.2014, 06:52

Bewegung in Blickrichtung

Guten Tag,
ich programmiere gerade ein 3D Spiel mit C++ und Irrlicht.
Nun meine Frage : Wie kann ich die Bewegung in Blickrichtung machen ?
Bzw. Gegengesetzt von der Blickrichtung und nach links und rechts .
Könnt ihr mir auch Code geben ?
P.s: ich will die Steuerung mit WASD machen. :hmm:

Gruß Niklas

2

18.12.2014, 07:00

Du musst die Kameraposition einfach mit dem Vektor addieren, der in die Blickrichtung zeigt. Normalerweise hat man einen Forward-, Right und Up-Vector. Fürs seitliche Bewegen nimmt man dann eben den Right-Vector (oder eben Left-Vector, wenn man sowas hat. Geht natürlich auch).

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Batzer« (18.12.2014, 10:04)


DeKugelschieber

Community-Fossil

Beiträge: 2 664

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

18.12.2014, 10:47

Jop du hast entweder einen Vektor für die Blickrichtung und kannst diesen einfach auf die Position addieren, oder du errechnest ihn dir (Winkelfunktionen) anhand der Gradzahlen.
Ich gehe normalerweise über ersten Weg. Den Vektor kann man dann drehen/bzw. seitlich gehen, indem man über das Kreuzprodukt (Blickrichtung und Up Vektor) den rechten Vektor ausrechnet. Für links natürlich einfach negieren.

Hier mal kurz für 2D (Pseudocode):

Quellcode

1
2
3
4
5
6
7
8
9
10
    if(W){
        // von Gradzahl
        var rad = rotation*PI/180.0;
        direction.x = sin(rad);
        direction.y = cos(rad);

        // aufaddieren
        position.x += direction.x;
        position.y += direction.y;
    }

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »DeKugelschieber« (18.12.2014, 13:30)


4

18.12.2014, 11:26

Das Normalisieren ist sinnlos, l ist immer 1, da sin^2(x)+cos^2(x)=1.

Du musst die errechnete Richtung mal Geschwindigkeit mal Zeit rechnen. Also bei einer Frametime von 2 Sekunden und 6m/s hast du dann eine Bewegung von 12 Metern in Richtung des Winkels.
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

DeKugelschieber

Community-Fossil

Beiträge: 2 664

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

18.12.2014, 13:30

Ja stimmt, ist aus nem anderen Kontext gerissen wo das schon wichtig wäre.
Habs mal korrigiert.

6

18.12.2014, 13:46

Jetzt ist die Bewegung immer 1 lang. Bei 60 FPS also 60 pro Sekunde. Jetzt musst du das noch mit der Geschwindigkeit und der Zeit multiplizieren.
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

David Scherfgen

Administrator

Beiträge: 10 334

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

18.12.2014, 14:25

Die gesamte Rechnung ist überflüssig. Die Vektoren für Vorwärts, Rechts und Links hat man automatisch, wenn man eine Kameramatrix hat. Das sind nämlich einfach die Zeilen bzw. Spalten der linken oberen 3x3-Matrix.

8

18.12.2014, 15:34

Aber trifft das auch zu, wenn die Kamera schräg nach unten auf den Charakter gerichtet ist, wie es in vielen Spielen üblich ist? Wenn der Spieler nicht gerade fliegen soll, würde der sich in dem Fall durch den Boden nach unten bewegen, obwohl er geradeaus laufen sollte...
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

DeKugelschieber

Community-Fossil

Beiträge: 2 664

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

9

18.12.2014, 15:39

Deswegen sagte ich ja auch dass man den Richtungsvektor wahrscheinlich sowieso immer hat.
Bei allem aus der Egoperspektive z.B. sowieso.

NachoMan

Community-Fossil

Beiträge: 3 905

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

18.12.2014, 15:56

Aber trifft das auch zu, wenn die Kamera schräg nach unten auf den Charakter gerichtet ist, wie es in vielen Spielen üblich ist? Wenn der Spieler nicht gerade fliegen soll, würde der sich in dem Fall durch den Boden nach unten bewegen, obwohl er geradeaus laufen sollte...

Deswegen setzt man den Wert auf der Achse, auf der man keine Bewegung haben möchte(bei Egoshootern in der Regel die Y-Achse), auf null und normalisiert den Vektor. So mach ich es zumindest.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige