Blender Animation mit OpenGL rendern

3D-Visualisierung mit der Open Graphics Library (OpenGL)
Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Blender Animation mit OpenGL rendern

Beitrag von Glocke » So Jan 27, 2013 11:22 am

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8721
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Blender Animation mit OpenGL rendern

Beitrag von Xin » Mo Jan 28, 2013 11:47 am

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Blender Animation mit OpenGL rendern

Beitrag von Glocke » Mo Jan 28, 2013 4:09 pm

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8721
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Blender Animation mit OpenGL rendern

Beitrag von Xin » Mo Jan 28, 2013 5:01 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Blender Animation mit OpenGL rendern

Beitrag von Glocke » Mo Jan 28, 2013 5:25 pm

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:

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8721
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Blender Animation mit OpenGL rendern

Beitrag von Xin » Mo Jan 28, 2013 5:34 pm

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!?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Blender Animation mit OpenGL rendern

Beitrag von Glocke » Mo Jan 28, 2013 5:42 pm

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

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Blender Animation mit OpenGL rendern

Beitrag von Kerli » Mo Jan 28, 2013 5:51 pm

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).
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Blender Animation mit OpenGL rendern

Beitrag von Glocke » Mo Jan 28, 2013 8:35 pm

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

Benutzeravatar
Fisherman
Beiträge: 84
Registriert: Mi Jun 06, 2012 4:53 am
Wohnort: 127.0.0.1

Re: Blender Animation mit OpenGL rendern

Beitrag von Fisherman » Di Jan 29, 2013 12:07 pm

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
There is no place like 127.0.0.1

Antworten