2012-05-19 36 views
7

Tôi mới dùng máy xay sinh tố và python. Tôi có một mô hình máy xay sinh tố (.blend) mà tôi muốn tạo hàng loạt như một số hình ảnh cung cấp một số thuộc tính cho mỗi hình ảnh.Tập lệnh Python với đối số cho dòng lệnh Máy xay sinh tố

Tôi đã viết một kịch bản python với những thông số, một cái gì đó như:

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 

Vì vậy, sau đó tôi chạy nó như

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

Sau đó, ví dụ nếu tôi cố gắng sử dụng đối số cho kịch bản python

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

Và chạy nó:

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

Kết xuất được thực hiện nhưng tôi nhận được thông báo này lúc bắt đầu.

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

Ai có thể cho tôi biết điều gì gây ra điều này? Tôi nghĩ rằng máy xay sinh tố cũng phân tích cú pháp đó như một mô hình nhưng không hiểu tại sao. Sau đó tôi đã thử một cái gì đó tinh vi hơn cho việc phân tích đối số trong python (argparse) nhưng nó không hoạt động chút nào. Vì vậy, tôi nghĩ rằng có thể có một cái gì đó kỳ lạ xảy ra ở cấp độ này.

Cảm ơn!

+0

Xem những câu hỏi tương tự trên trang web stackexchange Máy xay sinh tố của: http: //blender.stackexchange.com/questions/6817 – ideasman42

Trả lời

8

Tôi tìm thấy giải pháp cho những gì tôi đã tìm kiếm một cách trực tiếp.

Khi Junuxx nói "Bạn không thể chuyển đối số dòng lệnh trực tiếp tới trăn trong tình huống này ..." nhưng bạn thực sự CÓ THỂ chuyển đối số cho python nhưng trong một tình huống khác.

Vì vậy, cách để làm những gì tôi muốn là để RENDER VÀ LƯU TRỰC TIẾP TRONG kịch bản 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) 

Tùy chọn --python (hoặc -P) phải là lúc kết thúc và bạn có thể chỉ định đối số với - và chỉ cần tải mô hình và chạy tập lệnh.

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

tín dụng để liên kết này tôi thấy: http://www.blender.org/forum/viewtopic.php?t=19102&highlight=batch+render

+0

Tôi gặp lỗi khi chạy mã này, vì lớp RenderSettings không có trường file_format. Có vẻ như nó đã không được chấp nhận và bị xóa. Có bất kỳ công việc xung quanh? – user502144

+0

Ồ, tôi đã tìm ra cách để làm điều này. file_format hiện có trong ImageFormatSettings, vì vậy nó phải là 'bpy.data.scenes [" Scene "]. render.image_settings.file_format = 'PNG'' – user502144

+0

Ok! Xin lỗi tôi đã bỏ lỡ câu hỏi của bạn. Tôi bạn ommit rằng dòng nó sẽ lưu trong PNG theo mặc định. Nhưng nếu bạn cần một định dạng khác thì phải là con đường để đi. – roho

4

Bạn không thể chuyển đối số dòng lệnh trực tiếp tới python trong trường hợp này, vì chúng được hiểu là đối số cho máy xay. Một khoảng cách này là để thiết lập biến môi trường và sau đó gọi máy xay sinh tố/python, như thế này (giả sử bạn đang ở trên Windows - điều tương tự có thể trên hệ điều hành khác, nhưng với cú pháp khác nhau)

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

Note : không có dấu cách liền kề với dấu bằng!

Trong kịch bản python tôi gọi envvar.py, bạn có thể sử dụng os.getenv() để truy cập các biến

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

Output:

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

Tôi thực sự trên Linux nhưng tôi cũng có thể sử dụng nó trên máy Mac. Đây là một cách giải quyết tốt và hoạt động nhưng tôi không bị thuyết phục bởi cách tiếp cận phụ thuộc vào hệ điều hành. Tôi cũng đã nghĩ đến việc sử dụng một tệp txt phụ trợ. Tôi tìm thấy một số thông tin ở đây (nó cho máy xay sinh tố 2,49 nhưng tôi nghĩ rằng nó hữu ích) http://www.blender.org/documentation/249PythonDoc/API_related-module.html – roho

+0

Có đọc từ một tập tin văn bản cũng sẽ làm việc, nhưng tôi nghĩ nó phức tạp hơn thế này. – Junuxx

Các vấn đề liên quan