Rotation einer Kugel

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Rotation einer Kugel

    Ich hab mich in den letzten Monaten mit C++ und DirectX beschäftigt und versuche jetzt mein erstes Spiel zu programmieren.
    In diesem Spiel kann man die Spielfläche durch Bewegen der Maus kippen. Eine Kugel rollt dann die Schräge herunter.
    Mein Problem ist jetzt die Rotation, also das Rollen, der Kugel.
    Ich habe als erstes versucht, einfach den Hspeed bzw. Vspeed der Kugel zur horizontalen bzw. vertikalen Rotation hinzuzuaddieren. Dann "eiert" die Kugel aber durch die Gegend, weil die Achsen mitgedreht werden.

    Quellcode

    1. //Nach jeder Kugel-Bewegung:
    2. ball.rotx += ball.GetX()-ball.xprev;
    3. ball.roty += ball.GetY()-ball.yprev;
    4. //Vor dem Zeichnen der Kugel:
    5. D3DXMatrixRotationX(&matRotateY, ball.rotx);
    6. D3DXMatrixRotationY(&matRotateX, ball.roty);

    Dann habe ich die Kugel einfach um Hspeed+Vspeed rotiert, und danach in die richtige Richtung gedreht. Dann rollt die Kugel aber nicht einfach in die richtige Richtung, sonder "lenkt" mit. Die Textur zeigt also immer in die Roll-Richtung.

    Hat jemand eine Idee, wie man das Umsetzen könnte?

    "Is this one sloshing?"
    Four words you don't want to hear when you pick up a coffin...
  • Ich kenne mich zwar nicht mit DirectX aus, aber Rotationen von Objekten im dreidimensionalen Raum, also auch insbesondere die einer Kugel, kann man sehr gut mit Matrizen beschreiben. Und zwar mit einer orthogonalen 3x3 Matrix, d.h. die Spaltenvektoren stehen senkrecht aufeinander und haben die Länge 1. Dann gibt es sogenannte Drehmatrizen, die eine Rotation eines Objektes beschreiben, z.b. die Rotation um eine Achse (wikipedia). Wenn z.b. die Matrix A die Rotationsmatrix deiner Kugel ist und du willst sie um eine bestimmte Achse um einen bestimmten Winkel drehen, dann erstellst du zunächst die entsprechende Drehmatrix B wie es auf Wikipedia beschrieben ist und multiplizierst sie auf die Matrix A. Die resultierende Matrix ist dann dein "neues A", also die neue Rotation deiner Kugel.

    Da ich mich wie gesagt nicht mit DirectX auskenne, weiß ich nicht, ob es Drehmatrizen unterstützt, aber ich gehe mal davon aus, denn die Funktion "D3DXMatrixRotationX", die du in deinem Code verwendest, sollte genau so eine Drehmatrix erzeugen. Am besten suchst du mal im Internet nach sowas. Grundlegendes Verständnis von Matrizen solltest du übrigens besitzen damit du weißt, was du tust. ;)
  • Danke erstmal!

    Bl@ckSp@rk:
    Das ich Matrizen verwenden muss, ist mir schon klar. Die Funktion D3DXMatrixRotationX weist einer Matrix ja die entsprechenden Werte zu. (In diesem Fall habe ich einfach versucht, die Geschwindigkeitswerte der Matrix zuzuweisen)
    Aber ich weiß eben nicht, was ich der Matrix zuweisen soll, damit sie richtig rollt und nicht "eiert" oder "lenkt".

    maxda:
    Wenn ich einfach nur den Speed zuweise, dann rollt die Kugel ja nicht, sondern bleibt bei gleichbleibender Geschwindigkeit immer im selben Winkel gedreht...(oder was meinst du?)

    Wahrscheinlich ist es ganz einfach...Ich krieg's nur irgendwie nicht hin...

    "Is this one sloshing?"
    Four words you don't want to hear when you pick up a coffin...
  • Ich nehme mal an D3DXMatrixRotationX erzeugt eine Drehmatrix um die x-Achse. Dass du aber die Kugel nur um die x-Achse drehen musst ist eher selten der Fall, nämlich nur, wenn sich die Kugel parallel zur x-Achse bewegt.

    Ich wills mal am Beispiel erklären, dass eine Kugel mit Radius r auf der xy-Ebene rollt. Dabei sei (vx,vy) der Geschwindigkeitsvektor der Kugel und v dessen Länge. Zunächst muss man sich überlegen, um welchen Winkel sich die Kugel dreht, wenn sie sich einen Schritt nach (vx,vy) bewegt. Das ist der Winkel a = v/r im Bogenmaß. Jetzt brauchen wir noch die Achse, um die sich die Kugel in der Bewegung dreht. Diese muss offensichtlich senkrecht zu (vx,vy) liegen, also (vy,-vx). Wenn du ihn noch normieren musst, einfach noch durch v teilen. Und damit hast du nun alles was du brauchst um die Drehmatrix nach wikipedia zu bestimmen. Der Vektor (v1,v2,v3) der dort genannt wird, ist also (vy/v,-vx/v,0) und das Alpha ist der Winkel a den ich oben angegeben hab.

    Was das programmieren angeht muss du jetzt selber klar kommen, da kann ich dir wie gesagt nicht helfen.
  • Ich glaube, das hat mir jetzt den richtigen Denkanstoß gegeben...
    Ich probier mal ein bisschen rum und versuch den Wikipedia-Artikel richtig zu verstehen.
    Erstmal ist das dann erledigt, ansonsten melde ich mich noch mal.

    Danke euch beiden!

    "Is this one sloshing?"
    Four words you don't want to hear when you pick up a coffin...