Seite 1 von 3

Blender Animation mit OpenGL rendern

Verfasst: So Jan 27, 2013 11:22 am
von Glocke
Hiho,

folgendes Problem: Wie rendere ich eine Blender-Animation mit OpenGL unter Verwendung von C++?
Beim Googlen bin ich darauf gestoßen: Export als .obj-File. Die dann vom Programm parsen lassen und die Vertices etc. mit OpenGL rendern. Allerdings geht das nur für statische Objekte, richtig? Wie gehe ich vor, wenn ich bei einer Animation verschiedene Teile des Meshs verschieben oder drehen muss. Beschreibe ich die Verschiebung und Drehung (ähnlich wie die Vertices in der obj-File) oder ist da eine andere Lösung "schöner"?

Btw möchte ich keine fertige Engine verwenden, sondern wirklich grundlegend arbeiten - hauptsächlich des Verstehens wegen.

LG Glocke

Re: Blender Animation mit OpenGL rendern

Verfasst: Mo Jan 28, 2013 11:47 am
von Xin
Glocke hat geschrieben:folgendes Problem: Wie rendere ich eine Blender-Animation mit OpenGL unter Verwendung von C++?
Interessante Frage - geht das?
Glocke hat geschrieben:Beim Googlen bin ich darauf gestoßen: Export als .obj-File. Die dann vom Programm parsen lassen und die Vertices etc. mit OpenGL rendern. Allerdings geht das nur für statische Objekte, richtig?
WaveFront Obj unterstützt meines Wissens keine Animation.
Glocke hat geschrieben:Wie gehe ich vor, wenn ich bei einer Animation verschiedene Teile des Meshs verschieben oder drehen muss. Beschreibe ich die Verschiebung und Drehung (ähnlich wie die Vertices in der obj-File) oder ist da eine andere Lösung "schöner"?
Wo möchtest Du die Transformation denn beschreiben? Möchtest Du das in einem Textfile beschreiben oder in C++?
In einem Textfile müsstest Du natürlich erstmal einen Interpreter dafür haben, wie Du ja auch WaveFront erstmal lesen musst (was zugegebenermaßen recht einfach ist)

Ich würde einfach die Objekte in Strukturen einlesen und diese dann rendern lassen. Vor dem Rendern kann man die Matrix ja entsprechend transformieren.

Re: Blender Animation mit OpenGL rendern

Verfasst: Mo Jan 28, 2013 4:09 pm
von Glocke
Xin hat geschrieben:
Glocke hat geschrieben:folgendes Problem: Wie rendere ich eine Blender-Animation mit OpenGL unter Verwendung von C++?
Interessante Frage - geht das?
Blender-Animationen (wie ich sie vom gezeigt bekomme kenne) sind skeletal, d.h. mit "Bone"-Vertices.
Xin hat geschrieben: Wo möchtest Du die Transformation denn beschreiben? Möchtest Du das in einem Textfile beschreiben oder in C++?
In einem Textfile müsstest Du natürlich erstmal einen Interpreter dafür haben, wie Du ja auch WaveFront erstmal lesen musst (was zugegebenermaßen recht einfach ist)

Ich würde einfach die Objekte in Strukturen einlesen und diese dann rendern lassen. Vor dem Rendern kann man die Matrix ja entsprechend transformieren.
Naja prinzipiell kümmert sich mein Grafiker um die Animationen, d.h. ich würde sie gerne aus einer Datei lesen. Das nächste wäre dann das Handhaben der Animation in C++. Bewege ich nur die Bone-Vertices und die (von der entsprechenden Bone-Vertex) abhängigen Vertices werden in Abhängigkeit zum Bone-Vertex gerendert? (z.B. indem ich so einem abhängigen Vertex einen Pointer auf den Bone-Vertex und einen Richtungsvektor - wie dieser zum Bone-Vertex liegt - gebe?)

LG Glocke

Re: Blender Animation mit OpenGL rendern

