Geschwindigkeit der quadratischen Kurve

9

Ich schreibe ein 2D-Spiel und ich habe Vögel in einem Kameraraum. Ich möchte sie zum Fliegen bringen. Also erzeuge ich 3 ~ zufällige Punkte. Die erste ist links oben, die zweite: Mitte-unten, die dritte: rechts-oben.

Als Ergebnis habe ich ein 180 Grad gedrehtes Dreieck.

Um einen Vogel durch den Weg der Kurve zu bewegen, habe ich einen t-Parameter, der in jedem Bild (Render-Schleife) um ein Delta erhöht wird.

Das Problem ist, dass Vögel in verschiedenen Kurven unterschiedliche Geschwindigkeiten haben. Wenn das Dreieck "breit" ist ( 1 ), sind sie langsamer, wenn es um die Y-Koordinate gestreckt wird ( 2 ), ist die Geschwindigkeit sehr hoch.

Aber ich möchte die Geschwindigkeit bei verschiedenen Kurven gleich machen. Es ist logisch, dass ich delta ändern muss, das jedem Rahmen für jede Kurve hinzugefügt wird.

Ich habe versucht, es so zu lösen:

Finden Sie die ~ Länge der Kurve, indem Sie die Länge von 2 Vektoren addieren: P1P2 und P2P3 .

Dann habe ich die Geschwindigkeit für 1 virtuellen Meter pro Frame definiert. Ein kleiner Pseudocode:

%Vor%

Aber Vögel haben sowieso eine andere Geschwindigkeit. Was ist los mit dir? Oder vielleicht gibt es einen besseren Weg.

    
Ockonal 09.02.2013, 19:49
quelle

1 Antwort

2

Die von Ihnen verwendete Bezier-Funktion ist eine parametrisierte Funktion mit Grenzen [0 ... 1]. Sie meckern mit der Schrittgröße, weshalb Sie verrückte Geschwindigkeiten bekommen. Im Allgemeinen ist der Abstand d die abhängige Variable in der Gleichung, die mir sagt, dass ihre Geschwindigkeiten basierend auf der Länge der Kurve unterschiedlich sein werden.

Da Geschwindigkeit Ihre abhängige Variable ist, werden wir Ihre Funktion durch Berechnen der Schrittgröße vektorisieren.

Sieh dir diesen Pseudocode an:

P1 = (x1, y1)

P2 = (x2, y2)

P3 = (x3, y3)

%Vor%

Sie können die Delta-Werte erhalten, indem Sie einen ersten Unterschied machen, aber ich denke nicht, dass das notwendig ist. Solange Sie alle Vögel entsprechend der Schritt Iteration in die richtige Entfernung bewegen, werden sie alle unterschiedliche Entfernungen zurücklegen, aber sie werden ihre Flugbahnen identisch beginnen und beenden.

Aus Ihrer Gleichung können wir die Pixel-Delta-Schrittgröße berechnen:

%Vor%

Damit erhalten Sie die entsprechende Pixelanzahl, um den Vogel zu bewegen. Auf diese Weise werden sie alle unterschiedliche Schrittweiten bewegen, aber ihre Geschwindigkeiten werden unterschiedlich sein. Macht das Sinn?

Oder versuchen Sie etwas ähnliches (viel schwieriger):

  1. Erhalte die tatsächliche quadratische Funktion der drei von dir gewählten Punkte.
  2. Integriere die Quadrate zwischen zwei xy rechteckigen Koordinaten
  3. Berechne die berechnete Länge in Pixel oder was auch immer du verwendest
  4. Erhalten Sie die Geschwindigkeit der abhängigen Variablen, damit alle Kurven gleichzeitig enden.

Beginnen wir mit quadratischen Sachen:

y = Ax^2 + Bx + C wo A != 0 , da Sie also drei Punkte haben, benötigen Sie drei Gleichungen. Mit Algebra können Sie für die contants lösen:

A = (y3 - y2)/((x3 - x2)(x3 - x1)) - (y1 - y2)/((x1 - x2)(x3 - x1))

B = (y1 - y2 + A(x2^2 - x1^2))/(x1 - x2)

C = y1 - Ax1^2 - Bx1

Dann können Sie die obige Formel verwenden, um eine geschlossene Bogenlänge zu erhalten. Überprüfen Sie diese Website, Wolfram wird es für Sie integrieren und Sie müssen es nur eingeben:

Geschlossenes Formular Lösung für die quadradische Integration

Nachdem Sie die Bogenlänge berechnet haben, konvertieren Sie actualArcLength in die Geschwindigkeit oder die von Ihnen verwendete Einheit:

%Vor%     
Tyler Jandreau 09.02.2013, 21:00
quelle

Tags und Links