Hallo,
ich arbeite unter anderem aktuell an einer 3D Physikengine, jedoch habe ich ein paar offene Fragen, die eventuell auch anderen bei der Entwicklung einer eigenen Engine im Kopf schwirren.
Ich würde diesen Thread gerne als ein Tutorial zur eigenen Phsikengine aufbauen, so das auch andere User sich hieran orientieren können und eventuell Fehler die andere und ich gemacht haben nicht immer und immer wieder durchlaufen.
Nun zu meiner aktuellen Planung:
Mit einer Methode der Engine Klasse, gibt es die Möglichkeit, einen maximalen Koordinatenbereich (X, Y, Z) fest zu legen, der Maximale Bereich ist aktuell Beschränkt, da ich hierfür einen usigned long int nutze.
In dem daraus resultierendem 3D Rechteck, oder der 2D Ebene, können Sektoren angelegt werden, aktuell wird die Kantenlänge eines Sektors auf die Länge der betreffenden Seite (X, Y, Z) und der Anzahl der zu Bildenden Sektoren pro Ebene aufgeteilt. z.B. Die maximale Längen sind 50,50,50 (X, Y, Z) nun wird die Anzahl der Sektoren pro Ebene angegeben, z.B. 25, 50, 10 (X, Y, Z). Nun wird daraus die einzelnen Längen der Sektoren und die Gesamtzahl an Sektoren berechnet. In diesem Fall, wäre jeder Sektor von den Ausmaßen 2, 1, 5 (X, Y ,Z) Einheiten groß.
Die Sektoren dienen zur Performancesteigerung, da so nicht alle Objekte mit allen Objekten auf Kollisionen getestet werden müssen, sondern nur die, die benachbarte Sektoren überschneiden. Des weiteren, kann jedem Sektor eine eigenen Dichte, Gravitation und eine änderbare Kraftwirkung (z.B. Wind) zugewiesen werden.
Es können ebenfalls statische Objekte angelegt werden, mit denen dann bewegliche Partikel kollidieren können. Den Partikeln und aktuell nur Würfeln können weitere Eigenschaften zu gewiesen werden, wie Masse oder Reibungseigenschaften. Es ist auch geplant, mehrere Punkte miteinander verbindbar zu machen, um auch etwas komplexere Objekte mit möglichst genauen Eigenschaften zu generieren. (Ist noch in der Anfangsplanung "Status: Alpha")
Das waren jetzt erst mal die aktuellen Planungen und Möglichkeiten.
Nun zu meinen Fragen.
Ist es besser (Schneller) mit mehrdimensionalen Arrays zu arbeiten, oder sollten besser Vektoren genutzt werden, wenn Vektoren wie arbeitet man damit?
Ist es sinnvoll an bestimmten Stellen im Code Assembler zu nutzen?
Wenn ja, wie bekommt das Programm raus, welche Architektur der GPU / CPU mit, oder ist dies nicht möglich?
Und muss ich für jede Architektur einen eigenen Assemblerbereich schreiben, da jede Architektur ja eigenen Assemblerbefehle hat.
Wie ist es Performance technisch besser, die Physikberechnungen über die GPU laufen zu lassen, oder gehen diese Berechnungen besser über die CPU?
Ist es besser, mit festen Variablendeklarationen zu arbeiten (Int, double ....) oder mit Tamplates?
Habt ihr noch weitere Ideen, um mit der 3D Physikengine möglichst genaue Berechnungen zu machen?
Erstmal danke fürs durchlesen, ist jetzt etwas mehr an Text geworden, als ich eigentlich wollte, aber auch dem entsprechen ausführlich.
Ich bin über jede Antwort dankbar und hoffe auf konstruktive Kritik.
Mit freundlichen Grüßen
Supercomputer