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.