2012-05-19 6 views
7

Ich bin neu in Blender und Python. Ich habe ein Mixer-Modell (.blend), das ich als mehrere Bilder batch-rendern möchte, die einige Eigenschaften für jedes Bild zur Verfügung stellen.Python-Skript mit Argumenten für die Befehlszeile Blender

ich einen Python-Skript mit den Parametern, so etwas wie schrieb:

import bpy 

pi = 3.14159265 
fov = 50 

scene = bpy.data.scenes["Scene"] 

# Set render resolution 
scene.render.resolution_x = 480 
scene.render.resolution_y = 359 

# Set camera fov in degrees 
scene.camera.data.angle = fov*(pi/180.0) 

# Set camera rotation in euler angles 
scene.camera.rotation_mode = 'XYZ' 
scene.camera.rotation_euler[0] = 0.0*(pi/180.0) 
scene.camera.rotation_euler[1] = 0.0*(pi/180.0) 
scene.camera.rotation_euler[2] = -30.0*(pi/180.0) 

# Set camera translation 
scene.camera.location.x = 0.0 
scene.camera.location.y = 0.0 
scene.camera.location.z = 80.0 

laufe Also ich es wie

blender -b marker_a4.blend --python "marker_a4.py" -o //out -F JPEG -x 1 -f 1 

Dann zum Beispiel, wenn ich versuche, Argumente für den Python-Skript zu verwenden

... 
import sys 
... 
fov = float(sys.argv[5]) 
... 

Und es laufen:

blender -b marker_a4.blend --python "marker_a4.py" 80.0 -o //out -F JPEG -x 1 -f 1 

Der Rendervorgang wird erledigt, aber ich bekomme diese Nachrichten am Anfang.

read blend: /home/roho/workspace/encuadro/renders/marker/model/marker_a4.blend 
read blend: /home/roho/workspace/encuadro/renders/marker/model/80.0 
Unable to open "/home/roho/workspace/encuadro/renders/marker/model/80.0": No such file or directory. 
... 

Kann mir jemand sagen, was das verursacht? Ich glaube, Blender analysiert das auch als Modell, versteht aber nicht warum. Ich habe später etwas mehr Sofisticated für das Argument Parsing in Python (argparse) versucht, aber es hat überhaupt nicht funktioniert. Also denke ich, dass auf dieser Ebene etwas seltsames passieren könnte.

Danke!

+0

die gleichen Fragen auf Stack Website Blender Siehe: http: //blender.stackexchange.com/questions/6817 – ideasman42

Antwort

8

ich die Lösung für das, was ich fand, war nach anfänglich suchen.

Wie Junuxx sagte: „Sie nicht Befehlszeilenargumente direkt an Python in diese Situation ... passieren können“, aber man kann tatsächlich passieren Argumente zu Python, aber in einer anderen Situation.

So ist die Art und Weise zu tun, was ich will, ist direkt in der Python-Skript ÜBERTRAGEN UND SPAREN

import sys 

fov = float(sys.argv[-1]) 
... 
# Set Scenes camera and output filename 
bpy.data.scenes["Scene"].render.file_format = 'PNG' 
bpy.data.scenes["Scene"].render.filepath = '//out' 

# Render Scene and store the scene 
bpy.ops.render.render(write_still=True) 

Die --python Option (oder -P) hat am Ende sein, und Sie können Argumente angeben mit - und laden Sie einfach das Modell und führen Sie das Skript aus.

> blender -b "demo.blend" -P script.py -- 50 

Kredit zu diesem Link gefunden: http://www.blender.org/forum/viewtopic.php?t=19102&highlight=batch+render

+0

Ich bekomme einen Fehler beim Ausführen dieses Codes, da die Klasse RenderSettings kein Feld file_format hat. Es scheint, dass es veraltet und entfernt wurde. Gibt es eine Problemumgehung? – user502144

+0

Oh, ich habe herausgefunden, wie das geht. file_format ist jetzt in ImageFormatSettings, also sollte es 'bpy.data.scenes [" Scene "] sein. render.image_settings.file_format = 'PNG'' – user502144

+0

Ok! Sorry, ich habe deine Frage verpasst. Wenn Sie diese Zeile auslassen, wird sie standardmäßig in PNG gespeichert. Aber wenn Sie ein anderes Format benötigen, sollte das der richtige Weg sein. – roho

4

Sie können Befehlszeilenargumente in dieser Situation nicht direkt an Python übergeben, da sie als Argumente für Blender interpretiert werden. Ein Weg, um dies ist Umgebungsvariablen zu setzen und dann Mixer/python nennen, wie diese (vorausgesetzt, Sie auf Windows seid - die gleiche Sache ist möglich, auf anderen Betriebssystemen, aber mit unterschiedlicher Syntax)

set arg1='foo' & set arg2='bar' & python envvar.py 

Hinweis : keine Leerzeichen neben den Gleichheitszeichen!

Im Python-Skript I envvar.py genannt, können Sie os.getenv() verwenden, um diese Variablen zuzugreifen

import os 
print 'arg1 = ', os.getenv('arg1') 
print 'arg2 = ', os.getenv('arg2') 

Ausgang:

arg1 = 'foo' 
arg2 = 'bar' 
+0

Ich bin tatsächlich auf Linux, aber ich könnte es auch auf einem Mac verwenden. Dies ist ein cooler Workaround und funktioniert, aber ich bin nicht von dem OS-abhängigen Ansatz überzeugt. Ich habe auch daran gedacht, eine zusätzliche TXT-Datei zu verwenden. Ich fand einige weitere Informationen hier (es ist für Blender 2.49, aber ich denke, es ist nützlich) http://www.blender.org/documentation/249PythonDoc/API_related-module.html – roho

+0

Ja lesen aus einer Textdatei würde auch funktionieren, aber ich dachte es war komplizierter als das. – Junuxx

Verwandte Themen