Verschieben eines Objekts entlang einer Kurve beim Drehen

11

Ich möchte ein Objekt entlang einer Kurve bewegen . An bestimmten Punkten der Kurve möchte ich, dass das Objekt die Geschwindigkeit ändert und sich entlang seiner Achse dreht.

Stellen Sie sich ein Flugzeug vor, das zu einem Ziel fliegt. Es hat seinen Weg, dem es folgen muss, und es passt seine Geschwindigkeit und Ausrichtung vollständig an (Richtung, Mark, Bank).

Könnte ich bitte um eine Startinformation zu folgenden Themen bitten :

  • Welche Art von Kurven soll verwendet werden, um ein Objekt reibungslos zu interpolieren ?
  • Welche Formeln für eine zuverlässige Interpolation verwendet werden sollten, bei der ich die Geschwindigkeit des sich bewegenden Objekts und den Übergang zwischen Kurvenknoten steuern könnte, wäre nahtlos
  • Welche Informationen sollten aus einer 3D-Authoring-Anwendung exportiert werden ?
  • Soll ich dafür quaternions slerp () verwenden ?

Wenn Sie über ein Buch Bescheid wissen , das dieses Thema effizient behandelt , wäre dies am hilfreichsten. Vielen Dank.

Bunkai.Satori
quelle

Antworten:

7

Für die Bewegungskurve würde ich die Verwendung von Hermite-Kurven vorschlagen. Sie geben einfach einen Startpunkt / eine Startgeschwindigkeit und einen Endpunkt / eine Endgeschwindigkeit an und es entsteht eine schöne und glatte Kurve zwischen diesen beiden. Verwenden Sie den Endpunkt / die Geschwindigkeit des ersten Punktepaars als Startpunkt / Geschwindigkeit des nächsten Punktepaars, und Sie haben eine schöne lange und kurvenreiche Kurve, die nahtlos ist.

Dies ist perfekt für die Anforderung, die Geschwindigkeit zu verwalten: Sie geben eine Liste von Zeitpunkten mit von Ihnen gewählten Geschwindigkeiten an und erhalten die nahtlos interpolierten Positions- und Geschwindigkeitswerte. Wenn Sie dies tun möchten, müssen Sie lediglich Punkte und Geschwindigkeiten auf dem gewünschten Pfad aus der 3D-Authoring-Anwendung extrahieren. Sie können sie auch zur Laufzeit generieren, möglicherweise basierend auf Benutzereingaben.

Um die Ausrichtung anzupassen, haben Sie eine Reihe von Optionen. Wenn das Flugzeug immer darauf zeigt, wohin es fliegt (was sinnvoll ist), können Sie den interpolierten Geschwindigkeitsvektor aus der Hermite-Kurve verwenden, um herauszufinden, wohin Ihr Schiff zeigen soll. Wenn Sie den Aufwärtsvektor kennen (er bewegt sich in einer Ebene oder Sie wissen, welche Richtung nach oben gerichtet sein soll), können Sie die dritte Achse durch Kreuzen (vorne, oben) berechnen und dort haben Sie Ihre Ausrichtung.

Wenn Sie eine irgendwie "wackelige" Ausrichtung wünschen, so dass die Ebene manchmal von der vorderen Richtung im Pfad abweicht, können Sie die vordere Richtung als gewünschte Richtung verwenden und nacheinander einen Schritt zwischen der aktuellen Ausrichtung und der gewünschten Ausrichtung wechseln.

Wenn Sie benutzerdefinierte Orientierungen wünschen, die nichts mit dem Pfad zu tun haben, können Sie hierzu natürlich eine Liste von Orientierungsquaternionen bereitstellen. Dann werden Ihre Punkte (Punkt, Geschwindigkeit, Quaternion). Dann können Sie Slerp zwischen zwei aufeinanderfolgenden Quaternionen verwenden, um Ihre Orientierungen auf dem Weg festzulegen. Vergessen Sie nicht, dass Slerp eine lineare Interpolationsmethode ist. Es sollte jedoch normalerweise in Ordnung sein. Wenn Sie feststellen, dass die Rotationen in den Nähten nicht glatt genug sind, können Sie versuchen, die Liste der Quaternionen mit einer Bezier-Kurve zu interpolieren, wie hier in Abschnitt 7 erläutert .

Hier ist ein Quellcode, der Ihnen den Einstieg erleichtern kann. Es verfügt über eine Reihe von reibungslosen Interpolationstechniken für eine Liste von Quaternionen (Squad, Bezier usw.).

Lassen Sie mich wissen, wenn Sie Fragen haben!

Gazihan Alankus
quelle
+1 - Danke, Ihre Antwort deckt im Grunde alles ab. Es beantwortet jede Frage, die ich gestellt habe, und Sie stellen weiteres Material zum Lernen zur Verfügung. Jetzt habe ich genug Material, um damit zu beginnen. Daher sehe ich keinen Grund, dies nicht als akzeptierte Antwort zu markieren .
Bunkai.Satori
@ Bunkai.Satori danke, ich bin froh, Ihnen helfen zu können :) Ich würde gerne sehen, was Sie am Ende erstellen.
Gazihan Alankus