Berechnung der Rotationskraft eines 2D-Sprites

35

Ich frage mich, ob jemand eine elegante Art hat, das folgende Szenario zu berechnen.

Ich habe ein Objekt mit einer (n) Anzahl von Quadraten, zufälligen Formen, aber wir werden so tun, als wären sie alle Rechtecke.

Wir haben es mit keiner Schwerkraft zu tun, also betrachten Sie das Objekt im Raum aus einer Perspektive von oben nach unten. Ich übe eine Kraft auf das Objekt an einem bestimmten Quadrat aus (siehe Abbildung unten).

Eine Kraft anwenden

Wie berechne ich den Drehwinkel basierend auf der ausgeübten Kraft an der ausgeübten Stelle? Wenn es in der Mitte des Quadrats angewendet würde, würde es gerade gehen. Wie soll es sich verhalten, je weiter ich mich vom Zentrum entferne? Wie berechne ich die Rotationsgeschwindigkeit?

jgallant
quelle
Was soll mit der Kraft durch die Zeit geschehen, wenn sich das Objekt dreht? Gilt das immer für dasselbe Quadrat in derselben Richtung? Fegt es am Rand des Objekts entlang? Mit den Informationen, die Sie geben, können Sie nur die entsprechende Rotationskraft (auch bekannt als Drehmoment) erhalten. Wenn Sie jedoch daraus eine Rotationsgeschwindigkeit ableiten möchten, müssen Sie entweder einen Impuls (anstelle einer Kraft) bereitstellen oder erklären, wie Die Kraft sollte im Laufe der Zeit angewendet werden.
Sam Hocevar
Ehrlich gesagt wäre dies wahrscheinlich eine bessere Frage für physics.stackexchange.com, da es sich ausschließlich um eine Frage der Grundmechanik handelt.
BlueRaja - Danny Pflughoeft

Antworten:

44

Sie versuchen das Drehmoment zu berechnen. Das Drehmoment hängt von der ausgeübten Kraft F, dem Angriffspunkt und dem Schwerpunkt des Objekts ab.

1) Schwerpunkt . Definieren Sie den Massenmittelpunkt des Objekts.

2) Punkt der Applikation : Definieren Sie den Punkt , an dem die Kraft wirkt.

3) Momentarm : Der Abstand zwischen den beiden oben definierten Punkten.

Point centerofMass
Point applicationPoint
Vector momentArm = applicationPoint - centerofMass

4) Winkelkraft : Teilen Sie Ihre Kraft F in zwei orthogonale Vektoren, einen parallel zur Linie in 3) und einen senkrecht. Die Parallelkomponente beeinflusst den Drehimpuls nicht. Das Senkrechte tut es. Sie können die Parallelkomponente durch Vektorprojektion berechnen. Sie können dies vom Original subtrahieren, um die senkrechte Komponente zu erhalten. Im Pseudocode ( dotbedeutet Skalarprodukt)

Vector myForce
Vector momentArm

parallelComponent = momentArm * (dot(myForce, momentArm) / dot(momentArm, momentArm))
angularForce = myForce - parallelComponent

5) Drehmoment : Die senkrechte Komponente der Kraft multipliziert mit der Länge des Momentarms.

Vector angularForce
Vector torque = angularForce * momentArm.Length

Um vom Drehmoment zur Winkelgeschwindigkeit zu gelangen:

1) Trägheitsmoment : Eine Definition, wie viel Rotationsträgheit ein bestimmtes Objekt hat. Zum Beispiel ist mehr Drehmoment erforderlich, um einen langen Stab zu drehen als eine Kugel derselben Masse. Wenn Sie sich keine Gedanken über den Realismus machen, können Sie so tun, als ob das Trägheitsmoment relativ zur Masse ist, oder Sie könnten die Form und Masse des Objekts vollständig ignorieren.

2) Winkelbeschleunigung :

