2012-05-19 15 views
7

Jestem nowy w Blenderze i Pythonie. Mam model blendera (.blend), który chcę renderować wsadowo jako kilka obrazów dostarczających pewnych właściwości dla każdego obrazu.Skrypt w języku Python z argumentami dla wiersza poleceń Blender

Napisałem skrypt Pythona z tych parametrów, coś jak:

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 

Więc biegnę go jak

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

wówczas dla przykładu jeśli próbuję użyć argumentów do skryptu Pythona

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

Uruchom go:

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

Renderowanie zostanie ukończone, ale otrzymuję te wiadomości na starcie.

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

Czy ktoś może mi powiedzieć, co to powoduje? Myślę, że mikser również analizuje to jako model, ale nie rozumiem dlaczego. Później próbowałem czegoś bardziej wyrafinowanego dla analizy parsowania w pythonie (argparse), ale w ogóle nie działało. Więc myślę, że na tym poziomie może się dziać coś dziwnego.

Dzięki!

+0

zobaczyć te same pytania na stronie Stack Exchange Network Blendera: http: //blender.stackexchange.com/questions/6817 – ideasman42

Odpowiedz

8

znalazłem rozwiązanie dla tego, co było szukając intially.

Jak powiedział Junuxx "Nie można przekazywać argumentów wiersza poleceń bezpośrednio do Pythona w tej sytuacji ..." ale faktycznie MOŻESZ przekazywać argumenty do pythona, ale w innej sytuacji.

Więc sposób robić to, co chcę jest do tynku i SAVE bezpośrednio wewnątrz skryptu Pythona

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) 

Opcja --python (lub P) musi być na końcu i można określić argumentów z - i po prostu wczytaj model i uruchom skrypt.

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

zgłosił ten link znalazłem: http://www.blender.org/forum/viewtopic.php?t=19102&highlight=batch+render

+0

Podczas uruchamiania tego kodu pojawia się błąd, ponieważ klasa RenderSettings nie ma pola file_format. Wygląda na to, że został przestarzały i usunięty. Czy istnieje jakieś obejście? – user502144

+0

Och, wymyśliłem, jak to zrobić. file_format jest teraz w ImageFormatSettings, więc powinno to być 'bpy.data.scenes [" Scene "]. render.image_settings.file_format = 'PNG'' – user502144

+0

Ok! Niestety, przegapiłem Twoje pytanie. Pomijam tę linię, która domyślnie zapisze w PNG. Ale jeśli potrzebujesz innego formatu, który powinien być drogą do zrobienia. – roho

4

Nie można przekazywać argumentów wiersza poleceń bezpośrednio do Pythona w tej sytuacji, ponieważ są one interpretowane jako argumenty dla blendera. Sposobem na to jest ustawienie zmiennych środowiskowych, a następnie wywołać mikser/python, tak (zakładając, że jesteś na Windows - to samo jest możliwe na innych systemach operacyjnych, ale z różną składnię)

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

Uwaga : brak spacji sąsiadujących ze znakami równości!

W skrypcie Pythona nazwałem envvar.py, można użyć os.getenv(), aby uzyskać dostęp do tych zmiennych

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

wyjściowa:

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

Jestem na Linuksie, ale mogę go również używać na komputerze Mac. To jest świetne rozwiązanie i działa, ale nie jestem przekonany do podejścia zależnego od systemu operacyjnego. Myślałem również o używaniu pomocniczego pliku txt. Znalazłem tu więcej informacji (jest to dla Blendera 2.49, ale myślę, że jest użyteczny) http://www.blender.org/documentation/249PythonDoc/API_related-module.html – roho

+0

Tak samo działałoby czytanie z pliku tekstowego, ale pomyślałem było to bardziej skomplikowane. – Junuxx

Powiązane problemy