Ich habe kürzlich meine Spiel-Engine von Lenkverhalten auf impulsbasierte Bewegung mit der richtigen zeitbasierten Kollisionsauflösung umgestellt. Dies hat so viele Probleme gelöst (kein Tunneln mehr, yay) und die Simulation viel stabiler gemacht. Mit der Stabilität ist jedoch ein neues Problem verbunden.
Die drei Bälle begannen ihre Reise in der Nähe des unteren Bildrandes. Ihr Ziel war, wo der rosa Ball aufgehört hat. Unterwegs stecken die roten und grünen Kugeln an der Drosselstelle in der Wand fest.
Früher konnte ich mich auf Gleitkommafehler und die allgemeine Instabilität des Lenkverhaltens verlassen, damit sich die grünen und roten Kugeln gegenseitig drängeln, bis sie den Drosselpunkt erreicht haben. Bei richtiger Kollisionsauflösung heben sich die auf die Kugeln einwirkenden Kräfte gegenseitig auf, was dazu führt, dass die Kugeln vollkommen ruhig bleiben.
Welche Methoden werden üblicherweise verwendet, um solche Situationen zu lösen? Vielleicht würde eine Art Prioritätswarteschlangensystem funktionieren, obwohl ich sehe, dass es komplex wird, wenn ich die Priorität zwischen mehr als zwei Objekten festlegen muss.
quelle
Antworten:
Weisen Sie jedem beweglichen Objekt einen eindeutigen Index zu und verhindern Sie, dass ein Objekt mit einem höheren Index einen Agenten mit einem niedrigeren Index verschiebt. Auf diese Weise können "ältere" Objekte "neuere" Objekte anstoßen, aber nicht umgekehrt. Dies ist weniger aufwendig als das Anstehen in der Warteschlange. Im Wesentlichen fungiert der Index als Bewegungspriorität.
quelle
Fügen Sie der Pfadfindung Zeit hinzu
Hier ist ein Artikel, der über diesen Zeitwürfel spricht: http://www0.cs.ucl.ac.uk/staff/D.Silver/web/Applications_files/coop-path-AIWisdom.pdf
und hier ist eine Objective-C-Implementierung: http://allseeing-i.com/ASIPathFinder
quelle
Eigentlich denke ich nicht, dass Sie es reparieren sollten. Wenn (ich kann raten) die Pfeile Kraftvektoren anzeigen, die auf eine Kugel an einer beliebigen Position im Gitter angewendet werden (wahrscheinlich "bi-linear" oder ähnlich interpoliert oder irgendwie "analoger" als nur 0/1), dann ist das Verhalten ist körperlich korrekt und Sie sollten sich selbst zu einer gut benommenen Lösung beglückwünschen.
Die beiden Kugeln sind in einem guten Gleichgewicht, da sie dort sitzen und sich gegenseitig hassen. Wenn sie sich etwas nach rechts bewegen, wirkt sich der "Kraftpfeil" nach rechts anscheinend etwas stärker auf die rechte Kugel aus (und umgekehrt auf die linke Kugel; etwas weniger), und so bewegen sie sich zurück zum Gleichgewicht. So sollte es sein.
Imho, was repariert werden sollte , ist die Wand oder die Kugelgrößen oder etwas anderes unter den Bausteinen selbst. Sie haben eine Unmöglichkeit geschaffen und das richtige Verhalten in dieser Situation ist dementsprechend ein Stillstand (Entschuldigung für den Missbrauch von Wörtern, ich hoffe, Sie bekommen sie trotzdem :-)).
Deaktivieren Sie stattdessen möglicherweise die nächsten Pfeile für die linke / rechte Kraft oder ordnen Sie sie auf eine andere Weise an, die nicht symmetrisch ist und nicht zum Ausgleich anregt .
Ich denke, es wäre eine schlechte Lösung, es künstlich zu reparieren ... würde zu früh haarig werden.
quelle