Wir verwendeten die gewonnene Erfahrung aus den zuvor implementierten Szenen um eine komplexere Anwendung zu programmieren.
Anforderung an die Anwendung
- Einladen von Objekten mit einer hohen Anzahl von Polygonen.
- Simulation dieser Objekte durch die PhysX Engine.
- Entwicklung einer Oberfläche zum komforablen Steuern und Testen von Parametern.
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.
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:
-
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
-
MeshLab
- schnell
- erzeugt viel zu große Meshes
- keine Parameter
-
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:
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.
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:
Hier ist die selbe Szene aber einer Darstellung der physikalischen Repräsentation der einzelnen Objekte:
Verwendete Software:
- NVIDIA PhysX (Überraschung!)
- Microsoft Visual Studio 2010 Ultimate
- Windows Presentation Foundation
- Visual C#, Visual C++, Managed C++
- FreeImage
- OpenGL
- DecomposeSample, ConvexDecomposition , MeshLab