Physikalische Simulation mit NVIDIA PhysX 28.01.2009 David Riedmann André Müller
Inhalt Grundlagen physikalischer Simulation PhysX Simulation von Bewegungen Probleme bei der Simulation Kollisionen, Stöße Beispielszenario/Demo PhysX Einführung in das SDK Spezialeffekte Hardware-Beschleunigung Demos
Grundlagen physikalischer Simulation
Beschreibung von Bewegungen Position eines Objektes: Geschwindigkeit Änderungsrate der Position erste Ableitung nach der Zeit: Beschleunigung Änderungsrate der Geschwindigkeit zweite Ableitung nach der Zeit:
BEISPIEL: Objekt im freien Fall Bewegungsgleichung Beschleunigung = Erdbeschleunigung Lösung: Integrieren einmal Integrieren ergibt Geschwindigkeit nochmal Integrieren ergibt Position Integrationskonstanten Anfangsgeschwindigkeit und -position
In der Simulation Differenzialgleichungen numerisch lösen iteriere über diskrete Zeitschritte addiere Änderungsraten in jedem Zeitschritt Explizites Eulerverfahren in jedem Zeitschritt implizite Verfahren, Runge-Kutta mehrere Zeitschritte in die Zukunft mit verschiedenen Gewichtungen Beschleunigung abhängig von zukünftigen Kräften
Probleme bei der Simulation Energieerhaltung kann verletzt werden Objekte werden z.B. immer schneller Bewegung nicht exakt kein Stillstand/ständige kleine Bewegungen Durchdringungen bei Kollision Ursachen endliche Zeitschritte Rundungsungenauigkeiten (Fließkommazahlen)
Lösungsmöglichkeiten Zeitschritte verkleinern Rechenzeit! Unerlaubte Durchdringungen in jedem Zeitschritt nachträglich beseitigen eventuell unnatürliche Bewegungen/Sprünge Reibungen vergrößern zehrt unerlaubte Energiezunahme auf muss genau eingestellt werden, damit realistisch Plastische statt elastische Kollisionen „weiche“ Stöße verringert Energie
State of the Art - Methoden Langrange-Multiplikator-Methoden bilde Lösung der DGLs auf die Lösung von linearen Gleichungssystemen ab: Linear Complementary Problems (LCP) Nebenbedingungen für Durchdringungsfreiheit Herausforderungen/Probleme singuläre Matrizen schwach besetzte Matrizen Integrator-Probleme bleiben
Rotationen Darstellung über Winkel, 3x3 Drehmatrix oder Quaternion (4-Tupel) Rotation um feste Achse durch Schwerpunkt analog zur Translation Position Winkel/Matrix/Quaternion Geschwindigkeit Winkelgeschwindigkeit (Drehachse) Beschleunigung Winkelbeschleunigung Masse Trägheitsmoment Kraft Drehmoment Drehachse im Allgemienen nicht konstant!
Rotationen um beliebige Achsen Veränderung der Drehachse durch Kollisionen oder beim Rollen in jedem Zeitschritt momentane Drehung und Drehachse aktualisieren Trägheitsmoment abhängig von der momentanen Drehachse Trägheitstensor (Darstellung als 3x3-Matrix) bei Drehungen um einer der drei Hauptträgheitsachsen oder dazu Parallele reicht ein skalares Trägheitsmoment z.B. bei gelagerten Drehachsen (Fahrzeugräder)
Externe Kräfte / Drehmomente beschleunigen Objekte Beschleunigung hängt von Objektmasse 𝑚 ab Winkelbeschleunigung hängt von Trägheitstensor ab Kräfte darstellbar als Kraftvektor Vektorfelder (Kraftvektor abhängig von Position) darstellbare Effekte Gravitation Wind Magnetfelder
Zustand eines Objektes Masse Position (Vektor) Geschwindigkeit (Vektor) Drehung (Winkel/3x3-Matrix/Quaternion) Trägheitstensor (3x3-Matrix) Winkelgeschwindigkeit/Drehachse (Vektor) Zustandsänderungen durch Käfte Beschleunigungen Drehmomente Winkelbeschleunigungen
Kollisionserkennung Kugeln Quader / Dreiecksobjekte Kollision falls Summe der Radien > Abstand der Mittelpunkte Quader / Dreiecksobjekte Separating Axis Theorem projiziere Objektausdehnung auf alle möglichen Achsenrichtungen wenn Projektionsintervalle nicht überlappen keine Kollision
Kollisionserkennung N Objekte Paare Objekte mit vielen Dreiecken viele Rechenoperationen/Abfragen Bounding Volumes einfache Hüllkörper nähern komplexe Formen an Kugeln Quader (Bounding Box, Oriented Bounding Box) Kapseln (Zylinder mit angeflanschten Halbkugeln) Space Partitioning (Octree) finde wahrscheinliche Kollisionspaare in
Stoßprozesse an der Ebene: Einfallswinkel = Ausfallswinkel Geschwindigkeit Komponente parallel zur Wand bleibt gleich Komponente senkrecht zur Wand ändert Vorzeichen Elastizität 1 elastisch keine Energie geht verloren 0 plastisch Stoßpartner nach Stoß in Ruhe
Stoßprozesse: 2 identische Kugeln Geschwindigkeit Tangentialkomponente unverändert Radialkomponente wird ausgetauscht
Stoßprozesse: verschiedene Kugeln Impulserhaltung + Energieerhaltung Elastischer Stoß: Summe der Impulse/Energien vor und nach dem Stoß gleich Radialgeschwindigkeiten nach dem Stoß abhängig von den Massen der Stoßpartner: Einfache Implementierung nicht-elastischer Stöße: reduziere beide Geschwindigkeiten um Faktor
Stoßprozesse Allgemein Impulserhaltung + Energieerhaltung für rotierende Objekte führt auf Newton-Hypothese beschreibt Änderung der Geschwindigkeiten und Winkelgeschwindigkeiten beim Stoß Parameter: Elastizität wie zuvor
Reibungen Haftreibung Gleitreibung Rollreibung Reibungskoeffizienten ~ Anpresskraft ~ Haftreibungskoeffizient Gleitreibung ~ Gleitreibungskoeffizent ~ Relativgeschwindigkeit reibender Objekte Rollreibung ~ Rollreibungskoeffizient Reibungskoeffizienten Rollen < Gleiten < Haften
Beispielszenario
Beispielszenario geschlossener würfelförmiger Behälter Mittelpunkt im Ursprung Seitenlänge 2L (veränderbar) N Kugeln im Innern Stöße (Elastizität einstellbar) Kugel-Wand Kugel-Kugel Schwerkraft in Richtung (0,-g,0) (einstellbar) keine Rotation/Rollen
Beispielszenario – Implementierung explizites Euler-Verfahren
Beispiel: Kollision Kugel-Wand
Beispiel: Kollision Kugel-Kugel
Einführung in das PhysX SDK Grundlagen / Konventionen Initialisierung Aktoren Gelenke Effektoren Spezialeffekte
Interessantes über PhysX 2002 Gründung von Ageia als StartUp Entwicklung und Veröffentlichung von PhysX (vormals NovodeX) im Mai 2006 PhysX besteht aus zwei Komponenten (SDK und einer Zusatzkarte) Zeitgleich entwickelt Havok zusammen mit NVIDIA Havok FX; eine Physik-Engine die die Physikberechnung auf die Grafikkarte holt
Interessantes über PhysX September 2007: Intel kauft Havok Havok FX wird eingestellt, da Intels Grafikkarten zu schwach sind. Februar 2008: NVIDIA übernimmt Ageia August 2008: NVIDIA veröffentlicht “Geforce Power Pack“ Jetzt finden die Berechnungen über CUDA auf der Grafikkarte statt. Ergebnis: Eine NVIDIA Grafikkarte ist schneller als eine Ageia Zusatzkarte + Grafikkarte
Harware-Beschleuningung: CUDA Compute Unified Device Architecture Berechnungen über GPU und Texturspeicher nutzt im Prinzip gleiche Hardware- Mechanismen wie Shaderprogramme CUDA normalerweise: C-Funktionen „Kernels“ für die GPU mit speziellem NVIDIA Compiler kompilieren PhysX: kein extra CUDA-Code notwendig PhysX erkennt automatisch, ob ein CUDA- fähiger Grafikkartentreiber installiert ist und führt dann Berechnungen auf der GPU aus.
Harware-Beschleuningung: CUDA Aktuelle Leistungsdaten (theoretisch): NVIDIA GeForce GTX 285: 1,06 TFLOP AMD HD 4870 (RV770) X2: 2,4 TFLOP Core 2 Quad bei 3 Ghz: 96 GFLOPS Mehr Infos zu Cuda hier
SDK: Prinzipielles Physikalische Eigenschaften und Zustände von der Geometrie entkoppelt spezielle Import-Funktionalität für Geometrie für Cloth und Soft Bodies noch Vorbereitung notwendig Punktverschmelzung möglich Abfasen von Kanten
SDK: Initialisierung NxPhysicsSDK* gPhysicsSDK NxCreatePhysicsSDK ( NxU32 sdkVersion, NxUserAllocator * allocator = NULL, NxUserOutputStream * outputStream = NULL, const NxPhysicsSDKDesc & desc = NxPhysicsSDKDesc(), NxSDKCreateError * errorCode = NULL ) erstellt bei Vorhandensein des richtigen SDK eine Instanz des PhysX SDK Singleton/ReferenceCounting für jeden Call Release für jede Instanz
SDK: Szene initialisieren Definition: Eine Szene ist ein Container für Actors (Körper) Joints (Gelenke) Effectors (Kräfte) NxSceneDesc sceneDesc; sceneDesc.gravity = gDefaultGravity; NXScene *gScene = gPhysicsSDK-> createScene(sceneDesc);
SDK: Actor erstellen Ein Actor ist das wesentliche Simulationsobjekt von PhysX wird von einer Szene erstellt und ist in ihr enthalten Kann dynamisch (Body vorhanden) oder statisch (Body nicht vorhanden) sein. referenziert 0 (dynamisch), 1(statisch) oder mehrere Shapes
SDK: Shapes sind an Aktoren gebunden enthalten darstellbare Geometrie enthalten Materialeigenschaften Shape-Typen Kugeln Quader Kapseln Konvexes Mesh Dreiecks-Mesh
SDK: Actor Beispielcode NxActorDesc actorDesc; NxBodyDesc bodyDesc; NxBoxShapeDesc boxDesc; boxDesc.dimensions.set( 1, 1, 10); boxDesc.localPose.t = NxVec3(0, 0, 0); actorDesc.body = &bodyDesc; actorDesc.density = 1.0f; actorDesc.globalPose.t = NxVec3(-10,40,10); NxActor *gBox = gScene->createActor(actorDesc); if(gBox) gBox->setLinearVelocity(NxVec3(0,50,0));
SDK: Massebestimmung eines actors erfolgt über das Shape Möglichkeiten der Angabe einer Masse: Masse > 0; keine Dichte und Trägheitstensor Dichte > 0; keine Masse und Trägheitstensor Masse > 0, Trägheitstensor >0; keine Dichte andernfalls schlägt das Erzeugen des Actors fehl aus Dichteinformation wird Masse anhand der Shapegeometrie errechnet
SDK: Materialen Material bestimmt Eigenschaften Elastizität Reibung (Gleit- und Haftreibung) Besonderheit: anisotrope Reibung Masse/Massendichte Problem: Eigenschaften nicht nur von einem Material abhängig Combine-Methoden: (min, max, avg, multiply) zukünftig bewegte Oberflächen und andere Arten der Reibung (Punktreibung)
SDK: Kollision zwischen Aktoren Bedingungen für Kollisionserkennung mindestens einer der Aktoren muss dynamisch sein Kollisionen zwischen den Gruppen der Aktoren müssen deaktiviert sein insbesondere Kollision zwischen Aktoren oder Shapes ist nicht deaktiviert Problem: schnelle Bewegung bei zu großen Zeitschritten => Continuous Collision Detection
SDK: Joints Ein Joint, auch Constraint genannt, referenziert immer zwei Actors und setzt deren Bewegung in Beziehung zueinander. Der Aufwand der Berechnung eines Joints hängt unmittelbar von der Anzahl der Freiheitsgrade (maximal 6) ab. Kann dynamisch (Body vorhanden) oder statisch (Body nicht vorhanden) sein. Je nach Anwendungsgebiet gibt es angepasste Joints: NxDistanceJoint, NxCylindricalJoint, NxD6Joint, …
SDK: Joints Beispielcode NxDistanceJointDesc distDesc; distDesc.actor[0] = pSphere1; distDesc.actor[1] = pSphere2; distDesc.localAnchor[0].zero(); distDesc.localAnchor[1].zero(); NxSpringDesc spring; spring.spring = 100; spring.damper = 0.5; distDesc.spring = spring; NxJoint *pJoints = gScene->createJoint(distDesc);
SDK: Architektur-Diagramm
PhysX: Flüssigkeiten Realisiert als Partikelsystem Szenen-Setup Partikeleigenschaften Position, Geschwindigkeit, Lebenszeit, Dichte,… Szenen-Setup Quellen (Emitter), kann an Shapes gebunden werden Senken (Drain) zusätzliche Manipulationsmöglichkeiten: Partikel hinzufügen, updaten, löschen 3 Berechnungsmethoden zur Auswahl Smoothed Particle Hydrodynamics (SPH) schnell, numerisch robust keine Interaktion zwischen Partikeln gemischt
PhysX: Soft Bodies Realisiert als Feder-Masse-System benutzt den Cloth-Solver erfordert Tetraedrisierung von Objekten Federn an den Tetraederkanten hält Tetraedervolumina konstant Dehnungsbeschränkung
PhysX: Cloth (Textilien) Parameter Biegesteifigkeit, Zugsteifigkeit Dichte, Dicke Dämpfung, Reibung externe Kräfte (Wind, Schwerkraft) zulässige Dehnungs- und Biegegrenzen Massepunkte lassen sich an Festkörperpunkte/Shapes binden Realisiert als Feder-Masse-System Selbst-Kollision Kollision mit festen Körpern
SDK: Konventionen Rückgabewerte und Parameter die NULL sein dürfen, werden als Pointer übergeben. Überprüfen der Gültigkeit/ungewohnter Code: NxActorDesc actorDesc; NxBodyDesc bodyDesc; ......... actorDesc.body = &bodyDesc;
SDK: Konventionen Rückgabewerte und Parameter die nicht NULL sein dürfen, werden als Referenzen übergeben. Vorteile: Es werden keine überflüssigen Kopien angelegt und Überprüfung auf NULL überflüssig. Objekte werden nicht direkt erstellt. Sondern über Deskriptoren von einer übergeordneten Instanz erzeugt.
Simulationen laufen asynchron Rigid Bodies Flüssigkeiten Cloth Soft Bodies Kraftfelder
PhysX Threading Interface sceneDesc.flags &= ~NX_SF_SIMULATE_SEPARATE_THREAD; sceneDesc.flags |= NX_SF_SIMULATE_SEPARATE_THREAD; Weiteres Flag: NX_SF_ENABLE_MULTITHREAD
PhysX Performnace Quelle: www.computerbase.de
Quellen www.nvidia.com http://www.computerbase.de/artikel/hardware/grafik karten/2008/bericht_nvidia_cuda_physx_ueberblick/1 http://www.heise.de/newsticker/Radeon-HD-4870-X2- AMD-stellt-schnellste-Grafikkarte-vor-- /meldung/114131 http://www.heise.de/newsticker/Nvidia-kuendigt- GeForce-GTX-285-an--/meldung/121359 http://www.cebit.de/newsanzeige_d?news=34080&ta g=1213567201&source=/newsarchiv_d&noindex http://ode.org/slides/parc/dynamics.pdf