アセットの種類
アセットとは簡単に言うとレンダリングシーンを構成する視点や光源やオブジェクト(例画像のウサギがそれに当たるよ)などを指します。またオブジェクトの材質が鏡面状のものなのか,diffuse(拡散反射)材質のものなのか等も決定できます。
この各種アセットを設定することで次章のシーンの作成時にそれぞれのアセットを好きな場所に配置して最終的なシーンを作ることができます。
イメージとしてはアセットでは画像のシーンを作る為のカメラやウサギちゃん、床やライトを作ってやって、次章のシーンを記述する際に作ったアセットを好きな配置にセッティングしてやるといった感じです。
アセットの種類はデフォルトで
sensor
film
light
trianglemesh
bsdf
texture
の6つがあります。 この6つをそれぞれというふうに書いていきます。 このassets: sensor_1: interface: sensor hogehoge film_1: interface: film hogehoge light_1: interface: light hogehoge ・ ・ ・
sensor_1
,film_1
,light_1
の部分には任意のid名をつけることで後のシーン作成時に区別します。 それでは各種アセットを見ていきましょう。
センサー (sensor
)
カメラ(視点)の機能を果たします。 種類は1つで
pinhole
(ピンホールカメラ)
を選択することができます。
それではsensor
アセットのコードを見てみましょう。
sensor_1:
interface: sensor
type: pinhole
params:
We: 1 1 1
fov: 45
film: film_1
params
以下の設定は
We
:カメラのセンサー感度fov
:視野角film
:どのfilmを参照するかを決定する。
これだけでOKです簡単ですね。
後は次章のシーンの定義時に位置を決めてやるだけでカメラが作成されます。
film
については次で紹介します。
フィルム (film
)
filmは出力画像の形式とサイズを指定することができます。 出力画像の形式は
- .png
- .jpg
- .exr
- .hdr
の4種類から選ぶことができます。
HDR形式である.exr又は.hdr形式で幅(w)高さ(h)500×500で出力したい時は
film_1:
interface: film
type: hdr
params:
type: radiancehdr or openexr
w: 500
h: 500
params
以下のtype
をopenexr
,
hdr形式を用いたい時はradiancehdr
と記述します。
LDR形式である.png又は.jpg形式で出力したい時は
film_1:
interface: film
type: ldr
params:
type: png or jpg
w: 500
h: 500
type
がhdr
→ldr
に成っている点に注意してください。
filmの指定はこれだけです。簡単ですね。
ライト(light
)
読んで名のごとく光源のことを指します。 種類は
point
(点光源)area
(面光源)directional
(指向性光源)environment
(環境光源)
から選ぶことができます。
point
(点光源)とは1個の電球のようなもので、
area
面光源とは広がりがある面全体から光を発するような照明のことを指します。(テレビのディスプレイみたいなものを連想してもらえるとわかりやすいと思います。)
directional
(指向性光源)とは一部の方向に強い光を発している光源のことを指します。イメージとしては傘付きのスタンドライトなんかを想像してもらえるとわかりやすいと思います。
environment
(環境光源)は屋外の状況のように太陽(光源)の光が 至る所で物体などによって散乱されて普段光の届かないような部分にも明るさを与えるような光源のことを指します。
日常、外で生活している間は環境光の中で生活していると言えますね。
それではpoint
(点光源)の方から見てみましょう。
light_point:
interface: light
type: point
params:
Le: 3 3 3
position: 1.5 1 0
Le
は光の強さを表します。
position
は点光源の場所を指定します。
次にarea
(面光源)です。
light_area:
interface: light
type: area
params:
Le: 1 1 1
先ほど点光源にあったposition
が消えました。area
(面光源)は面の形状になるので、その面を表すtrianglemesh
を宣言する必要があります。(trianglemesh
は次に説明します。)そのためここでは場所を記述する必要がありません。
次にdirectional
(指向性光源)です。
light_directional:
interface: light
type: directional
params:
Le: 1 1 1
direction: -3 -1 -1
direction
でx,y,z座標それぞれ記述します。
トライアングルメッシュ (trianglemesh
)
trianglemeshはシーン中のオブジェクトの形状を決定する部分にあたります。 Lightmetricaでは
assimp
raw
の2つから選ぶことができます。 rawモードを選択すると自分で位置座標を決定することでオブジェクトの形状を決定できます。 例えば面光源(真四角)の形状を作成したいとします。 すると
mesh_quad:
interface: trianglemesh
type: raw
params:
positions: >
-1 -1 0
1 -1 0
1 1 0
-1 1 0
normals: >
0 0 1
0 0 1
0 0 1
0 0 1
texcoords: >
0 0
1 0
1 1
0 1
faces: >
0 1 2
0 2 3
position
には四角形の各頂点の位置を記述します
normals
にはその各頂点の法線情報を記述します
texcoords
には
faces
は、四角形メッシュは実は三角形二つから構成しなくてはいけないので、最初のpositionsで指定した任意の頂点3つを記述してできた三角形二つを元に四角形を構成します。上例では0,1,2番目と0,2,3番目の三角形二つを用いて作成するように書かれています。
これを次章のシーンを作成時に、上で作成したarea_light
のと関連づけることで真四角の形状をした面光源が作成されます。
一方例えば、うさぎのようなオブジェクトを一から座標を指定したりして作成しようのは不可能のように感じますよね?
そのような時にはもともとオブジェクトの形状(今の場合ウサギ)が記述されている.objファイルのようなものを取り込むことで簡単に作成できます。
その場合assimp
モードを選択することで、
mesh_bunny:
interface: trianglemesh
type: assimp
params:
path: bunny.obj
mesh_bunny
)の形状をもったオブジェクトを作成することができます。
ここで一つ注意です。世の中の物体は全てザラザラしたり、滑らかだったりキラキラしたり、材質を持っていますよね。それを定義しないとうさぎは完成しません。
その材質を定義するのが次のbsdfクラス
になります。
bsdf (bsdf
)
bsdfとは物体の材質のことを指します。 Lightmetricaでは
diffuse
(拡散反射)reflect_all
(完全鏡面反射)refract_all
(屈折材質)flesnel
(フレネル反射)cook_torrance
(光沢反射)
の5つを提供しています。
例えば、diffuse
(拡散反射)を設定すると土や紙のようなざらざらとした光沢のない質感を出すことができます。 reflect_all
(完全鏡面反射)を設定すると鏡のような完全に光を反射する反射材質の質感を出すことができます。
cook_trance
(光沢反射)を設定するとプラスチックや荒い金属のような質感を出すことができます。
flesnel
は屈折と反射両方の光伝搬計算を行います。見た目としては水や水晶のような見た目になります。
詳しくはwikipedia
bsdf:
interface: bsdf
type: diffuse or reflect_all or cook_trance or refract_all or flesnel
params:
#Rは全bsdf共通項 diffuseとreflect_allはRだけでいいよ
R: 1 1 1
#以降下はcook_trance用のパラメータ
eta: 0.140000 0.129000 0.158500
k: 4.586250 3.348125 2.329375
roughness: 0.1
#以降下はrefract_allとflesnel用のパラメータ
eta1: 1
eta2: 2
type
で3つのうちから好きなbsdf名を入れるだけで選択できます。
params
内のR
では色を選択することができます。
左からRGBで0~1の間の好きな値を指定できます。
またcook_trance
選択時にはeta
とk
を調整することで屈折率を表します。
roughness
で表面の荒さを設定できます(範囲は0~1)
refract_all
とflesnel
はeta1
とeta2
を記述します。これはeta1
が外側の屈折率、eta2
が内側の屈折率を表します。
これを次章のシーンを定義する際にtrianglemesh
アセットと関連づけることで、オブジェクトに質感を与えてあげることができます。
テクスチャ (texture
)
texture
とは壁紙ようなものをイメージしてください。
真っ白な壁紙があったとして、何か模様付けしたいと思うと解決方法は簡単な話で、そこらへんのホームセンターに行って壁紙を買ってきて貼り付けるだけですよね。
それと同じことをします。
例えば、例のうさぎちゃんが真っ白な姿では物足りない。
何か模様のついたお洋服をつけたいと思ったとします。(思いますよね?うさぎは真っ白が普通ですが思いますよね??)
そんなときにtexture
の出番です。
tex_oyouhuku:
interface: texture
type: bitmap
params:
path: oyouhuku.png
あとは、このお洋服にも質感(bsdf
)を与えることを忘れずに。
oyouhuku:
interface: bsdf
type: diffuse
params:
TexR: tex_oyouhuku
R
の代わりにtexR
と記述して、先ほど作成したテクスチャtex_oyouhuku
を記述してやれば、tex_oyouhuku模様のdiffuse(拡散反射)bsdf
が作成されました。あとは次章のシーンの定義時にtrianglemesh
のところで作ったmesh_bunny
と今作ったoyouhuku
を関連づけするだけでうさぎちゃんがお洋服を着ちゃった画像を作成できます。
言いたいことはよくわかります。「明らかにウサギちゃんではない何か他の動物じゃないか!嘘ついたな!」そう思いますよね。そうですこれはクマです。
ウサギちゃんに服は着せれませんでした。
というのもウサギちゃんのobjファイルでテクスチャ座標が書かれたものを見つけることができませんでした。このように、objファイルにテクスチャ座標が書かれたものでないとtexture
はtrianglemesh
に貼りつけることができないので注意してください。
と言うのをいいたかったのでクマにしたんですよ。
これでassetの作成チュートリアルはおしまいです。 それでは次章のシーンファイルを書いてみよう!で最後の仕上げをしましょう。