Forum: PC-Programmierung Physics Engine Architektur


von Student (Gast)


Lesenswert?

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

von Daniel A. (daniel-a)


Lesenswert?

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.

von TriHexagon (Gast)


Lesenswert?

Ihr könnt euch auch an bereits bestehende Physics-Engines orientieren. 
Hier gibts eine Liste: http://de.wikipedia.org/wiki/Physik-Engine .

von Purzel H. (hacky)


Lesenswert?

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
Noch kein Account? Hier anmelden.