Mitsuba

[Mitsuba] Scene XML file format

쑤스토리 2022. 7. 28. 23:28

Graphics 분야를 제대로 하기에 앞서 dataset을 만들기 위해, 즉 Scene 을 만들기 위해 XML format에 대해 공부해보기로 한다. 

 

나처럼 XML이 처음이신 분들을 위해 엄청 간략하게 기초만 적어보기로..!

mitsuba3의 docs를 읽으며 정리한 내용들인데 약간의 오류가 있을 수도 있음을 참고해주세요!

https://mitsuba.readthedocs.io/en/latest/

 

Mitsuba 3

Toggle Light / Dark / Auto color theme Toggle table of contents sidebar

mitsuba.readthedocs.io

 


Scene을 만들기 위해서 필요한 Plugin reference가 있는데, 전부 둘러보진 못하고 예시를 따라서 차차 설명하고자한다.

 

예시의 전체 코드

<scene version='3.0.0'>
    <default name="spp" value="256"/>
    <default name="res" value="256"/>

    <integrator type='direct'/>
    <sensor type="perspective" id="sensor"> 
        <transform name="to_world"> # transformation using to_world
            <lookat target="0.0, 0.0, 1.25"
                    origin="0.0, -12.0, 5.0"
                    up    ="0.0, 0.0, 1.0"/>
        </transform>
        <sampler type="independent">
            <integer name="sample_count" value="$spp"/>
        </sampler>
     
	<film type="hdrfilm">
            <rfilter type="box"/>
            <integer name="width"  value="$res"/>
            <integer name="height" value="$res"/>
        </film>
    </sensor>

    <shape type="ply" id="teapot">
        <string name="filename" value="meshes/teapot.ply"/>
        <bsdf type="diffuse">
            <rgb name="reflectance" value="0.9 0.9 0.0"/>
        </bsdf>
    </shape>

    <emitter type="point" id="light1"> # light 1
        <point name="position" x="3" y="-10.0" z="6.0"/>
        <rgb name="intensity" value="100.0"/>
    </emitter>

    <emitter type="point" id="light2"> # light 2
        <point name="position" x="-3" y="-10.0" z="-2.0"/>
        <rgb name="intensity" value="100.0"/>
    </emitter>
</scene>

예시를 보면 알수있듯, 기본적으로 XML file은 <word>로 시작하여 </word> 로 끝내는 형식으로 정의를 해준다.

 

Scene에 기본적으로 필요한 plugin reference로는 sensor(=camera)의 정의, shape(물체의 생김새) 정의, emitter(빛)의 정의가 있는데, 모두 root object (예시에서는 <scene>)에 nested 되어 있다. 각각의 plugin reference에 root object을 제외하고 type을 명시해야하며 각각의 object은 특성들을 tag들로 반영한다. 예를들어, sensor 에는 transform tag가 nested 되어있다.

 

root object을 제외하고 나머지는 renderer가 disk로부터 plugin을 찾아 load하는 것을 명령하는데, 이 때문에 type = " " 파라미터를 사용하여 plugin name을 명시해야만한다!

 

코드를 차례차례 살펴보자.

<scene version='3.0.0'>
    <default name="spp" value="256"/>
    <default name="res" value="256"/>

위 코드는 mitsuba3를 명시해주는 scene version = '3.0.0' 이다. 그리고 spp 값을 256, res 값을 256으로 정의함을 의미한다.

 

Sensor plugin 

sensor는 "recording radiance(발광) measurements"의 역할로, camera 가 하는 역할이라고 생각하면 된다.

mitsuba sensor는 right-handed 이며, origin에 위치하고, +X left만큼, +Y upwards만큼, +Z points along viewing direction 만큼 oriented 된다.

    <sensor type="perspective" id="sensor"> 
        <transform name="to_world"> # transformation using to_world
            <lookat target="0.0, 0.0, 1.25"
                    origin="0.0, -12.0, 5.0"
                    up    ="0.0, 0.0, 1.0"/>
        </transform>
        <sampler type="independent">
            <integer name="sample_count" value="$spp"/>
        </sampler>
     
	<film type="hdrfilm">
            <rfilter type="box"/>
            <integer name="width"  value="$res"/>
            <integer name="height" value="$res"/>
        </film>
    </sensor>

transform에 정의 되듯, to_world로 transformation이 진행되고, lookat tag로 camera의 정확한 위치와 방향 전환이 이루어진다. 

 

film은 rendering process가 끝나고 disk에 쓰여질때 measurements들을 final output file로 바꾸는 역할을 한다. type로는 hdrfilm이 있는데, 이는 이미지들을 high dynamic range OpenEXR file로 저장한다.

 

Shape plugin


    <shape type="ply" id="teapot">
        <string name="filename" value="meshes/teapot.ply"/>
        <bsdf type="diffuse">
            <rgb name="reflectance" value="0.9 0.9 0.0"/>
        </bsdf>
    </shape>

Shape은 물체를 정의하는데 쓰인다. id는 teapot이고 ply 파일 확장자이다. bsdf plugin은 surface를 정의해주는데, surface가 "diffused" 된 상태이며, relectance의 RGB value를 정의한 것이다.

 

Emitter plugin

    <emitter type="point" id="light1"> # light 1
        <point name="position" x="3" y="-10.0" z="6.0"/> 
        <rgb name="intensity" value="100.0"/>
    </emitter>

    <emitter type="point" id="light2"> # light 2
        <point name="position" x="-3" y="-10.0" z="-2.0"/>
        <rgb name="intensity" value="100.0"/>
    </emitter>
</scene>

emitter는 빛을 의미하는데, 현재는 두가지의 빛이 정의된것을 알 수 있다. light1의 구체적 위치는 x=3, y = -10, z = 6이고, radiant 강도를 intensity로 정의해준다.

 

더 많은 plugin이 있으니 사이트를 참고해서 공부하는것을 추천한.! ply 파일은 mitsuba github에 있으니 다운로드 받으면 된다!