[Projekt] Physik-Engine

Battlejoe

Komplett-PC-Käufer(in)
Hi,

an dieser Stelle möchte ich euch ein kleines Projekt vor mir vorstellen. Ich bin gerade dabei, eine Art kleine Physik-Engine zu schreiben und dachte mir, ich könnte das Ganze ja mal im PCGHX-Forum festhalten. Vielleicht habt ihr ja noch Anregungen und Verbesserungsvorschläge, was man später noch alles einbauen kann.

Wie bereits im Titel ersichtlich ist es das Ziel, eine kleine Physik-Engine auf die Beine zu stellen. Was ich damit später anfangen will, steht noch in den Sternen. Naja, wie heißt es so schön? "Der Weg ist das Ziel" :ugly:. Ich will dabei vor allem auch dazulernen.

Derzeit ist das Projekt allerdings noch weit von seinem Ziel entfernt, aber ich befinde mich soweit ich das beurteilen kann auf ganz gutem Wege :P

Was das Programm bereits kann:

  • Kollisionserkennung kugelförmiger Körper inklusive Kollisionsantwort
  • Bewegungen finden bisher ausschließlich translatorisch statt, aber da ich bisher nur Kugeln verwende, macht das nix ;)
  • Für die, die etwas damit anfangen können: Die Bewegungen werden mit Hilfe von RK4 berechnet
Was ich noch vor habe einzubauen

  • NATÜRLICH rotatorische Bewegungen
  • Kollisionserkennung und Behandlung komplexerer dreidimensionaler Körper, zunächst werde ich mich wohl den Quadern widmen
  • Multithreading
Hier zum Abschluss noch ein paar Bilder:

Per Tastendruck werden 100 Kugeln hinzugefügt. Das ganze schaut dann erstmal so aus:



1.jpg


Wenn die Kugel auf dem Boden auftreffen, verteilen sie sich logischerweise in alle Himmelsrichtungen. Damit die Interaktion untereinander aber besser zu beobachten ist, habe ich die Kugeln in einen unsichtbaren "Käfig" eingesperrt :devil: Besser auf den folgenden Bildern zu sehen, was ich damit meine.



2.jpg


So schaut es aus, wenn sich die Kugeln langsam beruhigt haben. Beim Auftrumpfen auf dem Boden verlieren sie einen Teil ihrer Bewegungsenergie. Das führt natürlich dazu, dass die Bewegung irgendwann zum Erliegen kommt.


3.jpg


Hier noch ein Bild von einer Simulation mit 600 Kugeln. Man sieht an den sich ineinander schiebenden Kugeln vorne rechts, dass die Engine noch nich 100%-ig richtig arbeitet, aber da habe ich auch schon verschiedene Pläne, das zu beheben.



4.jpg


Sodann: Feuer frei würde ich mal sagen :daumen:
 
mach mal video, will das mal in Action sehn :D

Ansonsten :daumen:

gesagt, getan :D

Falls Interesse besteht, kann ich auch eine ausführbare Programmversion zur Verfügung stellen

€:

Jetzt hab ich doch ganz vergessen zu schreiben, was man da sieht:

Also das erste Video zeigt im Prinzip Bild 1 und 2 aus dem ersten Post

Im zweiten Video haben sich die Kugeln beruhigt und es werden weitere 100 Kugeln hinzugefügt.

Massen werden berücksichtigt! Die 200 Kugeln, die man im dritten Video zuerst sieht, haben je eine Masse von 10 kg. Die 201e Kugel wiegt eine 1 t. Schön zu sehen ist, wie die anderen Kugeln verdrängt werden und die schwere Kugel "eintaucht". (Erinnert sich noch jemand an den Cheat "Dampfhammer" in Driver 1? Erinnert mich irgendwie daran :ugly:)
 

Anhänge

Zuletzt bearbeitet:
sieht ganz witzig aus, bei Video1 fragt man sich erstmal geht das so überhaupt ? :ugly:

Aber dann fällt einem ein 100 Kugeln perfekt übereinander bekommt man halt so nicht hin... vlt mal von einer Rutsche runterkippen?

Planst du GPU Unterstützung?
 
sieht ganz witzig aus, bei Video1 fragt man sich erstmal geht das so überhaupt ? :ugly:

Aber dann fällt einem ein 100 Kugeln perfekt übereinander bekommt man halt so nicht hin... vlt mal von einer Rutsche runterkippen?

Planst du GPU Unterstützung?

Wenn ich die Kugeln alle direkt übereinander spawne, dann bleiben die irgendwann auch als Turm stehen. Ich spawne die mit Absicht alle etwas versetzt, damit das ganze realistischer wirkt. :D

GPU-Unterstützung habe ich eigentlich nicht geplant. Ich will auch nicht auf vorhandene Algorithmen zurückgreifen. Daher fällt z.B. PhysX schonmal raus;)
 
