Wie bestimme ich, welche Triebwerke eingeschaltet werden müssen, um das Schiff zu drehen?

47

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:

http://i.stack.imgur.com/GSBSH.png

Bisher habe ich versucht, den Schussvektor und den Richtungsvektor zum Massenschwerpunkt des Schiffes zu visualisieren:

http://i.stack.imgur.com/ZzNzi.png

Damit bin ich leider nicht weit gekommen.

Migimunz
quelle
7
Mit Kraftvektoren steuern Sie in die richtige Richtung. Versuchen Sie, Formeln für die Winkelgeschwindigkeit nachzuschlagen, da Sie versuchen, das Schiff um den Massenmittelpunkt zu drehen.
Amplify91
Ich vergesse , wie genau es zu tun, aber im Grunde nur seine Kräfte an jedem Punkt en.wikipedia.org/wiki/Center_of_mass und besonders en.wikipedia.org/wiki/Parallel_axis_theorem
CobaltHex
1
Ich hatte genau die gleiche Idee! Ein Tipp, der es Ihnen möglicherweise einfacher macht, ist, dass Sie die Winkel- und Linearbeschleunigung für jedes Triebwerk nur einmal berechnen müssen, sodass die Berechnungen möglicherweise so komplex sind, wie Sie möchten.
Markus von Broady
@ Amplify91, Ihr Kommentar hat mir geholfen, es herauszufinden, danke!
Migimunz
1
@migimunz Ich dachte eher an die Berechnung der Beschleunigungen pro Triebwerk, nicht pro gedrückter Taste (Triebwerksgruppe). Es könnte auch interessant sein, dem Spieler die Wahl zu geben, welche Triebwerke bei welchem ​​Tastendruck aktiviert werden sollen (manche Leute tauschen schnelleres Drehen gegen Drehen an Ort und Stelle)
Markus von Broady,

Antworten:

22

Erfolg! Hier ist es und es dreht sich so, wie es sollte: Bildbeschreibung hier eingeben

Was ich getan habe, ist Folgendes: Für jedes Triebwerk berechne ich die Größe des Drehmoments in Bezug auf den Schwerpunkt.

private function thrustTorque():Float
{
    // distToCom is the distance vector between the thruster and center of mass
    // fire angle is a unit vector representing the direction of the thruster
    var distAngle = Math.atan2(distToCOM.y, distToCOM.x);
    var fireAngle = Math.atan2(dir.y, dir.x);
    var theta = fireAngle - distAngle;
    var torque = distToCOM.length * Math.sin(theta);
    return torque;
}

Die Gleichung für die Mangitude des Drehmoments lautet laut Wikipedia T = rF sin(theta):

  • r ist der Abstand zwischen dem Triebwerk und COM
  • F ist die Größe der ausgeübten Kraft (ich lasse das weg und tue so, als wäre es nur eine, weil mir nur das Zeichen am Herzen liegt).
  • Theta ist der Winkel zwischen den beiden Vektoren

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 .

Migimunz
quelle
Fast da denke ich. Es scheint nicht genau im Mittelpunkt der Masse zu stehen. Mit nur den Pfeilen nach links / rechts kann das Schiff leicht vom Bildschirm verschwinden. Ganz in der Nähe. Möglicherweise ist der Punkt, von dem aus Sie messen, etwas abweichend. Oder es könnte ein Timing-Problem sein, da es sich nach einer Weile zu einem guten Spin zu stabilisieren scheint. Gute Arbeit.
MichaelHouse
Ich denke, das hat nichts mit dieser Logik zu tun. Hier gibt es keine Garantie dafür, dass das Fahrzeug keine Netto-Translationskraft erhält, wenn es die von diesem Mechanismus ausgewählten Thurster abfeuert. Wenn die Aufrechterhaltung einer Nettotranslationskraft nicht erforderlich ist, muss die Kraft einzelner Triebwerke moduliert werden (und es wird wahrscheinlich ein viel schwierigeres Problem zu lösen sein)
Trevor Powell,
@ TrevorPowell, genau. Der Einfachheit halber (und auch zum Spaß, da die Leistung Ihres Schiffes davon abhängt, wie gut Sie es konstruieren), habe ich entschieden, dass die Triebwerke entweder ein- oder ausgeschaltet sind. Ich werde wahrscheinlich eine Schwelle einfügen, damit diejenigen, die zu wenig Drehmoment (und damit zu viel seitliche Bewegung) verursachen, nicht eingeschaltet werden, aber genau, wie viel "zu viel / wenig" ist, wird wahrscheinlich durch Ausprobieren bestimmt.
Migimunz
3
Um Winkelberechnungen zu vermeiden, müssen Sie das senkrechte Skalarprodukt verwenden (abgeleitet aus der Kreuzproduktdefinition von Drehmoment T = r Kreuz F, wenn Sie 3D-Vektoren mit z = 0 verwenden). Sie nehmen den Vektor (-ry, rx), der senkrecht zu r steht, mit der gleichen Größe und berechnen das Skalarprodukt dieses Vektors mit F. Das Ergebnis ist T = rx * Fy - ry * Fx. Dann ist abs (T) die Größe des Drehmoments, und sein Vorzeichen gibt die Richtung an: T> 0 ist gegen den Uhrzeigersinn, T <0 ist im Uhrzeigersinn.
Joren
1
Der Grund, warum es funktioniert, ist intuitiv leicht zu erkennen: r Punkt F = r F cos θ. Wenn Sie r um 90 Grad gegen den Uhrzeigersinn drehen und das Skalarprodukt nehmen, erhalten Sie r F sin θ, da cos (θ - 90˚) = sin (θ) ist.
Joren
14

Der allgemeine Ausdruck für 3D - Drehmoment ist das Kreuzprodukt der Verschiebung und die Kraft: T = rF . 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:

  • Kraft in Richtung + x: T = F * (-ry)
  • Kraft in Richtung -x: T = F * (ry)
  • Kraft in Richtung + y: T = F * (rx)
  • Kraft in Richtung -y: T = F * (-rx)

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.

Raumschiff

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.

Marcks Thomas
quelle
7

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).

Jeremy Salwen
quelle
Vielen Dank für die Antwort (und die schnellere und sauberere Lösung zur Berechnung des Drehmoments). Der rote Kreis ist jedoch nicht die COM des Schiffes, sondern der Energiekern. Ich benutze eine Physik-Engine und übe lediglich einen lokalen Impuls auf das Schiff aus. Ich bin in Ordnung mit der Lösung, die nicht perfekt ist, da es sehr viel Spaß macht, mit verschiedenen Konfigurationen herumzuspielen, aber ich würde gerne wissen, was Sie sich einfallen lassen.
Migimunz
1
Sie können das Drehmoment von einem beliebigen Bezugspunkt aus berechnen. Die resultierende Zahl ändert sich, aber solange Sie das Schiff um diesen Punkt drehen, der nicht der Schwerpunkt sein muss, ändert sich das physikalische Verhalten nicht. Tatsächlich ist der Massenschwerpunkt ohne Informationen über die Massenverteilung selbst willkürlich und kann nicht als solcher berechnet werden.
Marcks Thomas