Imlementierung einer Anwendung mit PhysX

Wir verwendeten die gewonnene Erfahrung aus den zuvor implementierten Szenen um eine komplexere Anwendung zu programmieren.

Anforderung an die Anwendung

Zusätzlich hatten wir uns das Ziel gesetzt eine gut modularisierte Anwendung zu schaffen, die verschiedene Aufgabenbereiche softwaretechnisch trennt, vielfältig parameterisierbare Schnittstellen zur Verfügung stellt und somit eine gute Wiederverwendung für andere Anwendungen gewährleistet.

Hoch-Polygonale Objekte und konvexe Hüllen

Wir bekamen hoch-detaillierte Repräsentationen von Steinblöcken aus dem Banteay Chhmar Tempel in Kambodscha. Diese waren mit einem 3D-Scanner generiert worden. Als Format entschieden wir uns für das Wavefront OBJ Format. Die Dateien in diesem Format waren bis zu 100 MB groß und die repräsentierten Objekte hatten bis zu 100.000 Knoten und 200.000 Polygone.

Hoch-Polygonale Repräsentation von Steinblöcken und der zugehörige konvexe Hüllkörper

Um die physikalische Simulation dieser komplexen Objekte mit PhysX zu realisieren, mussten konvexe Hüllkörper berechnet werden, da ein Kollisionskörper maximal 256 Polygone haben durfte. Wir haben drei Möglichkeiten ausprobiert:

  1. ConvexDecomposition
    • extrem langsam, 3h für den kleinsten Stein
    • gute Näherung
    • viele nützliche Parameter
    • stürzt bei allen außer dem kleinsten Stein ab
  2. MeshLab
    • schnell
    • erzeugt viel zu große Meshes
    • keine Parameter
  3. DecomposeSample
    • schnell
    • viele Parameter
    • leider kein Parameter für maximale Anzahl Dreiecke, lediglich für maximale Anzahl Vertices
    • passende Parameter experimentell für jeden Stein einzeln von eigener Software ermitteln lassen

GUI-Framework

Für die Entwicklung der GUI verwendeten wir die Windows Presentation Foundation (WPF). Dies ist das aktuelle Zugpferd von Microsoft um grafische Benutzeroberflächen zu kreieren. Da Microsoft im März 2003 aus dem Architecture Review Board ausgetreten ist, war die Integration von OpenGL nur über Umwege zu erreichen. WPF kann nur mit Managed Code entwickelt werden, da Spracherweiterung für die .NET-Plattform notwendig sind. Somit mussten wir eine Wrapper-Klasse schreiben, um unsere anderen Module (v.a. Grafik- und Physikengine), die in Unmanaged C++ geschrieben wurden, einzubinden.

Letztendlich sah die Struktur unserer Anwendung folgendermaßen aus:

Architektur unserer Anwendung

Durch die Modularisierung unserer Anwendung ist eine Entwicklung von anderen Szenarien sehr einfach. Hier ist noch eine beispielhafte Einbindung anhand von Source-Code dargestellt. Dieser spiegelt jedoch bei weitem nicht alle Möglichkeiten der Personalisierung wider.

Beispieleinbindung unserer Anwendung

Zum Source-Code ist anzumerken, daß dieser GLUT als Fenstermanagement verwendet. Dies läßt sich jedoch auch leicht anpassen, wie z.B. in unserer WPF-Oberfläche geschehen ist.

Unsere Anwendung ermöglicht es nun, detaillierte Modelle und deren niedrig-polygonale physikalische Repräsentation in eine Szene einzuladen. Somit können diese Objekte, sofern die Hardware-Unterstützung anhand einer PhysX-fähigen Grafikkarte vorhanden ist, mit einer hohen Framerate und einem hohen Maß an physikalischen und graphischen Realismus simuliert werden. Die physikalischen Parameter hierfür können bequem über die Oberfläche angepasst werden.

Hier ist ein Screenshot unserer Anwendung mit 10 detaillierten Objekten:

Screenshot unserer Anwendung

Hier ist die selbe Szene aber einer Darstellung der physikalischen Repräsentation der einzelnen Objekte:

Screenshot unserer Anwendung mit Darstellung der physikalischen Repräsentation

Verwendete Software: