Blender Animation mit OpenGL rendern

3D-Visualisierung mit der Open Graphics Library (OpenGL)
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8507
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Blender Animation mit OpenGL rendern

Beitrag von Xin » Mi Jan 30, 2013 3:45 pm

Glocke hat geschrieben:
Fisherman hat geschrieben:Um die Sache einfach zu gestallten würde ich jeden Frame der Animation einzeln ausgeben lassen - somit wäre ein Teil von Blender berechnet worden (Physics etc.) und du müsstest "nur noch" das ganze mit OpenGL rendern ....
Ist das laufzeittechnisch denn vertretbar? Irgendwie habe ich da Bauchschmerzen dabei, in Echtzeit alle Koordinaten der Vertices zyklisch zu ändern.
Das solltest Du auch möglichst der Grafikkarte überlassen...

Du hast einen Würfel, ein beliebig komplexes Objekt und sagst vor dem Rendern, wo das Ding im Raum liegen soll, wie groß es sein soll und wie es verdreht werden soll. Dann sagst Du "Jetzt rendern". An den einzelnen Vertizes brauchst Du da nicht mehr rumzufummeln. Im Idealfall liegen die im Grafikkartenspeicher und Du gehst da gar nicht mehr dran. Nur noch "Jetzt rendern!"
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 » Mi Jan 30, 2013 4:07 pm

Xin hat geschrieben:Das solltest Du auch möglichst der Grafikkarte überlassen...
Ja da hast du Recht :)
Xin hat geschrieben:Du hast einen Würfel, ein beliebig komplexes Objekt und sagst vor dem Rendern, wo das Ding im Raum liegen soll, wie groß es sein soll und wie es verdreht werden soll. Dann sagst Du "Jetzt rendern". An den einzelnen Vertizes brauchst Du da nicht mehr rumzufummeln. Im Idealfall liegen die im Grafikkartenspeicher und Du gehst da gar nicht mehr dran. Nur noch "Jetzt rendern!"
Also sollte ich die Translationen und Rotationen (die die Vertices der Meshs ändern) irgendwie in die Datei exportieren.

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

Re: Blender Animation mit OpenGL rendern

Beitrag von Xin » Mi Jan 30, 2013 4:32 pm

Glocke hat geschrieben:Also sollte ich die Translationen und Rotationen (die die Vertices der Meshs ändern) irgendwie in die Datei exportieren.
Yepp... und wenn Du sie kompilieren willst, hatte ich ja oben bereits einen Vorschlag gemacht, wie das gehen könnte.

Du musst dann entsprechend die Klassen "Translation", "Rotation" und "Skalierung" bereitstellen, bzw. allgemein "Transformation". Die kannst Du in eine Liste packen, die eine Handlung beschriebt - also zum Beispiel "Arm heben, anschließend rotieren, unterarm abwinkeln". Jede Handlung dauert eine Weile. Wenn Du ein Bild der Animation renderst, nimmst Du den aktuellen Zeitstempel und rendest das Bild für die aktuelle Transformation. Dabei können die Handlungen ja auch parallel laufen, zum Beispiel eine zweite Liste die Bewegung des anderen Arms enthalten. Nachdem alle Listen durchlaufen sind, hat jedes Objekt seine Transformation, jagt sie in die Grafikkarte und Du sagt "meine Vertices entsprechend rendern".

Frag Kerli, ob's da bessere Verfahren gibt... ich habe das noch nie programmiert und sage Dir nur, wie ich es umsetzen würde.
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.

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 » Mi Jan 30, 2013 5:57 pm

Ich wiederhole mich zwar, aber der meiner Meinung nach der einfachste Weg :

Unter Pkt. 5
Blender comes with lots of export options. I count export to 27 different file formats in the current version! However, only a few of these work well as a way to transfer models to realtime rendering systems. In my testing, the following work the best with OSG
Einführung OSG

Beides zusammen sollte deinen wünschen entsprechen ...
There is no place like 127.0.0.1

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 » Mi Jan 30, 2013 6:06 pm

