[C++] Klassen-Properties für Transformationen

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

[C++] Klassen-Properties für Transformationen

Beitrag von BeRsErKeR »

Hallo von C# her kennt man ja Builtin-Properties für Klassen. In meinem Fall geht es allerdings um C++ und ich brauche hier Properties für folgenden Fall:

Ich habe eine Szene, in der beliebige Spiel-Objekte vorhanden sein können (Baumstruktur). Spiel-Objekte können ihrerseits wieder aus mehreren anderen Spiel-Objekten zusammengesetzt sein. Möchte ich nun ein Spiel-Objekt transformieren, so sollen die Kind-Objekte entsprechend mit transformiert werden. Also was ganz Gewöhnliches.

Die Spielobjekte haben Member für Position, Rotation und Skalierung. Mein Ziel war nun, dass man direkt diese Membervariablen ändern kann und die Transformation automatisch an die Kind-Objekte weitergegeben wird. In C# könnte man das wie gesagt als Property implementieren und im Setter einfach für alle Kind-Elemente ebenfalls deren Properties ändern. In C++ geht das leider nicht so einfach.

Bislang löse ich das Problem, indem ich Methoden wie setPosition, move, setRotation, rotate, setScale und scale anbiete. Allerdings schränkt das wieder ein, da die Position ein Vektor ist und z.B. Multiplikationen wieder durch zusätzliche Methoden wie mulPosition oder Ähnliches realisiert werden muss.

Mir schwebt sowas vor:

Code: Alles auswählen

myGameObject.Position *= myVector;
myGameObject.Scale.X = 0.5f;
...
Meine Idee wäre jetzt eine Hilfsklasse, die z.B. einen Vektor kapselt und irgendwelche Events für Änderungen enthält. Aber das kann für so einen Fall ja auch keine Lösung sein.

Wie löst ihr sowas bzw. habt ihr da ein paar Vorschläge zu?
Ohne Input kein Output.
Benutzeravatar
B.G.Michi
Establishment
Beiträge: 163
Registriert: 07.03.2006, 20:38
Alter Benutzername: B.G.Michi
Kontaktdaten:

Re: [C++] Klassen-Properties für Transformationen

Beitrag von B.G.Michi »

Das würde ich mir zwei mal überlegen. Stell dir vor du hast einen großen Scenegraphen und änderst ein Objekt in der Hierarchie nah am Root und dann dessen Child. Du würdest alle Child-Childs komplett doppelt berechnen. Außerdem hast du ja schon festgestellt, dass das, was du vor hast, in C++ schlecht (oder zumindest nur umständlich) umzusetzen ist.
Ich verwende im Endeffekt, 2 Matrizen pro Objekt: die relative Transformation zum Parent und die absolute Transformation in Weltkoordinaten. Zusätzlich einen Boolean ob sich die relative Transformation geändert hat. Eine Methode SetTransform, die die relative Transformation setzt und den Boolean auf 'true' setzt. Somit werden alle Transformationen geupdated (z.B. durch die Physikengine) und danach der Scenegraph erneut durchlaufen um die absoluten Transformationen zu berechnen. Und zwar nur für die Objekte, deren, oder deren Parent' Transformation sich auch geändert hat.
Wie lösen das die Profis hier im Forum?
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Re: [C++] Klassen-Properties für Transformationen

Beitrag von BeRsErKeR »

Danke für die Antwort. Ich glaube ich mach das zu kompliziert. Prinzipiell brauch ich die Positionen, Rotationen und Skalierungen gar nicht für Kindelemente ändern wenn sich der Elternknoten ändern, sondern nur beim Zeichnen relative Werte nutzen. Das läuft ja nur auf ein paar Additionen hinaus. Die Frage ist ob das zu langsam werden könnte, aber prinzipiell muss ich ja für alle Kindelemente nur einmal die Ausgangstransformation des Parents setzen und dann normal mit den relativen Werten zeichnen, also nicht mal selbst Berechnungen durchführen. Allerdings müsste ich das dann für jeden Pfad im Baum neu machen oder Teil-Transformationen rückgängig machen. Hmm ich kann gerade nicht so gut einschätzen wie das performance-technisch ausschaut.
Ohne Input kein Output.
Antworten