Ein paar verschiedene Dinge. Zunächst müssen wir erkennen, dass dies ein unterbeschränktes Problem ist. Das heißt, es gibt viele verschiedene Kombinationen von Triebwerken, die zünden können, um eine Drehung in die gleiche Richtung zu bewirken. Ich gehe davon aus, dass in Ihrer Situation nur zwei Zustände für die Triebwerke "Ein" und "Aus" vorliegen und alle Triebwerke die gleiche Kraft abgeben.
Zweitens sieht es so aus, als wäre Ihr "Massenmittelpunkt" nicht Ihr eigentlicher Massenmittelpunkt. Glücklicherweise hat dies keine Auswirkungen auf Ihre Berechnungen für das Drehmoment. Es wird jedoch Ihre Berechnungen für die Verschiebung des Massenschwerpunkts beeinflussen. Ich bin mir nicht sicher, ob Ihnen die Genauigkeit auf dieser Ebene wichtig ist, da Ihr "Massenmittelpunkt" mindestens das Quadrat ist, das dem wahren Massenmittelpunkt am nächsten liegt.
Drittens, wenn Sie berechnen möchten, wie sich ein bestimmtes Triebwerk auf die Rotation auswirkt, haben Sie es richtig gemacht, obwohl Sie eine ineffiziente Formel verwenden. Das Drehmoment kann wie folgt berechnet werden r x F
, welche Größe aufweist r*F*sin(theta)
. Die Berechnung der Winkel ist in diesem Fall jedoch eine ineffiziente Methode. Stattdessen sollten Sie die produktübergreifende Definition des Drehmoments direkt verwenden, da dies mit den von Ihnen verwendeten Darstellungen viel einfacher ist. Da alle Ihre Vektoren keine z-Komponente haben, vereinfacht sich die Formel für das Kreuzprodukt erheblich.
Ohne die Ergebnisse Ihrer Berechnung zu ändern, können wir einfach Ihren Code aktualisieren
private function thrustTorque():Float
{
var torque = distToCOM.x*dir.y-distToCOM.y*dir.x;
return torque;
}
Das ist viel schöner (und schneller).
Sie schlagen in Ihrer eigenen Antwort vor, dass Ihre Lösung darin besteht, alle Triebwerke mit Drehmoment in die richtige Richtung zu zünden. Nun, das löst so ziemlich die Frage, die Sie gestellt haben. Ich gehe jedoch davon aus, dass Sie irgendwann auf der ganzen Linie feststellen werden, dass Ihre Strategie nicht mehr so zufriedenstellend ist, wenn ein Benutzer die Taste "Drehen" gedrückt hält und alle Triebwerke mit positivem Drehmoment sich drehen und sie möglicherweise nach oben bewegen (Ich bin mir nicht sicher, wie detailliert Ihre Simulation ist, ob Sie die Kräfte aus den Triebwerken tatsächlich berechnen oder ob Sie sie nur visuell abfeuern lassen und dann Ihr Modell mit einer konstanten Beschleunigung oder etwas anderem drehen.) Art und Weise möchten Sie, dass die Triebwerke zumindest annähernd genau schießen).
Sie berücksichtigen die Nettokraft auf dem Schiff nicht. Wenn Sie beliebige Triebwerksmengen hätten, könnte dies zu einem ziemlich komplizierten Problem werden. Da unsere Triebwerke jedoch nur zwei Zustände haben, ist die Analyse ziemlich einfach. Ich bin mir nicht sicher, was genau unser Ziel ist, also könnte ich mir zwei verschiedene vorstellen: Erstens möchten wir die Gesamtkraft minimieren und gleichzeitig das Drehmoment in der gewünschten Richtung halten. Zweitens möchten wir das Verhältnis von Drehmoment zu Gesamtkraft maximieren.
Wenn Sie sich außerdem einen zusätzlichen "Thruster Volume" -Regler vorstellen könnten, der die Leistung aller Thruster gleichzeitig beeinflusst, könnten Sie diesen Regler so einstellen, dass Ihre beiden Lösungen das gleiche Drehmoment haben, und Sie sehen, dass die zweite Lösung nur a haben kann kleinerer Hubraum als der erste. Wir müssen uns jedoch daran erinnern, dass beide Lösungen gleich sind, wenn es möglich ist, die Triebwerke so abzufeuern, dass Sie sich nur drehen und überhaupt nicht bewegen.
Wir werden also mit der zweiten Lösung fortfahren, die auf den Argumenten des vorherigen Absatzes basiert. Wenn wir nun die Gesamtkraft analysieren, können wir einfach feststellen, dass es nur vier Richtungen gibt, in die die Motoren zeigen können. Die Gesamtkraft in x-Richtung ist also genau die Anzahl der nach links weisenden Triebwerke minus der nach rechts weisenden Anzahl und ebenfalls für die y-Richtung.
Nachdem ich dies geschrieben habe, muss ich noch etwas über den Algorithmus nachdenken, um ihn zu optimieren. Ich denke, der Rest meines Beitrags ist hilfreich, also poste ich ihn, aber ich werde ihn aktualisieren, sobald ich herausgefunden habe, wie diese Konfiguration am besten optimiert werden kann keine von ihnen ist genau).