Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

1

25.02.2010, 19:53

Wie Scenegraph und Physik zusammenführen?

Hi Leute!
Ich stehe vor einem Problem in einem (für mich) relativ neuen Bereich: "Die Eintwicklung eines Scenegraph und die Integrierung von PhysX"
Klingt gut?

Ich habe im Prinzip meine Basisklasse für meinen Scenegraph geschrieben: Sie arbeitet nach dem Parent-Child-Prinzip. Dabei wird die Worldmatrix (absout) eines Objektes berechnet, indem die Objectmatrix (relativ zum Parent) mit der Worldmatrix des Parents multipliziert wird.
- Somit kann man beispielsweise ein Sonnensystem simulieren.

Jetzt soll da aber noch PhysX rein! Es soll ja realistisch wirken.
Da stellt sich aber gleich schon das nächste Problem in dem Weg: Eine physikalische Simulation arbeitet nicht nach dem Parent-Child-Prinzip.
Da gibt es eine "Szene" mit vielen "Aktoren", die untereinander "agieren" (Kollision).
- Auf diese Aktoren kann man Kräfte einwirken lassen. Zum Beispiel beim Drücken der [W]-Taste ein Vorwärtsschub.

Mein Problem ist, dass ich beide Systeme irgendwie miteinander benutzen will. Die Hierarchie hat halt ihre Vorteile bei der hierarchichen Transformation, während "alles in einem Topf" physikalisch simuliert werden kann.


Dazu kommt gleich noch das nächste Problem: Wie benutzt man rekursives Animieren und explizites Animieren zusammen?
Ich rede von Controllern (Spieler, KI) + PhysX v.s. IpoCurves (Blendernutzer sollten die kennen).
Das erstere ist eben rekursiv: Es baut auf dem letzten Ergebnis aus und verändert Zustände abhängig von Zeitdifferenzen.
Das letztere wäre damit expliziz: Man gibt ihr die "aktuelle" Zeit und es sagt einem den Zustand.

Beide brauch ich: Das explizite System für Pfadanimationen (für z.B. "Kamerafahrten") oder festgelegt "Routen" von Objekten.
Das rekursive System ist Grundlage für physikalische Simulationen.


Ich hoffe ihr könnt mir da ein paar Anregungen geben.

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

2

26.02.2010, 22:09

Ich hab mal noch ein bisschen gesucht und etwas interessantes auf GameDev.net gefunden:
http://www.gamedev.net/community/forums/topic.asp?topic_id=550203

Da wird über das selbe Problem (SceneGraph + Physics) diskutiert. Am Ende kommt raus, dass beide Systeme nicht miteinander kombinierbar sind.
Was die Hierarchie angeht: Da gibt es in einer Physik-Engine Joints dafür. Also alles in eine Szene packen und mit Joints verbinden.
So könnte man beispielsweise die Autotür mit einem FixedJoint an da Auto kleben.
Wenn ich mir das so überlege, komm ich auch mit diesem Scene-System klar.

Und für das Animatio-System hab ich mir auch was einfallen lassen:
Jedes Objekt bekommt beim Erstellen einen "Animator". Davon gibt es 2 Stück: Der eine ist ein "expliziter", der andere ein "rekursiver".
Der Explizite Animator zählt die Zeit mit und holt dann die Zustandsdaten aus den IpoCurves.
Im Gegensatz dazu, arbeitet der Rekursive Animator mit Kräften, Beschleunigung, Geschwindigkeit, usw. Dazu hat er einen "Controler"- das kann der Input des Spielers sein oder KI. Dieser Controler sagt zum Beispiel: "Beschleunigung vorwärts", wenn der Gamer die [W]-Taste gedrückt hat. Die Auswirkung dieser Kräfte, etc. werden von der Physik-Engine berechnet. Das fertige Ergebnis - der "Zustand" - wird dann von der Physik-Engine abgeholt.