Vector angularAcceleration = torque / momentOfInertia

3) Winkelgeschwindigkeit : Die Winkelgeschwindigkeit steigt so lange an, wie das Drehmoment aufgebracht wird. Eine Formel lautet also ungefähr "Winkelgeschwindigkeit zum Zeitpunkt T ist die kumulative Summe der Winkelbeschleunigung bis T ". Dies wird im Pseudocode ausgedrückt als

void Update(float elapsedSeconds):
    orientation += 0.5 * angularVelocity * elapsedSeconds;
    angularVelocity += angularAcceleration * elapsedSeconds;
    orientation += 0.5 * angularVelocity * elapsedSeconds;
Jimmy
quelle
Tolle Informationen, aber der Teil, mit dem ich am unklarsten bin, ist, wie man bestimmt, wie hoch die Drehmomentkraft sein soll. Ich habe alle Komponenten vorhanden, wie Sie beschrieben haben.
Jgallant
@ Jon: Sie haben die Komponenten, dh Sie haben die Schritte 1 - 3 und können nicht herausfinden, wie Sie Schritt 4 berechnen? Das ist in erster Linie der schwierige Schritt. Ich werde dort ein bisschen mehr Details hinzufügen.
Jimmy
3
Die Orientierung als kumulative Summe der Winkelgeschwindigkeit orientation += angularVelocity * elapsedSecondsist falsch, da sie die Geschwindigkeit über den Zeitschritt überschätzt, was bedeutet, dass unterschiedliche Frameraten unterschiedliche Orientierungen ergeben. Eine richtige Formel wäre: float oldVelocity = angularVelocity; angularVelocity += angularAcceleration * elapsedSeconds; orientation += 0.5f * (angularVelocity + oldVelocity) * elapsedSeconds;. Da es keine Schwerkraft gibt, empfehle ich stattdessen die Verwendung des Schwerpunkts. +1 für die sehr gute Erklärung.
Sam Hocevar
1
Ein Teil der senkrechten Kraft bewirkt eine Beschleunigung des Massenschwerpunkts. Wenn die Kraft näher an den Massenschwerpunkt angelegt wird, nimmt dieser Faktor zu. Die Antwort ist gut und sehr klar, aber in dieser Hinsicht scheint sie unvollständig zu sein.
Sam Watkins
Um meinen eigenen Kommentar zu beantworten, lese ich Chris Heckers Artikel über Physik: chrishecker.com/Rigid_body_dynamics . Es stellt sich heraus, dass eine Kraft oder ein Impuls an einem beliebigen Punkt die bekannte Wirkung auf den Massenschwerpunkt nach F = ma oder a2 = a1 + p hat, als ob sich der Körper nicht drehen könnte. Dies folgt aus dem Gesetz der Erhaltung des linearen Impulses. Die Komponente der Kraft senkrecht zum Radius verursacht auch ein Drehmoment und eine Änderung des Drehimpulses, wie in Jimmys Antwort beschrieben.
Sam Watkins
7

Wenn die Kräfte nicht zu stark sind, ist es viel einfacher, die Drehung mit mehreren Punkten und Federn zu simulieren, die sie verbinden. In diesem Fall nehmen Sie einfach an, dass Ihre Form aus mehreren Punkten besteht, die durch Federn verbunden sind. Jeder Punkt repräsentiert die Masse und alles andere in der Form hat eine Masse von Null.

Frühling & Punkte

im obigen Bild stehen schwarze Punkte für Massen und rote Linien für Federn. Um die Kraft anzuwenden, müssen Sie sie nur auf den nächsten Punkt anwenden, und Sie werden sehen, dass sich Ihr Objekt nach Ihren Wünschen dreht. Um Ihre Form wie eine feste Struktur aussehen zu lassen, ist es besser, Federn mit einem hohen Dämpfungswert und einem hohen k-Wert zu definieren.

Ali1S232
quelle