2012-05-19 8 views
7

Sono nuovo di Blender e Python. Ho un modello di frullatore (.blend) che voglio renderizzare in batch come diverse immagini che forniscono alcune proprietà per ogni immagine.Script Python con argomenti per la riga di comando Blender

ho scritto uno script python con questi parametri, qualcosa di simile:

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 

Allora faccio funzionare come

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

Quindi per esempio se cerco di usare argomenti allo script python

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

ed eseguirlo:

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

Il rendering viene eseguito ma ottengo questi messaggi all'inizio.

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. 
... 

Qualcuno può dirmi che cosa sta causando questo? Penso che il frullatore stia anche analizzandolo come un modello ma non capisco perché. Successivamente ho provato qualcosa di più sofisticato per l'analisi dell'argomento in python (argparse) ma non ha funzionato affatto. Quindi penso che potrebbe esserci qualcosa di strano a questo livello.

Grazie!

+0

vedere le stesse domande sul sito StackExchange di Blender: http: //blender.stackexchange.it/questions/6817 – ideasman42

risposta

8

ho trovato la soluzione per quello che ero cercando intenzionalmente.

Come Junuxx ha dichiarato: "Non è possibile passare argomenti della riga di comando direttamente al python in questa situazione ...", ma in realtà si può passare gli argomenti a Python, ma in un'altra situazione.

Quindi il modo di fare ciò che voglio è il rendering e salvare direttamente all'interno dello script python

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) 

L'opzione --python (o -P) deve essere alla fine e si può specificare gli argomenti con - e basta caricare il modello ed eseguire lo script.

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

credito a questo link che ho trovato: http://www.blender.org/forum/viewtopic.php?t=19102&highlight=batch+render

+0

Ricevo un errore durante l'esecuzione di questo codice, perché la classe RenderSettings non ha campo file_format. Sembra che sia stato deprecato e rimosso. C'è qualche soluzione? – user502144

+0

Oh, ho capito come farlo. file_format è ora in ImageFormatSettings, quindi dovrebbe essere 'bpy.data.scenes [" Scene "]. render.image_settings.file_format = 'PNG'' – user502144

+0

Ok! Mi dispiace ho perso la tua domanda. Io ommite quella linea che salverà in PNG di default. Ma se hai bisogno di un altro formato che dovrebbe essere la strada da percorrere. – roho

4

Non è possibile passare gli argomenti della riga di comando direttamente a python in questa situazione, poiché sono interpretati come argomenti per Blender. Un modo per aggirare questo è quello di impostare le variabili di ambiente e quindi chiamare frullatore/python, come questo (supponendo che siete su Windows - la stessa cosa è possibile in altri sistemi operativi, ma con sintassi diversa)

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

Nota : nessuno spazio adiacente ai segni di uguale!

Nello script python ho chiamato envvar.py, è possibile utilizzare os.getenv() per accedere a queste variabili

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

uscita:

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

Sono realmente su Linux ma potrei usarlo anche su un Mac. Questa è una soluzione interessante e funziona, ma non sono convinto dall'approccio dipendente dal sistema operativo. Stavo anche pensando di usare un file txt ausiliario. Ho trovato qualche informazione in più qui (è per il blender 2.49 ma penso che sia utile) http://www.blender.org/documentation/249PythonDoc/API_related-module.html – roho

+0

Sì, la lettura da un file di testo avrebbe funzionato, ma ho pensato era più complicato di così. – Junuxx