Bearbeiten
Problem gelöst (siehe Drackirs Antwort). Hier ist eine Demo von dem, was ich mit diesem Joint erreichen wollte. Weitere Informationen zum Szenario zu dieser anderen Frage .
Problem
Ich versuche, in Farseer eine ganz bestimmte Art von Verbindung zu erstellen, die sich so verhält:
- Objekte sollten immer halten den gleichen Abstand zwischen ihnen in beiden der X- und Y - Achsen.
- Übersetzung - Eine Kollision mit einem der Objekte sollte die gesamte Gruppe zusammen bewegen, aber die Gruppe darf sich nicht drehen - nur die einzelnen Objekte können sich aufgrund des Drehmoments um ihre Zentren drehen.
- Drehung - Objekte sollten immer die gleiche Drehung haben. Bei einer Kollision mit einem der Objekte sollten sich alle anderen Objekte genau um den gleichen Betrag drehen.
Hier ist ein Bild:
Wenn es mit Farseer keine Möglichkeit gibt, dies sofort zu erreichen, wie würde ich es dann erweitern, um einen neuen Join-Typ zu erstellen, der so funktioniert? Grundsätzlich möchte ich, dass sich jeder Körper wie ein "Klon" der anderen verhält, jedoch mit einem festen Versatz zwischen ihnen.
xna
farseer-physics-engine
David Gouveia
quelle
quelle
Antworten:
Ok, nach ungefähr zwei Stunden Basteln habe ich das geschafft, aber es erfordert das Hinzufügen einiger zusätzlicher Körper. Sie werden dieses Zeug wahrscheinlich in eine Methode / Klasse extrahieren wollen, aber die Grundidee ist folgende:
Erstellen Sie für Ihre Objekte so genannte "Halter" -Körper. Diese Körper teilen die Größe und Position Ihrer "Objekte", nehmen aber nicht an Kollisionen teil. Im Wesentlichen sind sie Klone.
Befestigen Sie jeden Halter mit einem am "Haupthalter"
WeldJoint
. Dies verhindert, dass sie sich voneinander entfernen. DerFixedRotation
auf dem Haupthalter verhindert, dass sie sich drehen. Ich weiß nicht, ob es einen Fehler in Farseer gibt, aber wenn Sie einen hinzufügenWeldJoint
und beide Körper habenFixedRotation == true
, funktioniert das Gelenk nicht richtig. Deshalb hat nur der Haupthalter.FixedRotation = true
.Befestigen Sie Ihre "Objekt" -Körper mit
RevoluteJoint
s an ihren jeweiligen Haltern . Dadurch werden Ihre Objekte an den Haltern befestigt, sie können sich jedoch frei drehen.Passen Sie die Rotationen Ihrer realen Objekte an, indem Sie ein Winkelgelenk anbringen. Hinweis: Sie müssen nicht an jedem Objektpaar ein Winkelgelenk anbringen. Fügen Sie einfach ein Winkelgelenk zum Hauptkörper und zum anderen Körper hinzu, und die Rotationen werden auf alle Objekte übertragen.
Das ist es! Fügen Sie einfach den zusätzlichen Code für jedes andere Objekt / Objekthalter hinzu, das Sie möchten, und der Rest wird erledigt. Hier ist ein Bild, um meinen Test zu veranschaulichen:
Hier sehen Sie, dass die grünen Körper die Halter sind. Sie drehen oder kollidieren nicht und sind miteinander verschweißt. Die gelben und roten Körper sind Ihre "Objekte" (gelb ist das Hauptobjekt). Sie können sehen, dass sie um den gleichen Betrag gedreht werden und sich um ihre jeweiligen Halter drehen. Außerdem nehmen nur die roten und gelben Körper an Kollisionen teil. Ich glaube, dies erfüllt alle drei oben genannten Bedingungen.
Arbeitsbeispiel
Wenn Sie die Farseer "Samples XNA" -Lösung laden und SimpleDemo1.cs ("Samples XNA" -Projekt> "Samples" -Ordner) finden, habe ich sie zum Testen neu geschrieben ( Code hier ).
Hoffe das hilft. Lassen Sie mich wissen, wenn Sie Fragen haben.
quelle
Vector2
Unterschied zwischen der Körperposition und dem Hauptkörper). Positionieren Sie dann die Hauptposition neu und aktualisieren Sie einfach ihre Positionen relativ zur Hauptposition.Leider kann ich diese Antwort nicht überprüfen, da ich gerade telefoniere. Ich entschuldige mich, wenn es nicht wie erwartet funktioniert.
Ich denke, Sie könnten mehrere vorhandene Gelenke verwenden, um das zu erreichen, was Sie wollen. Erstellen Sie einen Körper ohne Kollisionsgeometrie an der Ecke Ihres Dreiecks. Anschließend können Sie drei Distanzgelenke verwenden, um die gewünschte Übersetzung zu erzielen. Wenn Sie dann die beiden kollidierbaren Körper mit einem festen Winkelgelenk verbinden, drehen sie sich zusammen.
quelle