Habe mir die Viedos mal angeschaut - sehen für den Anfang ja sehr gut aus. :)

GPU-Unterstützung habe ich eigentlich nicht geplant. Ich will auch nicht auf vorhandene Algorithmen zurückgreifen. Daher fällt z.B. PhysX schonmal raus;)

Man muss nicht unbedingt PhysX benutzen, du könntest deinen Algorithmus auch in OpenCL (fast wie C) schreiben.
Dann würde er sowohl auf Nvidia- als auch auf AMD-Karten laufen.
 
Zuletzt bearbeitet:
Das mit PhysX sollte nur ein Beispiel sein :D Vllt lass ich mich, wenn dann alles funktioniert mal dazu hinreißen, OpenCl zu verwenden :D

Habe die Videos mit nem Kumpel jetzt nochmal auf YoutTube hochgeladen. Vielen Dank an dieser Stelle nochmal

https://www.youtube.com/watch?v=kaRhJwQ2DRc

https://www.youtube.com/watch?v=0CVC8Rruc8A

https://www.youtube.com/watch?v=v1iT-e_d1OQ
 
Wenn du Anregungen brauchst dann schau mal auf der Seite von der Bullet Physic Engine vorbei. In der Download Sektion gibt es gute Vorträge von Erwin Coumans über die Kollisionserkennung und interaktion verschiedener Objekte, vll. hilft dir das weiter.
Sonst aber ein cooles Projekt ;)

Testest du eigentlich Brute-Force mäßig alle gegen alle Objekte auf Kollision oder oder hast du eine Broadphase integriert die erst testet welche Objekte miteinander kollidieren könnten ?
 
Vielen Dank für den Link.

War ganz interessant :D Hatte mir vorher auch schon diverse Studien- sowie Abschlussarbeiten angesehen.

Einen SAT werde ich für komplexere Objekte noch einbauern. Ist ja wohl das übliche Verfahren für konvexe Polygone.
Zusätzlich habe ich mir die Woche noch ein wenig einschlägige Literatur liefern lassen :ugly: Jetzt bin ich auf dem Geschmack gekommen :devil:

Eine Broad-Phase habe ich bisher noch nicht integriert, da es sich ja bisher "nur" um Kugeln handelt. Einfacher als ein Kollisionstest zwischen Kugeln gehts ja nicht :D

Ich bin gerade dabei, das "Eintauchen" der Kugeln ineinander schlussendlich komplett zu unterbinden. Das funktioniert auch schon echt gut. Ich muss nur noch einige Anpassungen am "Käfig" vornehmen. Die habens aber in sich.

Wenns was sehensweres Neues gibt, gibts wieder ein Video :)
 
Auf jeden Fall ne geile idee. Gab oder gibt ja so nen ähnliches Projekt hier im Forum mit ner Grafikengine. Wäre geil wenn du irgendwann vielleicht den Quellcode irgendwie zum angucken hochladen könntest. Geht mir z.B. nur mal darum das ich mal nen eindruck bekomme wie sowas funktioniert (bin selber zwar relativ gut im Programmieren, hab aber bei sowas schon keinen Plan wo ich anfangen soll :D Hab mich auch bis jetzt nur mit 2D-Kollisionen beschäftigt(ist ja relativ simpel)).
 
Also ich denk den reinen Quellcode hochladen werde ich nicht. Aber ich kann (wenns dann halbwegs brauchbar ist) mal ein paar Prinzipskizzen, Ablaufdiagramme etc. hochladen und anhand derer erklären, wie das ganze dann funktioniert. :)
 
Hey ich hätte da noch ein Buch für dich: Game Engine Architecture

Das Buch "Game Engine Architecture" wurde vom Naughty Dog Lead Programmierer Jason Gregory geschrieben und erscheint am 5. August in einer zweiten Ausgabe.
In der überarbeiteten Ausgabe wurde viel hinzugefügt und überarbeitet.....unter anderem: extended/updated sections on multicore programming, pipelined CPU architecture and optimization, localization, C++11, pseudovectors and Grassman algebra, dual quaternions, SIMD vector math, memory alignment and anti-aliasing

Es ist zwar eher an Spieleengine Programmierung ausgerichtet, aber dürfte auch für dein Projekt ziemlich aufschlussreich sein.

Der einzige "Nachteil": es ist halt auf englisch^^





Edit:

Dieses Kapitel im Buch wäre wohl das Interessanteste für dich^^

12. Collision and Rigid Body Dynamics

12.1 Do You Want Physics in Your Game?

12.2 Collision/Physics Middleware

12.3 The Collision Detection System

12.4 Rigid Body Dynamics

12.5 Integrating a Physics Engine into Your Game

12.6 Advanced Physics Features
 
Zurück