Die Konfiguration des Schiffes ändert sich dynamisch, sodass ich festlegen muss, welches Triebwerk eingeschaltet werden soll, wenn ich das Schiff im oder gegen den Uhrzeigersinn drehen möchte. Die Triebwerke sind immer in Achsrichtung zum Schiff ausgerichtet (niemals in einem Winkel) und entweder ein- oder ausgeschaltet. Hier ist eine der möglichen Einstellungen:
Bisher habe ich versucht, den Schussvektor und den Richtungsvektor zum Massenschwerpunkt des Schiffes zu visualisieren:
Damit bin ich leider nicht weit gekommen.
mathematics
physics
Migimunz
quelle
quelle
Antworten:
Erfolg! Hier ist es und es dreht sich so, wie es sollte:
Was ich getan habe, ist Folgendes: Für jedes Triebwerk berechne ich die Größe des Drehmoments in Bezug auf den Schwerpunkt.
Die Gleichung für die Mangitude des Drehmoments lautet laut Wikipedia
T = rF sin(theta)
:Wenn der Spieler nach links drückt, überprüfe ich das Vorzeichen des Drehmoments für dieses Triebwerk. Wenn es kleiner als Null ist, zünde ich das Triebwerk an. Beim Drehen im Uhrzeigersinn ist es genau umgekehrt.
Dies könnte möglicherweise verbessert werden, indem das Skalarprodukt zur Berechnung des Kosinus des Winkels zwischen den Vektoren verwendet wird. Dies muss jedoch bis morgen abgewartet werden.
Zum Schluss hier eine Live-Demo .
quelle
Der allgemeine Ausdruck für 3D - Drehmoment ist das Kreuzprodukt der Verschiebung und die Kraft: T = r ⨯ F . In zwei Dimensionen reicht ein skalarer Wert für das Drehmoment aus, und bei nur vier orthogonalen Ausrichtungen für die Triebwerke können wir stückweise schreiben:
Hier ist F die Größe der von den Triebwerken erzeugten Kraft, rx und ry sind x- und y-Komponenten des Vektors vom Drehpunkt zum Triebwerk. Positive Drehmomente neigen dazu, das Schiff gegen den Uhrzeigersinn zu drehen. Unter Verwendung der vier obigen Formeln ist es trivial, das Vorzeichen des Drehmoments abzuleiten, das jedes Triebwerk erzeugt.
Für eine bescheiden genaue Darstellung der Physik müssen Sie nicht nur das Vorzeichen des Schubes kennen, sondern auch seine Gesamtgröße und die Rotationsträgheit. Darüber hinaus möchten Sie möglicherweise nicht einfach alle ordnungsgemäß ausgerichteten Triebwerke aktivieren, um eine Drehung durchzuführen.
Wie gezeichnet, maximiert die volle Leistung der Triebwerke B, D und E die Rotation, beschleunigt aber auch das Schiff nach rechts. Das Herunterfahren von D verhindert dies. Wenn stattdessen nach rechts beschleunigt werden soll, eine Drehung im Uhrzeigersinn jedoch nicht, ist es am effizientesten, C und F mit zwei Dritteln der vollen Leistung zusammen mit D zu aktivieren.
Wenn dies nicht über den Rahmen dessen, was Sie versuchen, hinausgeht, müssten Sie eine Art Löser für die Bewegungsgleichungen schreiben, eindeutig keine einfache Aufgabe.
quelle
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 aufweistr*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
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).
quelle