Wie kann ich Kraftvektoren aus Geschwindigkeitsvektoren ableiten?

7

Ich mache einen 2D-Shooter ala Geometry Wars. Ich habe meine eigene einfache Physik bei der Arbeit, die das Hintergrundraster und alle meine Entitäten steuert. Um irgendetwas auf der Welt zu bewegen, wende ich eine Vector2d-Kraft darauf an. Der 'Motor' berechnet die resultierende Beschleunigung und damit die Geschwindigkeit.

Ich versuche, einen Code zu portieren, den ich gefunden habe und der den klassischen 'Boids'-Beflockungsalgorithmus implementiert, aber der Code, den ich habe, berechnet die Geschwindigkeiten der Boids direkt. Wenn ich ihn so verwende, wie er ist, umgeht er meine Physik-Engine. Wie ich die Geschwindigkeitsvektoren in Kraftvektoren übersetzen kann, die ich auf die Boids anwenden kann und die über meine Physik-Engine zu den richtigen Geschwindigkeiten führen.

PixelRouter
quelle
2
Eine Frage zu Ihrer Frage: Können Ihre Körper theoretisch unendlich beschleunigen? Wenn ja, wenn der Algorithmus eine Entität anweist , ihre Geschwindigkeit von v0 auf v1 zu ändern , können Sie die Beschleunigung als a = ( v1 - v0 ) / dTime berechnen. Dann können Sie die Kraft F = m * a auf diese Entität und anwenden es wird diese Geschwindigkeit beim nächsten Zeitschritt haben. Aber es gibt noch ein anderes Problem: Welche Integrationsmethode verwenden Sie wirklich? Abhängig von Ihrer Aktualisierungslogik und Ihrem Integrator funktioniert dieser einfache Ansatz möglicherweise nicht. Ich nahm eine vereinfachte explizite Integratorlogik an (zB Euler).
Teodron
Wenn Sie Geschwindigkeit, Masse und Zeit haben: Kraft = (Masse * Geschwindigkeit) / Zeit.
Asakeron

Antworten:

6

Es hängt davon ab, wie Ihre Physik-Engine funktioniert, aber Sie können wahrscheinlich Newtons zweites Gesetz verwenden :

F = m × a

Wo mist die Masse des Objekts und aist seine Beschleunigung (ein Vektor). Die Beschleunigung ist die dv/dtAbleitung, die durch Teilen der Geschwindigkeitsänderung durch den Zeitschritt angenähert werden kann:

F = m × (velocity - previous_velocity) / timestep

Dies funktioniert natürlich nur dann zuverlässig, wenn nur die Kraft, die Sie anwenden, die Entität betrifft. Andernfalls können numerische Ungenauigkeiten auftreten.

Sam Hocevar
quelle
6
Seien Sie vorsichtig bei der Verwendung von × für 'Zeiten' - viele Leute werden das (verständlicherweise) als 'Kreuzprodukt' interpretieren ...
Steven Stadnicki