Erstellen einer Simulation von steifen Körpern mit Kugeln

Es folgt ein Überblick über die grundlegenden Schritte zum Erstellen einer Simulation von steifen Körpern mithilfe des Bullet Physics-Knotens in MCG.

Eine Welt erstellen

Ein Bullet Physics-System wird auch als "Welt" bezeichnet. Die Welt ist das, was während der Simulation im Cache gespeichert und aktualisiert werden muss. Sie muss alle steifen Körper mit ihren Abhängigkeiten und Beziehungen enthalten, die Teil der Simulation sind.

Bevor Sie zur Welt steife Körper hinzufügen können, müssen Sie die Welt selbst erstellen. Es ist eine Anfangszeit erforderlich, in der Regel die Startzeit für Ihre Szene. Sie können auch die Schwerkraft der Welt festlegen.

Ein dynamisches Objekt hinzufügen

Dynamische Objekte sind steife Körper, deren Transformationen von der Bullet Physics-Engine aktualisiert werden – im Gegensatz zu anderen Objekten, die nur als potenzielle Kollisionsobjekte dienen.

Das Hinzufügen eines dynamischen Objekts zur Welt umfasst die folgenden grundlegenden Schritte:
  1. Festlegen der dynamischen Eigenschaften des steifen Körpers.

    Die Masse eines dynamischen Objekts muss positiv und ungleich Null sein.

  2. Erstellen Sie einen starren Körper mithilfe von dynamischen Eigenschaften.
    • Bei einem dynamischen Objekt muss der Anschluss "isKinematic" den Wert False haben.
    • "convexHull" ist das Netz für die Kollisionserkennung. Es sollte wasserdicht sein. Wenn Vertiefungen vorhanden sind, wird nur die konvexe Hülle verwendet. Beachten Sie, dass es sich nicht um dasselbe Netz handeln muss, das für das Rendern der Kontur des Objekts verwendet wird . Sie können beispielsweise zur schnellen Berechnung von Kollisionen ein vereinfachtes Netz verwenden, oder ein kleineres Netz, um Explosivkräfte durch Durchdringungen von dicht gepackten Objekten zu vermeiden.
  3. Sie können als Option auch die Anfangsgeschwindigkeit des Objekts festlegen oder Abhängigkeiten erstellen.
  4. Fügen Sie das dynamische Objekt in die Welt ein.

Später benötigen Sie den Index eines dynamisches Objekts, um den Wert der Transformation aus der Welt zurückzuerhalten. Merken Sie sich also die Anzahl der zur Welt hinzugefügten dynamischen Objekte und ihre Reihenfolge. Das erste zur Welt hinzugefügte Objekt hat den Index 0, das zweite den Index 1 usw.

Kollisionsobjekte hinzufügen

Die Bullet Physics-Engine verwendet Kollisionsobjekte für Kollisionen von dynamischen Objekten, jedoch werden deren Transformationen nicht aktualisiert. Sie werden in der Regel für Dinge wie Geschossdecken und Wände verwendet, können aber auch animiert werden.

Das Hinzufügen von Kollisionsobjekten ist mit dem Hinzufügen von dynamischen Objekten vergleichbar, ist aber einfacher:
  • "isKinematic" muss den Wert True haben. Dies bedeutet nicht unbedingt, dass das Kollisionsobjekt animiert ist, aber wenn es so ist, ist Ihr Diagramm für die Aktualisierung seiner Transformation vor dem Fortschreiten der Welt verantwortlich.
  • Die Masse wird ignoriert (stets gleich Null).
  • Geschwindigkeit und Abhängigkeiten werden nicht berücksichtigt.

Sie können wiederum mehrere Kollisionsobjekte hinzufügen.

Ein Welt-Cache erstellen

Legen Sie nach dem Hinzufügen des letzten steifen Körpers den Anfangszustand des Welt-Caches mithilfe der resultierenden Funktion fest.

Das Welt-Cache aktualisieren

Nun müssen Sie definieren, wie das Cache in jedem Frame aktualisiert wird. Dies geschieht in zwei Schritten:
  • Wenn die Kollisionsobjekte animiert sind, aktualisieren Sie die Welt mit ihren neuen Transformationen.
  • Lassen Sie die Welt in der Zeit fortschreiten.

Die Transformationen der Kollisionsobjekte aktualisieren

Das Aktualisieren der Transformationen von Kollisionsobjekten umfasst das Abrufen der aktuellen Transformationsmatrizen von den INodes der Szene und das Festlegen der Transformation der entsprechenden steifen Körper der Welt nach Index. Wie zuvor können Sie für mehrere Objekte Arrays verwenden.

In der Zeit fortschreiten

Lassen Sie die Simulation entsprechend der Differenz zwischen der aktuellen Zeit der Szene und der Zeit der letzten Simulation fortschreiben. Verbinden Sie die resultierende Funktion mit dem updateFunc-Anschluss des CreateCache-Knotens.

Die aktualisierten Transformationen abrufen

Der letzte Schritt besteht darin, die simulierten Transformationswerte aus der im Cache gespeicherten Welt nach Index abzurufen und sie in geeigneter Weise zu verwenden.
  • Bei einem Controller würden Sie die einzelne Transformation ausgeben.
  • Bei einer Geometrie könnten Sie Kopien eines Netzes mit einem Array von Transformationen instanziieren.