Verfasst: Mo Jan 28, 2013 5:01 pm
von Xin
Glocke hat geschrieben:
Xin hat geschrieben:
Glocke hat geschrieben:folgendes Problem: Wie rendere ich eine Blender-Animation mit OpenGL unter Verwendung von C++?
Interessante Frage - geht das?
Blender-Animationen (wie ich sie vom gezeigt bekomme kenne) sind skeletal, d.h. mit "Bone"-Vertices.
Blender möchte ich mir auch mal halbwegs brauchbar aneignen.

Hier ist aber doch die Frage, wie diese Animationen gespeichert werden - und wie Du sie wieder einlesen kannst.
Xin hat geschrieben:Ich würde einfach die Objekte in Strukturen einlesen und diese dann rendern lassen. Vor dem Rendern kann man die Matrix ja entsprechend transformieren.
Naja prinzipiell kümmert sich mein Grafiker um die Animationen, d.h. ich würde sie gerne aus einer Datei lesen. Das nächste wäre dann das Handhaben der Animation in C++. Bewege ich nur die Bone-Vertices und die (von der entsprechenden Bone-Vertex) abhängigen Vertices werden in Abhängigkeit zum Bone-Vertex gerendert? (z.B. indem ich so einem abhängigen Vertex einen Pointer auf den Bone-Vertex und einen Richtungsvektor - wie dieser zum Bone-Vertex liegt - gebe?)[/quote]
Ich bin da noch nciht sonderlich firm drin. Aber praktisch lädst Du doch erstmal nur ein Objekt ein und musst die Bone-Verbindungen speichern.
Also "Körper oben" an "Oberarm oben" und "Oberarm unten" an "Unterarm oben".

Rotiert der Körper, muss der an der Körperachse Oberarm mitrotieren. Da der Oberarm um die Körperachse rotiert, muss der Unterarm auch mit, sonst verlöre er ja die Verbindung.
Rotiert der Oberarm nun um die Verbindung "Körper<->Oberarm", muss der Unterarm entsprechend auch mit. Und so weiter.

Jeder "Bone" besitzt seine eigene Positionsmatrix, jeder Ast seine eigene Transformationsmatrix. Körper rotiert, der Ast "Arm" rotiert mit. Die Arm-Transformation muss also auf Ober- und Unterarm angewandt werden. Der Körper ist fertig => rendern. Dreht sich der Oberarm, kann man das einfach auf die Ast-Transformation draufpacken und die AstTransformation auf die Position vom Oberarm verrechnen. Oberarm rendern => Rotiert der Unterarm im Ellbogen, packt man das wieder auf den Ast drauf und die Ast-Trafo wieder auf die Position des Unterarms. Unterarm rendern.

Die Positionsmatrix der Bones enthält ihre Position im Vergleich zum übergeordneten Bone - also Unterarm unterhalb von Oberarm.

So stelle ich mir das vor - aber entwickelt ahbe ich das noch nicht.

Re: Blender Animation mit OpenGL rendern

Verfasst: Mo Jan 28, 2013 5:25 pm
von Glocke
Xin hat geschrieben:Ich bin da noch nciht sonderlich firm drin. Aber praktisch lädst Du doch erstmal nur ein Objekt ein und musst die Bone-Verbindungen speichern.
Also "Körper oben" an "Oberarm oben" und "Oberarm unten" an "Unterarm oben".

Rotiert der Körper, muss der an der Körperachse Oberarm mitrotieren. Da der Oberarm um die Körperachse rotiert, muss der Unterarm auch mit, sonst verlöre er ja die Verbindung.
Rotiert der Oberarm nun um die Verbindung "Körper<->Oberarm", muss der Unterarm entsprechend auch mit. Und so weiter.

Jeder "Bone" besitzt seine eigene Positionsmatrix, jeder Ast seine eigene Transformationsmatrix. Körper rotiert, der Ast "Arm" rotiert mit. Die Arm-Transformation muss also auf Ober- und Unterarm angewandt werden. Der Körper ist fertig => rendern. Dreht sich der Oberarm, kann man das einfach auf die Ast-Transformation draufpacken und die AstTransformation auf die Position vom Oberarm verrechnen. Oberarm rendern => Rotiert der Unterarm im Ellbogen, packt man das wieder auf den Ast drauf und die Ast-Trafo wieder auf die Position des Unterarms. Unterarm rendern.

