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.
 Thread beobachten
 Thread beobachten Seitenaufteilung abschalten
 Seitenaufteilung abschalten