Hallo, wir sind gerade dabei, innerhalb eines Uni-Vorlesung eine 3D Physics Engine zu entwickeln. Während die Mathematik und Physik ziemlich gut erklärt wird, kommt der Software-Engineering Teil nur sehr kurz, wenn überhaupt. Auch die vom Prof empfohlene Literatur deckt es m.m.N. kaum ab. Wenn da mal Code gezeigt wird, dann sieht er für mich meistens sehr hässlich aus, alles in eine elend lange Funktion gepackt, kaum richtige Struktur und kaum anpassbar. Warten würde ich so einen Code nicht wollen. Könnt ihr mir deshalb ein Buch/Internetseite/Paper empfehlen, wo auch Fokus auf die Softwarearchitektur gelegt wird? Insbesondere geht es mir darum, wie man die Engine am besten in Klassen aufteilt, was Singleton sein sollte und was nicht, wie man die Darstellung von der Simulation entkoppelt, ohne die Performance durch zusätzliches Kopieren und Locks zu stören, wie man die Simulation auf mehrere Threads aufteilt, wie man das ganze erweiterbar und wartbar macht usw... Grüße Student
Bei 3D und Physics Engines gibt es ganz verschiedene Entwurfsmuster. Als
erstes braucht man eine schnelle Mathelib, welche Arithmetische
Operationen auf Vektoren Matrizen, Quaternionen anwenden kann. Danach
muss man sich den groben Ablauf und die mit der zur Verfügung Stehenden
Hardware zu nutzenden Mittel Entscheiden.
Ablaufe könnten sein:
- Haupt-schleife, in welcher nacheinander in der Physics Engine der
Nächste Iterationsschritt, und danach das nächste Frame Gerändert wird.
- Mehrere Threads für verschiedene Aufgaben, Physics und Rendering
Parallel.
- Cloud-Computing
- ...
Nutzbare Mittel und Alternative:
- Berechnungen auf GPU auslagern:
- DirectX plus HLSL nutzen
- oder OpenGL mit GLSL für rendering und OpenCL für Physics
- Langsame Alternative:
- Software rendering, Komplette Physik auf CPU
Danach kommen Entscheidungen wie, Wovon gibt es sehr viele,
Parallelisierbare berechnungen die auf die GPU ausgelagert werden
können, und sollen diese auf die GPU ausgelagert werden?
Geeignet für die Auslagerung auf die GPU wären:
- Partikelsysteme, Ausnutzung von GLSL und transform feedback, oder
nutzung von OpenCL.
- Cloth simulation
- Hair simulation
- Ray Tracing / Rycasting un Co.
Auf der CPU würde ich überwiegend Kollision Detektion und Prüfungen zur
Möglichkeit der Interaktion zwischen Objekten ausführen. D.h. Objekte
Gruppieren, Umschliessende Box, Umschliessende Kugel berechnen.
Beispiel: Wenn die Umschliessenden Kugeln zweier Objekte nicht
Kollidieren, kollidieren auch die Objekte nicht, Man kann sich die
Kollisionsberechnungen für die Primitive der Objekte Sparen.
Allgemeine Grundlagen für Realtime-fähigen Simulationen:
- GPU nutzen
- Möglichst selten und Möglichst grosse Zusammenhängende Daten-Blöcke
an die GPU übertragen, statt viele einzelne.
- Wenn möglich die Speicherintensivere, Schnellere Methode verwenden
und Alles Mögliche Bereits bei der Initialisierung Vorausberechnen, z.B.
Key-Frames
- Überflüssige Berechnungen frühzeitig erkennen
Mit diesem Vorwissen kann man dann die Anforderungen an die Engine
festlegen und mit den Überlegungen zur Umsetzung beginnen.
Als schnelle Methode um Berechnete Daten zwischen einem rendering-Thread
und einem Physics Thread non-Blocking auszutauschen verwende ich gerne
double buffering, der rendering Thread bekommt den alten Buffer, während
der Neue fom Pysics thread beladen wird, dann werden die Pointer auf die
Buffer getauscht. Das kombiniert man dann noch mit einem Mutex und einem
trylock, und setzt ein Flag ob sich bereits etwas am buffer verändert
hat.
Zum Schluss sollte man sich noch für eine Programmiersprache
Entscheiden, welche einem dafür geeignet Erscheint (wobei ich von Java,
perl, python und Co. abraten würde und etwas Hardwarenahes empfehle, wie
z.B. Delphi, C, C++, ...)
Bei der Umsetzung fängt man dann zuerst mit den Ablauf Diagrammen an,
und hält sich danach an die üblichen Design-Patterns der gewählten
Programmiersprache.
Aber bevor man all das macht, empfehle ich Tutorials zu OpenGL, OpenCL,
GLSL, OpenAL, DirectX, ... zu machen und Erfahrung zu sammeln.
Das wird sehr viel zeit Beanspruchen.
Ihr könnt euch auch an bereits bestehende Physics-Engines orientieren. Hier gibts eine Liste: http://de.wikipedia.org/wiki/Physik-Engine .
Allenfalls kann man viel Zeit sparen, wenn man sich von der Eierlegenden Wollmilchsau entfernt und sich auf eine Anwendung einschraenkt. Also die Entscheidungen bereits macht : -Braucht man eine Interaktive 3D Eingabe -Parametrisierbare Eingabe -Parameter Sweeps -FEM Gitterung -Mechanik, Maxwell, Navier Stokes -Skriptmoeglichkeiten -Libraryfunktionen
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.