Rotation zwischen zwei Objekten beibehalten

9

In meinem XNA-Spiel habe ich zwei Objekte, die kollidieren. Wenn das erste Objekt mit dem anderen kollidiert, kann es sich daran festhalten und es um die Welt bewegen. Ich habe hier ein Problem mit der Mathematik (Mathematik ist nicht meine Stärke). Ich habe derzeit das zweite Objekt am ersten verriegelt und bewege mich damit, aber ich kann es nicht dazu bringen, seine ursprüngliche Richtung beizubehalten. Wenn das Objekt nach oben zeigt, sollte es diese Richtung relativ zu der Drehung mit dem Originalobjekt beibehalten.

Geben Sie hier die Bildbeschreibung ein

Irgendwelche Tipps, wie ich das am besten erreichen kann?

user99
quelle
Ich denke, beide Objekte würden sich um die Achse der Mitte des anderen Objekts drehen.
MichaelHouse

Antworten:

3

Was den Winkel betrifft, halten Sie einfach den Winkel des zweiten Objekts gleich dem Winkel des ersten. Wenn die beiden Objekte miteinander kollidieren, ermitteln Sie anhand der Abstandsformel den Abstand des zweiten Objekts vom ersten.

distance = math.sqrt((x2 - x1)^2 + (y2 - y1)^2)

So ermitteln Sie die Position des zweiten Objekts relativ zum ersten Objekt:

x2 = x1 + distance * math.cos(angle)
y2 = y1 + distance * math.sin(angle)
tesselode
quelle
2

Zusätzlich zur Antwort von @ tesselode würde ich empfehlen, dass Sie für jedes Weltobjekt in Ihrem Spiel eine Liste der angehängten Objekte führen. Etwas in der Art von List<WorldObject> AttachedObjects. Wenn Sie dann eine Kollision feststellen würden, würden Sie das schwarze Rechteck zum roten hinzufügen AttachedObjects. Danach müssen nur noch die Positionen der Kinder jedes Mal mit der Methode von @ tesselode aktualisiert werden, wenn Sie die Position der Eltern aktualisieren.

Jesse Emond
quelle
2

Ich gehe davon aus, dass einer der beiden die Kontrolle über den anderen haben wird, ähnlich wie bei einem Gabelstapler. In Ihrer Zeichnung gehe ich davon aus, dass dies die schwarze und die rote das Paket ist. Sie erwähnen nur, dass Sie Probleme mit Winkeln haben, das ist alles, was ich behandeln werde.

Wenn die Objekte zusammenpassen, sollten Sie sich an den Winkeldifferenz zwischen den beiden erinnern (ich nenne das Theta). Ich habe dies in Abbildung 2 mit den Pfeilen der ersten übereinander gezeichneten Abbildung gezeichnet. Bis die Objekte entriegelt sind, wird der Winkel des roten Objekts durch den Winkel des Schwarzen plus Theta bestimmt (siehe Abbildung 3).

// When Latching:
theta = Red.angle - Black.angle;

// When retrieving Red's angle:
Red.angle = Black.angle + theta

Winkeldiff

John McDonald
quelle
1

Sie können die Möglichkeit implementieren, untergeordnete Objekte für ein Objekt zu haben (wobei untergeordnete Objekte automatisch von Änderungen an der Position / Drehung des übergeordneten Objekts betroffen sind). Wenn sie dann zusammenstoßen, wenn sie sich verriegeln sollen, machen Sie ein unsichtbares Objekt und machen beide angehängten Objekte zu ihren untergeordneten Objekten. Anstatt Transformationen (Bewegung, Rotation) auf die einzelnen Objekte anzuwenden, wenden Sie sie auf das große Objekt an, ODER Sie können weiterhin Kräfte auf die einzelnen untergeordneten Objekte anwenden, wodurch überprüft wird, ob ich ein Elternteil habe Ja, die Kraft würde an das übergeordnete Element gesendet (wodurch die Kräfte aller untergeordneten Objekte zu einem Vektor zusammengeführt würden, den es auf sich selbst anwenden würde).

Außerdem sollte dieser Ansatz ihre Rotation richtig handhaben, wenn Sie den Massenschwerpunkt für das unsichtbare Elternteil anhand der Gewichte der verriegelten Objekte berechnen, was Johns Methode nicht zu erreichen scheint (verbundene Objekte drehen sich um ihren neuen gemeinsamen Massenschwerpunkt, nicht um den Massenschwerpunkt eines der Objekte), und Sie könnten diese Art von Verhalten leicht verschachteln, ohne dass zusätzlicher Code erforderlich ist. Es scheint der robustere und flexiblere Ansatz zu sein.

+ Bedingung, wenn die auf das Kind ausgeübte Kraft stark genug ist, um das Gelenk zu brechen, und Sie das "Entriegeln" des Gelenks bewältigen können, indem Sie einfach die Eltern-> Kind-Beziehung entfernen. Wenn nur noch ein Kind übrig ist, trennen Sie es ebenfalls und entfernen auch das unsichtbare Elternteil.

Ich kann weitere Details (mit Bildern und zumindest Pseudocode und dergleichen) bereitstellen, wenn Sie interessiert sind.

sh Code
quelle