Hi, ich bin gerade dabei eine kleine Bewegungsroutine zu basteln. Dabei soll eine Kugel (Sphere) von oben Betrachtet (d.h. die Z-Achse lass ich erst mal aus dem Spiel) sich in Richtung der Mauskoordinaten bewegen. Ich benutze dafür Java (Jogl). Soweit erst mal kein Problem. Jetzt soll allerdings noch ein Wendekreis hinzukommen. Mathematisch gesehen ist das kein Problem allerdings weiß ich einfach nicht wie ich das in opengl umsetze. Mein Denkansatz war (vielleicht lieg ich auch total falsch ) das ich zum einen den Vektor vom Ursprung der Kugel zu den Mauskoordinaten brauche und den Vektor der der Y-Achse von der Kugel weg entspricht. Der Winkel zwischen den beiden Vektoren wäre also mein Rotationswinkel. Dann würde ich einfach glRotate vor glTranslate aufrufen und die Kugel nur in Y-Achsen Richtung bewegen. Wie ich allerdings auf die Vektoren komme bleibt mir ein Rätsel :/
Mir ist leider nicht ganz klar was du mit "Wendekreis" meinst. Könntest du vielleicht kurz ein Bildchen malen z.B. mit der Kugel, dem Cursor und dem Pfad dem die Kugel jetzt folgen soll.
So, hab endlich mal die Zeit gefunden eine Skizze dazu anzufertigen. Hoffe der Sachverhalt wird dadurch klarer Wie gesagt, die Mathematik dahinter ist nicht das Problem, sondern wie ich in openGL auf die Vektoren komme bzw. wie man das Problem sonst angehen könnte.
viele Grüße
EDIT: Sehe auch gerade dass das vielleicht besser in das Forum für Einsteiger Fragen passt.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Also bei einer Kugel ist es üblicherweise egal wie diese rotiert ist, da sie von jeder Seite gleich aussieht. Ich vermute aber mal du hast da irgendeine Textur drauf oder so. In jedem Fall hat das Problem meiner Meinung nach mit OpenGL nicht viel zu tun.
Die Kugel hat eine Position kugel.x bzw. kugel.y, sowie eine Rotation dargestellt durch einen Winkel kugel.angle. Rendern kannst du dies in dem du zuerst mit glRotatef entsprechend dem Winkel rotierst und dann anschließend mit glTranslate an die richtige Stelle schiebst. Es gilt also letztlich nur immer Position und Winkel der Kugel zu aktualisieren. Es gibt da sicher viele Möglichkeiten, aber ich erzähle mal was ich spontan versuchen würde. Im folgenden ist timeElapsed die Zeit in Sekunden die seit dem letzten Frame vergangen ist, also bei 100 fps wäre das 1/100.
Die Kugel bewegt sich in jedem Schritt immer vorwärts. Der Winkel sagt aus wo gerade vorne ist. Den Winkel 0 definiere ich mal als "oben", also in Richtung positiver Y-Achse.
Die Geschwindigkeit speed kann entweder eine Konstante sein oder du berechnest das irgendwie aus der Entfernung zum Cursor.
Zusätzlich muss in jedem Schritt der Winkel angepasst werden. Dazu berechnest du erstmal den Winkel zum Cursor:
Code:
vec.x := cursor.x - kugel.x; // das ist dein Vektor2 vec.y := cursor.y - kugel.y; cursor.angle := arctan2(vec.x, vec.y);
Und nun passt du den Winkel der Kugel in jedem Schritt langsam an den Cursor an. Bei meiner Umsetzung hier dreht sich die Kugel um so schneller je größer die Winkeldifferenz ist.
Code:
change := cursor.angle - kugel.angle; if change > 180 then change := change-360; // kürzere Drehrichtung wählen kugel.angle := kugel.angle + timeElapsed * speed * change; if kugel.angle < 0 then kugel.angle := kugel.angle + 360; if kugel.angle >= 360 then kugel.angle := kugel.angle - 360;
Du musst ggf. aufpassen das sin/cos/arctan2 die Winkel nicht in Grad sondern im Bogenmaß verwenden. (bin kein Delphianer )
Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.