Ich würde schauen, dass das gewünschte Format einfach mehrere Objekte exportieren kann und dabei am Besten auch hierarchische angeordnete Objekte mitsamt ihrer Transformation relativ zum Elternelement exportiert. (zb. Zentrum vom rechten Arm ist 3 Einheiten rechts und 2 Einheiten über dem Oberkörper). Danach gehst du alle Objekte durch und setzt jeweils zuerst die entsprechende Transformationsmatrix und zeichnest dann die Vertices, die sich alle zb. in einem VBO (Vertex Buffer Object) befinden. Für die Transformationen musst du eigentlich nur den jeweiligen Ursprung des lokalen Koordinatensystems kennen, dann kannst du jede beliebige Transformation auf die einzelnen Objekte anwenden. Hierarchische aufgebaute Transformationen, also zb. Oberkörper -> Arm -> Hand, kannst du entweder manuell durch Matrizenmultiplikation berechnen oder den OpenGL Matrizenstack benutzen.
"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 » Do Jan 31, 2013 11:58 am

Hi,

also vom Format her (wenn man das ganze mal als ASCII-File mit Anlehnung ans Wavefront Object Format betrachtet) geht das doch dann in die Richtung:

Code: Alles auswählen

# irgendein Mesh, beschrieben durch Vertices und Faces
o Cube
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -0.999999
v 0.999999 1.000000 1.000001
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
f 1 2 3 4
f 5 8 7 6
f 1 5 6 2
f 2 6 7 3
f 3 7 8 4
f 5 1 4 8

# und dann kommen Animationen dazu: Schlüsselwort "ani",
# gefolgt vom Animationsnamen (String) und dem Namen des Objektes
# und die zugehörigen keyframes: Schlüsselwort "frame",
# gefolgt von der Animations-ID und der ID des Keyframes,
# einem "rotate" oder "translate" und den x y und z Werten
# für den OpenGL-Call

ani MoveForward Cube
frame 0 0 rotate 45.0 0.0 0.0 # keyframe 0: drehung um 45.0f entlang der x-Achse
frame 0 0 translate 0.0 0.0 2.0 # keyframe 1: verschiebung um 2.0 entlang der z-Achse
frame 0 1 rotate 90.0 0.0 0.0 # keyframe 1: drehung um 90.0f (im vgl. zum Ruhezustand)
frame 0 1 translate 0.0 0.0 2.0 # klar
frame 0 2 rotate 135.0 0.0 0.0
frame 0 2 translate 0.0 0.0 2.0
frame 0 3 rotate 180.0 0.0 0.0
frame 0 3 translate 0.0 0.0 2.0
frame 0 4 rotate 225.0 0.0 0.0
frame 0 4 translate 0.0 0.0 2.0
frame 0 5 rotate 270.0 0.0 0.0
frame 0 5 translate 0.0 0.0 2.0
frame 0 6 rotate 315.0 0.0 0.0
frame 0 6 translate 0.0 0.0 2.0
# statt keyframe 7 kommt der ruhezustand
Dann gibt es für jedes Objekt (Linker Unterarm, Rechter Oberschenkel usw.) separate Animationen, die das Objekt autonom verändern. Wenn man davon ausgeht, dass alle Objekte einer Datei zu einem Körper gehören (d.h. hier kommen z.B. alle Glieder usw. eines Wolfes rein), dann kann die "Wolf-Datei" vom Programm gelesen, alle Bestandteile inkl. der auszuführenden Drehungen und Verschiebungen gespeichert und dann entsprechend alle notwendigen Dinge animiert werden. Damit meine ich: Bewegt sich der Wolf forwärts, werden für jeden Teil die "Move Forward" Animation ausgeführt. Hat der Kopf z.B. keine, bliebe er die ganze Zeit starr...

Soo, das ganze ist nur ein Gedankenexperiment und spiegelt das ganze so wieder, wie ich den großteil eurer vorschläge verstanden zu haben. Jetzt dürft ihr euch auf mich stürzen und zerfleischen :mrgreen:

PS: Ein "eigenes" Format würde ich allein schon des Lernen-und-Verstehens halber ausprobieren wollen :)

Antworten