Vì cảnh có thể tham chiếu các tài nguyên bên ngoài như mắt lưới và kết cấu bằng cách sử dụng các đường dẫn tương đối được chỉ định trong tệp XML, nên Mitsuba phải được thông báo về nơi tìm các tệp đó. Đoạn mã trên thực hiện điều này thông qua lớp thread-local
Truyền đối số cho cảnh
Như đã giải thích trong phần thảo luận về , một tệp cảnh có thể chứa các tham số được đặt tên có tiền tố là ký hiệu <!-- sample per pixel parameter --> <default name="spp" value="8"/> ... <sampler type="independent"> <integer name="sample_count" value="$spp"/> </sampler> 6
<!-- sample per pixel parameter --> <default name="spp" value="8"/> ... <sampler type="independent"> <integer name="sample_count" value="$spp"/> </sampler>
Các tham số này có thể được xác định rõ ràng bằng cách sử dụng các đối số từ khóa khi tải cảnh
scene = load_file(filename, spp=1024)
Đang tải một đối tượng Mitsuba
Cũng có thể tạo một thể hiện của một đối tượng Mitsuba đơn lẻ (e. g. một BSDF) bằng cách sử dụng trình phân tích cú pháp XML, như được hiển thị trong đoạn mã Python sau
from mitsuba.core.xml import load_string diffuse_bsdf = load_string("<bsdf version='2.0.0' type='diffuse'></bsdf>")
Bộ thử nghiệm của Mitsuba thường xuyên sử dụng phương pháp này để kiểm tra hành vi của các thành phần hệ thống riêng lẻ
Tạo đối tượng bằng từ điển Python
Một cách thuận tiện hơn để xây dựng các đối tượng Mitsuba trong Python là sử dụng từ điển Python làm đối số. Từ điển này phải tuân theo một cấu trúc tương tự như cấu trúc XML được sử dụng cho mô tả cảnh Mitsuba
Từ điển phải luôn chứa một mục <!-- sample per pixel parameter --> <default name="spp" value="8"/> ... <sampler type="independent"> <integer name="sample_count" value="$spp"/> </sampler> 8 để chỉ định tên của plugin sẽ được khởi tạo. Các khóa của từ điển phải là các chuỗi và sẽ đại diện cho tên của các thuộc tính. Loại thuộc tính sẽ được suy ra từ loại Python cho các loại đơn giản (e. g. <!-- sample per pixel parameter --> <default name="spp" value="8"/> ... <sampler type="independent"> <integer name="sample_count" value="$spp"/> </sampler> 9, scene = load_file(filename, spp=1024) 0, scene = load_file(filename, spp=1024) 1, scene = load_file(filename, spp=1024) 2,…). Có thể cung cấp một từ điển khác làm giá trị của một mục nhập. Điều này có thể được sử dụng để tạo các đối tượng lồng nhau, như trong mô tả cảnh XML
Các đoạn mã sau minh họa sự giống nhau giữa mã XML và cấu trúc từ điển Python
XML
<shape type="obj"> <string name="filename" value="dragon.obj"/> <bsdf type="roughconductor"> <float name="alpha" value="0.01"/> </bsdf> </shape>
Từ điển Python
{ "type" : "obj", "filename" : "dragon.obj", "something" : { "type" : "roughconductor", "alpha" : 0.01 } }
Dưới đây là một ví dụ cụ thể hơn về cách sử dụng chức năng
from mitsuba.core.xml import load_dict sphere = load_dict({ "type" : "sphere", "center" : [0, 0, -10], "radius" : 10.0, "flip_normals" : False, "bsdf" : { "type" : "dielectric" } })
Có thể cung cấp một đối tượng Mitsuba khác trong từ điển Python thay vì sử dụng các từ điển lồng nhau
# First create a BSDF (could use xml.load_string(..) as well) my_bsdf = load_dict({ "type" : "roughconductor", "alpha" : 0.14, }) # Pass the BSDF object in the dictionary sphere = load_dict({ "type" : "sphere", "something" : my_bsdf })
Để thuyết phục, một từ điển lồng nhau có thể được cung cấp một mục nhập <!-- sample per pixel parameter --> <default name="spp" value="8"/> ... <sampler type="independent"> <integer name="sample_count" value="$spp"/> </sampler> 8 bằng với scene = load_file(filename, spp=1024) 4 hoặc scene = load_file(filename, spp=1024) 5. Tương tự như trình phân tích cú pháp XML, mục nhập scene = load_file(filename, spp=1024) 6 trong từ điển đó sẽ được sử dụng để kích hoạt plugin scene = load_file(filename, spp=1024) 7 phù hợp. (Xem )
Dưới đây là một số ví dụ về khả năng sử dụng mục nhập scene = load_file(filename, spp=1024) 6 trong từ điển lồng nhau
# Passing gray-scale value "color_property" : { "type": "rgb", "value": 0.44 } # Passing tri-stimulus values "color_property" : { "type": "rgb", "value": [0.7, 0.1, 0.5] } # Providing a spectral file "color_property" : { "type": "spectrum", "filename": "filename.spd" } # Providing a list of (wavelength, value) pairs "color_property" : { "type": "spectrum", "value": [(400.0, 0.5), (500.0, 0.8), (600.0, 0.2)] }
Ví dụ sau xây dựng một cảnh Mitsuba bằng cách sử dụng
scene = load_dict({ "type" : "scene", "myintegrator" : { "type" : "path", }, "mysensor" : { "type" : "perspective", "near_clip": 1.0, "far_clip": 1000.0, "to_world" : ScalarTransform4f.look_at(origin=[1, 1, 1], target=[0, 0, 0], up=[0, 0, 1]), "myfilm" : { "type" : "hdrfilm", "rfilter" : { "type" : "box"}, "width" : 1024, "height" : 768, }, "mysampler" : { "type" : "independent", "sample_count" : 4, }, }, "myemitter" : {"type" : "constant"}, "myshape" : { "type" : "sphere", "mybsdf" : { "type" : "diffuse", "reflectance" : { "type" : "rgb", "value" : [0.8, 0.1, 0.1], } } } })
Như trong mô tả cảnh XML, có thể tham chiếu các đối tượng khác trong <!-- sample per pixel parameter --> <default name="spp" value="8"/> ... <sampler type="independent"> <integer name="sample_count" value="$spp"/> </sampler> 4, miễn là những đối tượng được khai báo trước khi tham chiếu diễn ra trong từ điển. Với mục đích này, bạn có thể chỉ định một từ điển lồng nhau với mục nhập from mitsuba.core.xml import load_string diffuse_bsdf = load_string("<bsdf version='2.0.0' type='diffuse'></bsdf>") 1 và mục nhập from mitsuba.core.xml import load_string diffuse_bsdf = load_string("<bsdf version='2.0.0' type='diffuse'></bsdf>") 2. Các đối tượng có thể được tham chiếu bằng cách sử dụng from mitsuba.core.xml import load_string diffuse_bsdf = load_string("<bsdf version='2.0.0' type='diffuse'></bsdf>") 3 của chúng trong từ điển. Cũng có thể tham chiếu một đối tượng bằng cách sử dụng nó là from mitsuba.core.xml import load_string diffuse_bsdf = load_string("<bsdf version='2.0.0' type='diffuse'></bsdf>") 4 nếu một đối tượng đã được xác định