Ich gehe davon aus, dass Sie eine physikalisch korrekte Bewegung für Ihr Schiff haben, da diese Analyse sonst nicht gültig ist. Sie benötigen etwas Stärkeres als Effizienz, um dieses Problem richtig zu lösen.
Jedes Triebwerk hat zwei Auswirkungen auf die Schiffsbewegung: linear und winklig. Diese können unabhängig voneinander betrachtet werden. Wenn das Triebwerk eine Kraft f
in einer Richtung erzeugt dir
und vom Massenmittelpunkt um einen Vektor versetzt ist r
(nicht um den geometrischen Mittelpunkt oder den Mittelpunkt des Sprites!), Hat dies folgende Auswirkungen auf die lineare Komponente:
t = f * dir // f is a scalar, dir is unit length
Die Auswirkung auf die Winkelgeschwindigkeit ergibt sich aus dem Drehmoment:
tau = f * <dir.x, dir.y, 0> CROSS <r.x, r.y, 0> // cross product
t
ist ein Kraftvektor (dh der lineare Schub). tau
ist ein vorzeichenbehafteter Skalar, der, geteilt durch das Massenträgheitsmoment, die Winkelbeschleunigung ergibt. Es ist wichtig, dass dir
und r
sich beide im selben Koordinatenraum befinden, dh beide in lokalen Koordinaten oder beide in Weltkoordinaten.
Die Gesamtlinearbeschleunigung des Schiffes ergibt sich aus der Summe der t
s für jedes Triebwerk geteilt durch die Schiffsmasse. In ähnlicher Weise ist die Winkelbeschleunigung nur die Summe der Drehmomente geteilt durch das Massenträgheitsmoment (das ein anderer Skalar ist). Das Schiff dreht sich nicht, wenn das Gesamtdrehmoment Null ist. Ebenso bewegt es sich nicht, wenn der Gesamtschub Null ist. Das Rückrufdrehmoment ist ein Skalar, aber der Schub (die Summe der t
) ist ein 2D-Vektor.
Der Punkt dieser Darstellung ist, dass wir jetzt unser Problem als lineares Programm schreiben können . Sagen Sie zuerst, wir möchten, dass sich unser Schiff dreht, ohne sich zu bewegen . Wir haben eine Variable für jedes Triebwerk: $ x_1, x_2, ... $. Dies ist die Menge an Schub, die das Triebwerk liefert. Eine Reihe von Einschränkungen ist:
0 <= x_i < fmax_i //for each i
wo fmax
ist die maximale Kraft für dieses Triebwerk (dies lässt uns stärkere oder schwächere haben). Als nächstes sagen wir, dass beide Gleichungen:
0 = Sum_i x_i * dir_i.x
0 = Sum_i x_i * dir_i.y
Dies kodiert die Einschränkung, dass wir keine lineare Beschleunigung anwenden, indem wir sagen, dass der Gesamtschub Null ist (Schub ist ein Vektor, also sagen wir einfach, dass jeder Teil Null ist).
Jetzt wollen wir, dass sich unser Schiff dreht. Vermutlich wollen wir das so schnell wie möglich tun, also wollen wir:
max (Sum_i x_i * c_i)
where c_i = <dir_i.x, dir_i.y, 0> CROSS <r_i.x, r_i.y, 0>
Das Lösen nach dem x_i
, während die obigen Ungleichungen und Gleichungen erfüllt werden, während die obige Summe maximiert wird, gibt uns den gewünschten Schub. Die meisten Programmiersprachen verfügen über eine LP-Bibliothek. Fügen Sie einfach das obige Problem ein und es wird Ihre Antwort hervorbringen.
Ein ähnliches Problem wird uns bewegen lassen, ohne uns umzudrehen. Nehmen wir an, wir schreiben unser Problem in ein Koordinatensystem, in dem wir uns in die positive x-Richtung bewegen wollen. Dann sind die Einschränkungen:
0 <= x_i < fmax_i //for each i
max Sum_i x_i * dir_i.x
0 = Sum_i x_i * dir_i.y
0 = (Sum_i x_i * c_i)
where c_i = <dir_i.x, dir_i.y, 0> CROSS <r_i.x, r_i.y, 0> // as before
Mit der Einschränkung, dass die Triebwerke nur Schub in einer einzigen Richtung erzeugen können, sind der Art der Rotationen und linearen Geschwindigkeiten, die Sie erreichen können, Grenzen gesetzt. Dies wird sich als die Lösung manifestieren 0 = x_1 = x_2 = ... = x_n
, was bedeutet, dass Sie niemals irgendwo hinkommen werden. Um dies zu mildern, schlage ich vor, ein Paar kleiner, schwacher (etwa 5% oder 10%) Triebwerke für jeden Spieler hinzuzufügen, der das Triebwerk auf beiden Seiten in einem Winkel von 45 Grad platziert. Dies gibt der Lösung mehr Flexibilität, da diese verwendet werden können, um schwachen Sekundäreffekten der Hauptantriebe entgegenzuwirken.
Für bis zu 100 Thruster ist die Lösung für die LP schnell genug, um pro Frame durchgeführt zu werden. Da die Lösung jedoch nicht vom Standort oder dem aktuellen Status abhängt, können Sie die Lösung für jede sinnvolle Controller-Eingabekombination vorberechnen, wenn sich die Form ändert (dies schließt das Hinzufügen von Nicht-Triebwerken ein, die das Trägheitsmoment oder die Masse des Schiffes ändern). denn dann befinden sich die Triebwerke relativ zum Massenmittelpunkt an einer anderen Stelle!). Dies sind 24 Möglichkeiten (dh 8 Richtungen mal (Linkslauf, keine Drehung, Rechtslauf)).