Ankündigung

Einklappen
Keine Ankündigung bisher.

Probleme mit Matrizen Mathematik

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Probleme mit Matrizen Mathematik

    Kann mir hier jemand bei einem Problem in der Matrizen Mathematik helfen?

    Ich habe nämlich gerade ein Verständnissproblem:
    Ich programmiere gerade eine FirstPersonCamera für ein Computerspiel.
    Um das zu vestehen, muss ich vlt zuerst ein paar Grundlagen der GameProgrammierung erklären. In einem 3D-Spiel werden die Positionen aller Objekte in einer Matrix gespeichert (enthält Angaben zu X, Y und Z Position im Raum, Rotation, Skalierung). Die aktuelle Ansicht wird dann über eine weitere Matrix (4x4) berechnet.

    Objekte, von welchen aus der 3D-Raum betrachtet werden kann, werden Kameras genannt. Und ich programmiere gerade eine FirstPersonCamera, welche man mittels der Tastatur durch den 3D-Raum steuern kann. Hierbei habe ich nun das Problem, dass zwar die Rotationen (Yaw, Pitch und Roll) korrekt funktionieren, sobald ich mich dann aber forwärts bewegen will, bewegt sich die Kamera z.b. nur auf der Z-Achse nach vorne, anstatt in die Richtung, in die ich gerade (aufgrund der Rotationen) blicke.

    Die Matrix, mit welcher die Ansicht berechnet wird, berechne ich wie folgt:

    Code:
    view = Matrix.CreateTranslation(currentPosition)
              * Matrix.CreateRotationX(currentRotation.X)
              * Matrix.CreateRotationY(currentRotation.Y)
              * Matrix.CreateRotationY(currentRotation.Z)
              * Matrix.CreateTranslation(moveVector)
              * Matrix.CreateRotationX(rotationVector.X)
              * Matrix.CreateRotationY(rotationVector.Y)
              * Matrix.CreateRotationY(rotationVector.Z)

    Diese Berechnung wird bei jedem Frame (d.h. Berechnung des Bildes) ausgeführt

    Erklärungen zu den Variablen:
    - currenPosition: Aktuelle Position der Kamera im Raum (Vektor mit X Y Z)
    - currentRotation: Aktuelle Rotation der Kamera (Vektor X Y Z)
    - moveVector: Distanz, welche die Kamera bewegt wird (Vektor X Y Z)
    - rotationVector: Rotation, welche seit dem letzten Frame angewandt wurde (Vektor X Y Z)

    Meine Idee ist, dass ich die Kamera zuerst an den Ort bewege, wo sie vorher war und anschliessend die bestehende Rotation darauf anwende. Anschliessend wird die Bewegung und die neue Rotation angewandt, was meiner Meinung nach so richtig sein müsste :S
    Ich hoffe ich habe alles nötige erklärt...
    Projekt "3567: Project Longshot": --> http://projectgames.de/longshot/ <--

  • #2
    Zitat von RononDex Beitrag anzeigen
    view = Matrix.CreateTranslation(currentPosition)
    * Matrix.CreateRotationX(currentRotation.X)
    * Matrix.CreateRotationY(currentRotation.Y)
    * Matrix.CreateRotationY(currentRotation.Z)
    * Matrix.CreateTranslation(moveVector)
    * Matrix.CreateRotationX(rotationVector.X)
    * Matrix.CreateRotationY(rotationVector.Y)
    * Matrix.CreateRotationY(rotationVector.Z)
    Kann es sein, dass du hier einfach einen Schreibfehler gemacht hast?
    "Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"

    Kommentar


    • #3
      Ooops, ja, ist ein Schreibfehler. Ich hatte das aus dem Kopf geschrieben, weil ich den Code gerade nicht zur Verfügung hatte...

      Hier nun Copy&Paste des relevanten Codes:
      Code:
                      view = Matrix.CreateTranslation(currentPosition)
                      * Matrix.CreateRotationX(this.currentRotation.X)
                      * Matrix.CreateRotationY(this.currentRotation.Y)
                      * Matrix.CreateRotationZ(this.currentRotation.Z);
                      view *= Matrix.CreateTranslation(moveVector)
                      * Matrix.CreateRotationX(this.rotationVector.X)
                      * Matrix.CreateRotationY(this.rotationVector.Y)
                      * Matrix.CreateRotationZ(this.rotationVector.Z);
      
                  currentPosition += moveVector;
                  currentRotation += rotationVector;
      
      
                  //reset internal variables
                  moveVector = Vector3.Zero;
                  rotationVector = Vector3.Zero;
      Projekt "3567: Project Longshot": --> http://projectgames.de/longshot/ <--

      Kommentar


      • #4
        Von Programmierung habe ich keine Ahnung aber folgende Überlegungen fallen mir ein.
        Die Position bezieht sich wohl auf einen Punkt bzw. auf eine oder mehrere Referenzebenen oder so was in der Art.
        Bewegst du die Kamera ohne die Richtung zu ändern, wird die Translation möglicherweise auf einem Richtungsvektor ausgeführt, wobei die rotatorische Bewegung auf einem weiteren Richtungsvektor baut, der in die Bewegungsrichtung parallel verschoben werden muss.

        Ein Körper hat im Raum 3 translatorische und 3 rotatorische Freiheitsgrade (Bewegungsmöglichkeiten). Um mal die 3 rotatorische Freiheitsgrade näher zu Erklären:
        1.F. Kopf nach rechts und links drehen.
        2.F. Kopf nach oben und unten drehen.
        3.F. Kopf zur Seite legen.

        Ob der 3. Freiheitsgrad gebraucht wird? Naja egal.

        Es scheint mir so, als ob dein Problem eher mit der Programmierung zusammenhängt und weniger mit Mathematik an sich.
        Loriot: Kraweel, kraweel. Taub-trüber Ginst am Musenhain, trüb-tauber Hain am Musenginst. Kraweel, kraweel.

        Kommentar


        • #5
          Danke für die Hilfe

          Du meinst also rein mathematisch (oder logisch) müsste es richtig sein? Denn ich kann da wirklich keinen Fehler finden :S

          Ich habe den Programmcode der Kamera mal genauer analysiert, es scheint als ob moveVector falsche Daten enthält, und zwar immer so, dass er sich immer genau auf derselben Achse bewegt. Sobald ich Zeit dazu habe, werde ich hier den Programmcode etwas genauer analysieren...

          Ob der 3. Freiheitsgrad gebraucht wird? Naja egal.
          Da ich an einem Weltraumsimulator programmiere, wird der sehr wohl gebraucht. Dieser "3. Freiheitsgrad" entpsricht ja dem Rollen, was bei einem Raumschiff sicher nicht fehlen darf
          Projekt "3567: Project Longshot": --> http://projectgames.de/longshot/ <--

          Kommentar


          • #6
            Ich gehe mal davon aus, dass es von mathematischer Seite richtig sein wird. Und wie gesagt, habe ich von Programmierung keine Ahnung.

            Aber warum steht da bei " view *= Matrix.CreateTranslation(moveVector)" nicht anstelle von Translation der Begriff Rotation?
            Loriot: Kraweel, kraweel. Taub-trüber Ginst am Musenhain, trüb-tauber Hain am Musenginst. Kraweel, kraweel.

            Kommentar


            • #7
              Ah moment, jetzt fällt es mir plötzlich wie Shuppen von den Augen!
              Ich frage mich, wieso ich das nicht schon früher gemerkt habe...

              Das Problem ist nicht der moveVector, sonder wie ich nachher die aktuelle Postion berechne:

              Code:
                          currentPosition += moveVector;
                          currentRotation += rotationVector;
              Und zwar berechne ich die neue Position (currentPosition) für den nächsten Frame ja, indem ich den alten Wert + den moveVector rechne (variable += ... ist dasselbe wie variable = variable + ...). Und wenn die aktuelle Position + gemachte Änderungen rechne, berücksichtige ich die Rotation ja nicht, somit bewegt sich die Kamera, als wäre sie nicht rotiert...
              Jetzt muss ich einen Weg finden, das zu umgehen...

              Aber warum steht da bei " view *= Matrix.CreateTranslation(moveVector)" nicht anstelle von Translation der Begriff Rotation?
              Der moveVector enthält ja die Bewegung, welche seit dem letzten Frame ausgeführt wurde. Wenn ich die Kamera nach vorne bewege steht dort drin z.b. X=0,Y=0,Z=33

              Nachdem ich die Kamera wieder an den aktuellen Ort bewegt habe, muss ich ja die gemachte Bewegung auch noch dazu rechnen... (ich hoffe, das ist so genug verständlich )
              Projekt "3567: Project Longshot": --> http://projectgames.de/longshot/ <--

              Kommentar

              Lädt...
              X