Wenn es zu Kollisionen kommen sollte:
Objekte mit expliziten Animatoren reagieren nicht auf Kollisionen. Sie haben praktisch eine unendliche Masse.
Wenn sie mit anderen expliziten Objekten kollidieren, dann passiert nicht. Sie fiegen einfach durch einander durch.
Rekursiv berechnete Objekte (die natürlich auch Physik-kontrolliert sind) würden bei Kollisionen untereinander und bei Kollisionen mit explizit animierten Objekten physikalisch richtig "reagieren".


Soweit mein Ansatz.
Habt ihr bessere? Habr ihr Tips bei der Implementation?
Zum Thema PhysX integrieren: Was haltet ihr für sinnvoller:
1.) PhysX komplett Wrappen und mit eigenen Klassen arbeiten
PRO: Eigene Doku möglich, PhysX wird "smart" gehalten.
CONTRA: Möglicherweise kein voller Umfang aller Funktionen verfügbar
2.) Jedes Object bekommt eine NxActor-Instanz und der User kann damit machen, was er will.
PRO: Alles (was PhysX bietet) ist möglich.
CONTRA: User muss auf einer Low-Level-Ebene arbeiten, nur die Original PhysX Doku ist verfügbar.

Ich tendiere eher zu 2.). Weil:
- Ich kann meine Math-Lib so anpassen, das sie mit PhysX sehr gut kombinierbar ist. Zum Beispiel Casting-Operatoren von meinen Quaternionen zu NxQuat und umgekeht von NxQuat per CTOR zu meinen Quaternionen.
- PhysX eine sehr gute Doku bietet, viele Samples und Training Programs
- PhysX ist meiner Meinung nach nicht so Low-Level wie das zum Beispiel bei Direct3D der Fall ist.

Was würdet ihr tun? Wie würdet ihr es tun?
Ich freue mich über jeden Ratschlag und jede Erfahrung! :D

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

3

26.02.2010, 22:34

also ich habe jedem objekt immer eine instanze des nxactors gegeben. wenn du sowas warppen willst, hast du ne menge arbeit (siehe nxogre, wrapper für ogre3d). und die physX engine ist schon sehr gut gemacht, also nicht so die low-level sache.
dazu würde ich sagen, dass sich der aufwand überhaupt nicht lohnt, extra für deinen scenengraph/scenengeschichte nen wrapper zu schreiben. ich persönlich ändere alle paar tage doch was in der vorgehnsweise, zwar nur kleine dinge, aber die würden schon reichen, um so nen wrapper nicht mehr richtig funktionieren zu lassen :)

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

4

27.02.2010, 12:25

Dein Animationsproblem verstehe ich nicht so ganz.. Wenn du Kollisionen verhindern willst kannst du doch auch temporär die physikalische Simulation abschalten? Ich hatte damals für Charaktere nen Character Controller, und die Ragdoll erst bei Tod erzeugt wenn der Character Controller entfernt wurde.

Ansonsten würd ich dir auch zu 2 raten, nochmal alles wrappen wäre doch der totale Overhead, dafür gibts ja gerade ne Physikengine. Zumal du in Teufels Küche kommst, wenn du sowas wie nen Ogre Wrapper schreibst und dann mal die Sachen ohne Grafik nutzen willst, zB serverseitig.

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

5

27.02.2010, 19:34

Also ich würde auch die zweite Möglichkeit wählen und habe das auch selber schon so gehandhabt. Ist einfach das einfachste.

Du musst die Low-Level-Ebene ja nicht unbedingt sichtbar werden lassen, indem du dennoch eigene Funktionen implementierst, die nichts weiter machen als Funktionen von NxActor zu verarbeiten. So nutzt der User deine Engine-Funktionen und muss sich nicht mit PhysX rumschlagen, kann aber theoretisch(je nach Klassendesign) dennoch auf den Actor zugreifen.

Werbeanzeige