Physik und 3D

Aus DGL Wiki
Wechseln zu: Navigation, Suche

Wir nehmen an, dass uns ein hübsches Mesh (eine Ansammlung von Dreiecken) zur Verfügung steht, sagen wir mal: ein Kämpfer-Modell. Wir laden diese Daten mal in den Hauptspeicher. Anhand dieses Mesh kann man jetzt auf automatisierte Weise ein vereinfachtes grobes Mesh herstellen, oder auch nur eine Bounding Box (bzw. irgend ein anderes Bounding Volume) des Mesh berechnen oder vielleicht sind solche Daten sogar in der Meshdatei vorhanden. Die Mesh-Daten, die zum Zeichnen bestimmt sind, schicken wir an die Grafikkarte weiter, damit sie schnell gezeichnet werden können. Diese Daten sehen den Hauptspeicher normalerweise nie wieder. Man könnte die Vertex-Daten schon wieder zurücklesen, aber es ist gar nicht nötig und auch kontraproduktiv, denn es wäre viel zu langsam.

Das vereinfachte Mesh (oder die Bounding Box) behalten wir im Hauptspeicher zurück. Das ist eine „dünne“ Repräsentation unseres Modells. Je „dünner“ (also je weniger Daten es hat), desto besser (nämlich schneller), aber auch nicht zu dünn, sonst werden unsere Berechnungen zu ungenau. Hier muss man sich zwischen Geschwindigkeit und Genauigkeit entscheiden. Das Schnellste, was man hier nehmen kann, ist eine Kugel (Bounding Sphere), aber unser Kämpfer wird durch eine simple Kugel ziemlich schlecht repräsentiert.

Auf dieses Pseudomesh und einige andere Physik-Daten (Masse, Geschwindigkeit, augenblickliche Position und Orientierung etc.) werden jetzt die Physikberechnungen angewendet (Anwenden von Kräften, Kollisionsberechnungen). Wenn man eine externe Physik-Engine verwendet, wäre die Struktur der Daten zwar von der Physik-Engine bestimmt, aber in welchem Umfeld sie gespeichert werden, ist unsere Sache. Das Pseudomesh und seine zugehörigen Physik-Daten könnte man z.B. in ein Objekt kapseln, denn sie gehören eindeutig zusammen.

Wichtiger ist aber, dass das Ergebnis der Physik-Berechnungen Verschiebungen und Drehungen sind. Diese verändern die aktuelle Position und Orientierung und ergeben eine NEUE Position und Orientierung. Im nächsten Renderpass fließt diese neue Position/Orientierung aus der Physikberechnung daher in die Renderpipline mit ein, z.B. einfach als glTranslate/glRotate. Ja, es wird normalerweise glMultMatrix benutzt, aber ein einfaches glTranslate/glRotate tut genau dasselbe.

Wenn wir allerdings für unser Kämpfer-Modell wirklich nur eine Bounding Box haben, sehen wir ganz schön alt aus. Besser wäre hier z.B. eine Ansammlung von Bounding Boxen: eine für die Brust, je eine für die Oberarme, Unterarme, usw.

Kollisionskörper werden „Bounding Volumes“ genannt. Für ein Mesh, dass sich per Skelett bewegt („skeletale Animation“) gibt es nicht nur ein Bounding Volume, sondern gleich eine ganze Hierarchie davon, für jedes Bone eines.

Bei der Demonstration von Physik-Engines sieht man manchmal solche Bounding Volumes, die hier ausnahmsweise auch gezeichnet werden.

Siehe Auch

Tutorial_Kollision1 
Erstes Tutorial der 3 teiligen Serie über Kollisionsberechnung. Hier lernt ihr, wie ihr selbst Kollisionen zwischen Objekten erkennt und behandelt.