510 likes | 758 Views
Physikalische Simulation mit NVIDIA PhysX. 28.01.2009 David Riedmann André Müller. Inhalt. Grundlagen physikalischer Simulation Simulation von Bewegungen Probleme bei der Simulation Kollisionen, Stöße Beispielszenario/Demo PhysX Einführung in das SDK Spezialeffekte
E N D
Physikalische Simulationmit NVIDIA PhysX 28.01.2009 David Riedmann André Müller
Inhalt • Grundlagen physikalischer Simulation • Simulation von Bewegungen • Probleme bei der Simulation • Kollisionen, Stöße • Beispielszenario/Demo • PhysX • Einführung in das SDK • Spezialeffekte • Hardware-Beschleunigung • Demos
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 • IntegrationskonstantenAnfangsgeschwindigkeit 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 jedemZeitschritt 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 ofthe 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 Schwerpunktanalog 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ägheitsmomentz.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 • 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 • BoundingVolumes • einfache Hüllkörper nähern komplexe Formen an • Kugeln • Quader (Bounding Box, OrientedBounding 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 elastischkeine Energie geht verloren • 0 plastischStoß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 • ~ Anpresskraft • ~ Haftreibungskoeffizient • Gleitreibung • ~ Anpresskraft • ~ Gleitreibungskoeffizent • ~ Relativgeschwindigkeit reibender Objekte • Rollreibung • ~ Anpresskraft • ~ Rollreibungskoeffizient • Reibungskoeffizienten • Rollen < Gleiten < Haften
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
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;einePhysik-Engine die diePhysikberechnung auf die Grafikkarte holt
Interessantes über PhysX • September 2007: Intel kauft HavokHavok FX wird eingestellt, da Intels Grafikkarten zu schwach sind. • Februar 2008: NVIDIA übernimmt Ageia • August 2008: NVIDIA veröffentlicht“Geforce Power Pack“Jetztfinden die Berechnungenüber CUDA auf derGrafikkartestatt. • Ergebnis: Eine NVIDIA Grafikkarteistschnelleralseine Ageia Zusatzkarte + Grafikkarte
Harware-Beschleuningung: CUDA • ComputeUnified 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 istund 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 Cudahier
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* gPhysicsSDKNxCreatePhysicsSDK ( NxU32 sdkVersion, NxUserAllocator * allocator = NULL, NxUserOutputStream * outputStream = NULL, constNxPhysicsSDKDesc & 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) NxSceneDescsceneDesc; 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 NxActorDescactorDesc; NxBodyDescbodyDesc; NxBoxShapeDescboxDesc; 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 => ContinuousCollisionDetection
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 NxDistanceJointDescdistDesc; 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);
PhysX: Flüssigkeiten • Realisiert als Partikelsystem • PartikeleigenschaftenPosition, 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 • SmoothedParticle 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:NxActorDescactorDesc;NxBodyDescbodyDesc;.........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