Kollisionspenetrationsproblem

Ich implementiere eine 3D-Engine, aber ich habe einige Probleme mit der Physik. Leider ist meine Ausbildung in diesem Bereich nicht so umfangreich und ich würde mich über Hilfe bei der Lösung dieses Problems freuen.

Nehmen wir an, wir haben eine unendliche Ebene und eine orientierte Box. Die Box hat sowohl Linear- als auch Winkelgeschwindigkeiten, die Ebene ist statisch, was bedeutet, dass ihre Linear- und Winkelgeschwindigkeiten Null sind. Irgendwann passiert eine Kollision, und wir wissen, welche Kante, Fläche oder Ecke des Würfels mit der Ebene kollidiert ist und wie tief sie ist. Lassen Sie es uns veranschaulichen.

Abbildung 1

In diesem Punkt wissen wir ein paar Dinge, listen wir sie auf:

    • Winkelgeschwindigkeit der Box in diesem Frame (Rotationsvariation in diesem Frame) (die Rotationsachse befindet sich in der Mitte der Box)
    • Lineargeschwindigkeit des mittleren Objekts der Box in diesem Frame (Positionsänderung in diesem Frame)
    • Tiefe (es ist ein Vektor, dessen Richtung die Normale der Ebene ist und dessen Größe die Scheitelpunkt- / Rand- / Flächendurchdringung ist)
    • Die Position der Grenze/Vertex/Fläche, die nach der Kollision zuerst mit der Ebene kollidierte (ich nannte es Kollisionspunkt im Bild)
    • Die Normalen der Box und des Flugzeugs
    • Die Position des Massenmittelpunkts der Box
    • Der Trägheitstensor der Box
    • Die Masse der Kiste

    Ich suche nach der Zeit t , in der die Kollision stattfand, was die Winkelgeschwindigkeit und die lineare Geschwindigkeit ist, die das Objekt zu diesem Zeitpunkt hatte.

    Abbildung 2

    Vielen Dank für eure Aufmerksamkeit :)

    Ist das wirklich eine Frage der Physik?
    Wissen Sie, wie sich Linear- und Winkelgeschwindigkeit mit der Zeit ändern, oder können sie während dieses Zeitintervalls als konstant angenommen werden?
    Sie sind konstant. Die Winkel- und Lineargeschwindigkeit sind in diesem Fall die Varianz der Position und Rotation in einem Frame.
    Es ist eine Frage der Physik, ja. Wie können Sie erwarten, dass eine Engine die Realität simuliert, wenn sie nicht die gleichen Regeln wie die Realität verwendet?
    @fibonatic Die Winkel- und Lineargeschwindigkeiten sind die Varianz derjenigen zwischen t = 0 und t = 1. Aus diesem Grund suche ich nach dem t, denn wenn ich das ti kenne, kann ich es mit den Linear- und Winkelgeschwindigkeiten multiplizieren, um die genauen Geschwindigkeiten der Objekte zu kennen, wenn die Kollision stattfindet.
    Sie sagen, dass Sie die Linear- und Winkelgeschwindigkeit zum Zeitpunkt der Kollision wissen wollen, aber vorher sagen Sie, dass diese bekannt und konstant sind. Wollen Sie eigentlich die Raum- und Winkellage zum Zeitpunkt der Kollision?
    Wird jeder Zeitschritt mit einem Runge-Kutta-Integrationsschema oder etwas anderem unternommen? Welche Freiheitsgrade hat jeder Körper? Verfolgen Sie den Schwerpunkt oder einen anderen Punkt?
    Lesen Sie dieses Papier zu diesem Thema.

    Antworten (2)

    Um die Zwischenposition zwischen zwei Zeitschritten zu finden, müssen Sie eine kubische Spline-Funktion ohne Genauigkeitsverlust verwenden. Nehmen wir an, jeder Körper hat drei Freiheitsgrade ( X , j , θ ) und Sie kennen die Werte und ihre Ableitungen zwischen zwei Zeitschritten

    ( X 1 j 1 θ 1 ) , ( X ˙ 1 j ˙ 1 θ ˙ 1 ) ( X 2 j 2 θ 2 ) , ( X ˙ 2 j ˙ 2 θ ˙ 2 )

    Wenn die Zeitschrittgröße ist H Und T = 0 Im ersten Schritt werden dann die Zwischenwerte gefunden

    ( X j θ ) = | X 1 X 2 X ˙ 1 X ˙ 2 j 1 j 2 j ˙ 1 j ˙ 2 θ 1 θ 2 θ ˙ 1 θ ˙ 2 | ( 2 ( T H ) 3 3 ( T H ) 2 + 1 ( T H ) 2 ( 3 2 ( T H ) ) T ( ( T H ) 2 2 ( T H ) + 1 ) H ( T H ) 2 ( T H 1 ) )

    Für jede ( X , j , θ ) Lösung gibt es die Koordinaten der Kontaktecke P als definiert

    ( X P , j P ) = F ( X , j , θ , Maße )

    Für eine Kiste der Größe A Und B das ist

    ( X P j P ) = ( X + A 2 cos θ B 2 Sünde θ j + A 2 Sünde θ + B 2 cos θ )

    Die Einschränkung ist, ob die Form einer Linie (Ebene in 3D) N X X + N j j = D Wo ( N X , N j ) ist der Kontaktnormalenvektor und D ist die Entfernung vom Ursprung. Sie befinden sich am Kontaktpunkt (innerhalb der Toleranz ϵ ) Wenn

    | N X X P + N j j P D | ϵ

    Sie können jetzt wählen, ob Sie eine numerische Methode (wie die Halbierung) verwenden, um das Problem zu lösen, oder ob Sie annehmen, dass der Zeitschritt klein genug ist, um es zu lösen, indem Sie annehmen, dass T 1 Und

    T D N X X P N j j P N X ( X ˙ 1 + θ ˙ 1 ( j 1 j P ) ) N j ( ( X 1 X P ) θ ˙ 1 j ˙ 1 )

    Es hat das Problem gelöst! Vielen Dank für deine Hilfe :D.

    Der schnelle und einigermaßen genaue Weg (abhängig von der Größe des Zeitschritts), dies zu tun, besteht darin, die Position kurz vor der Kollision einzunehmen ( A ) und unmittelbar nach der Kollision ( B ), ziehen Sie eine Linie zwischen ihnen

    L ( T ) = ( 1 T ) A + T B
    und nach wann auflösen L ist im Flugzeug. Nämlich wann
    ( L ( T ) P ) N = 0 ,
    Wo P ist ein Punkt in der Ebene und N ist der Normalenvektor der Ebene (falls Sie Ebenen so definieren).

    Für die physikalische Lösung werde ich nur einen Scheitelpunkt verfolgen, da es viel einfacher ist, einen einzelnen Punkt zu verfolgen als eine höherdimensionale Entität. Außerdem ist es viel wahrscheinlicher, dass ein Objekt, das sich bewegt und dreht, an einer Ecke auftrifft, da eine Kante oder Fläche eine präzise Ausrichtung und ein präzises Timing erfordern würde.

    Weitere Annahmen, um mein Leben einfacher zu machen (meistens sichere Annahmen vorausgesetzt T = 0 1 ist ein Animationsframe):

    • Die lineare Geschwindigkeit ist konstant.
    • Die Winkelgeschwindigkeit ist konstant.
    • Rotationsachse ist konstant.

    Wir können die Bewegung des Scheitelpunkts als Kombination der Bewegung des Massenschwerpunkts und der Rotationsbewegung um den Massenschwerpunkt beschreiben:

    X ( T ) = X CM ( T ) + X R ( T ) .
    Schwerpunkt ist einfach:
    X CM ( T ) = X CM ( 0 ) + v T
    Wo v ist die Geschwindigkeit des Massenmittelpunkts.

    Die Positionsänderung um den Massenschwerpunkt ist eine Rotation des Vektors

    X ' = X ( 0 ) X CM ( 0 )
    um einen Winkel θ = ω T um einen Achsenvektor B , Wo ω ist die Winkelgeschwindigkeit. Der einfachste Weg, den ich gefunden habe, um Rotationen um eine beliebige Achse darzustellen, ist eine Rotationsmatrix, die einer Koordinatentransformation folgt. Die x-Achse ist der Einheitsvektor in Richtung der Komponente von X ' senkrecht zur Rotationsachse B (nennen X ^ B ' ), ist die z-Achse der Einheitsvektor der Rotationsachse ( B ^ ), und die y-Achse ist das Kreuzprodukt dieser beiden. Die Umkehrung (und Transponierung) dieser Transformation ist gegeben durch
    D 1 = [ | | | X ^ B ' B ^ × X ^ B ' B ^ | | | ]
    Dies macht die Drehung ein einfaches
    R = [ cos ( θ ) Sünde ( θ ) 0 Sünde ( θ ) cos ( θ ) 0 0 0 1 ]

    Die vollständige Transformation geht vorbei

    D 1 R D X ' = D 1 R [ | X B ' | 0 B ^ X ' ] = D 1 [ | X B ' | cos ( θ ) | X B ' | Sünde ( θ ) B ^ X ' ] = X B ' cos ( θ ) + Sünde ( θ ) ( B ^ × X B ' ) + ( B ^ X ' ) B ^

    Die Gesamtbewegung ist also gegeben durch

    X ( T ) = X C M ( T ) + X R ( T ) = X C M ( 0 ) + v T + X B ' cos ( ω T ) + Sünde ( ω T ) ( B ^ × X B ' ) + ( B ^ X ' ) B ^
    (Beachten Sie die Änderungen von X ^ B ' Zu X B ' wegen der Multiplikation mit | X B ' | ). Zu bekommen T , nach wann auflösen X ( T ) ist in der Ebene wie im ersten Absatz:
    ( X ( T ) P ) N = 0.

    In dieser Form ist die Gleichung mit der unlösbar Sünde Und cos . Sie können die kleinen Winkelannäherungen machen

    Sünde X X
    Und
    cos X 1 1 2 X 2
    um daraus eine lösbare quadratische Gleichung zu machen.

    Wenn Sie kurz vor dem Aufprall keinen Zugriff auf die Position haben ( T = 0 Position/Orientierung), können Sie verwenden

    ( ( X ( 1 ) P ) N ^ ) N ^ = D
    um es zu finden (beachten Sie die Verwendung des Einheitsnormalenvektors N ^ ).

    In Abwesenheit von Kräften bewegt sich jeder Punkt auf einem Körper auf einer krummlinigen Bahn (Rotation + Translation). Die lineare Approximation würde also nur für sehr kleine Zeitschritte korrekt funktionieren.
    @ ja72 Richtig, weshalb die Antwort nach dem ersten Absatz fortgesetzt wird. Die "physikalische" Lösung ist der krummlinige Weg.
    Vielen Dank für Ihre Hilfe! Es löste das Problem, aber die Lösung von @ ja72 war schneller für den Computer, ich wünschte, ich könnte beide als richtig bezeichnen :(
    @Haruko Ich bin eigentlich etwas überrascht, dass meine Antwort funktioniert hat, da ich nur etwas aus der Erinnerung an andere Projekte eingegeben habe.