Die Positionsmatrix der Bones enthält ihre Position im Vergleich zum übergeordneten Bone - also Unterarm unterhalb von Oberarm.

So stelle ich mir das vor - aber entwickelt ahbe ich das noch nicht.
So habe ich das prinzipiell auch im Kopf :mrgreen: Wahrscheinlich muss ich "notfalls" die binären .blender-Dateien von meinem Programm einlesen lassen. Allerdings graut es mir davor gerade :lol:

Re: Blender Animation mit OpenGL rendern

Verfasst: Mo Jan 28, 2013 5:34 pm
von Xin
Glocke hat geschrieben:So habe ich das prinzipiell auch im Kopf :mrgreen: Wahrscheinlich muss ich "notfalls" die binären .blender-Dateien von meinem Programm einlesen lassen. Allerdings graut es mir davor gerade :lol:
Das kann ich verstehen... *lach* ^^

Vielleicht kann man da einen Python-Exporter in ein günstigeres Format schreiben!?

Re: Blender Animation mit OpenGL rendern

Verfasst: Mo Jan 28, 2013 5:42 pm
von Glocke
Xin hat geschrieben:Vielleicht kann man da einen Python-Exporter in ein günstigeres Format schreiben!?
Prinzipiell sollte das gehen. Ich werd mich mal genauer schlau machen :D

Re: Blender Animation mit OpenGL rendern

Verfasst: Mo Jan 28, 2013 5:51 pm
von Kerli
Es gibt bereits Exporter (und auch Importer) für Unmengen an verschiedenen Formaten. Da muss man dann schauen was für Features man braucht bzw. auch ob man bereits Unterstützung für ein bestimmtes Format hat.

Man sollte übrigens zwischen Skeletal/Bone Animation und Animation von Objekten unterscheiden. Im ersten Fall hat man ein (unsichtbares Skelett und die einzelnen Knochen beeinflussen die Oberfläche (Haut) des Objekts, während bei zweiterem einzelnen Objekte (hierarchisch) transformiert werden (zb. Objekt Oberarm wird rotiert).

Re: Blender Animation mit OpenGL rendern

Verfasst: Mo Jan 28, 2013 8:35 pm
von Glocke
Kerli hat geschrieben:Man sollte übrigens zwischen Skeletal/Bone Animation und Animation von Objekten unterscheiden. Im ersten Fall hat man ein (unsichtbares Skelett und die einzelnen Knochen beeinflussen die Oberfläche (Haut) des Objekts, während bei zweiterem einzelnen Objekte (hierarchisch) transformiert werden (zb. Objekt Oberarm wird rotiert).
Meinst du damit das http://en.wikipedia.org/wiki/Per-vertex_animation ?
Kerli hat geschrieben:Es gibt bereits Exporter (und auch Importer) für Unmengen an verschiedenen Formaten. Da muss man dann schauen was für Features man braucht bzw. auch ob man bereits Unterstützung für ein bestimmtes Format hat.
Dann könnte ich prinzipiell mit http://en.wikipedia.org/wiki/MD3_(file_format) arbeiten.

LG Glocke

Re: Blender Animation mit OpenGL rendern

Verfasst: Di Jan 29, 2013 12:07 pm
von Fisherman
Hi,

ich denke mal du suchst dies hier ... Schau dir die Seite in Ruhe an, der Quellcode ist ebenfalls offen und damit kannst du dann denke ich weiterarbeiten. In der aktuellen Version kann OpenAsset mit .blend Files umgehen und alle relevanten Teile auslesen (Animationen - Bones, ...).
Wie gesagt - Quellcode studieren genauso wie du es wolltest - von der "Picke auf ..."

Gruß Fisherman

PS: Ansonsten gibt es noch die Blender Python API