Blender Cycles “Lamborghini Gallardo LP570-4″作成 Part2:Material
こんにちは、画像の使いすぎでメディアを占領してしまい申し訳なくなってるmoumouです。
前回のモデリング編に続いて、Part2:マテリアル編を書いていきたいと思います。
応用が効きそうなことだけ書いているので、だんだんランボルギーニ関係なくなってます(笑)
このような流れで書いています。
- 全体の設計&モデリング編(+ドローン動画)
- マテリアル設定 (←今ここ)
- ライティング& 環境設定
- コンポジットによる実写合成
今回の目次
- フレネル効果
- バンプマップを利用したノード構成
- 綺麗な床のマテリアル
cyclesを扱ううえで知っておくと良いことを書いていきます。
Fresnel Effect
まず、今回作ったマテリアルの中でも一番良く使われているのは全体の黒い塗装の部分。
このマテリアルにはフレネルが使われていて、リアルな物質を作るうえで重要になってきます。
フレネル反射とは、光沢のある物質をみたときに、その物質を見る角度によって反射の割合が変わってくる現象です。近くにある机などをみれば分かると思いますが、面の法線ベクトルと視線のベクトルの角度が大きいほど反射の割合が高くなっていることが分かります。
この角度についての関数である反射率Fr(θ)は物質によって決まっており、次のようなグラフで表されます。
しかしながら、実際にはCGの世界ではこれを簡略化するため下のような近似式が使われています。
$$Fr(\theta) = Fr(0)+ (1-Fr(0))(1-\cos \theta)^5$$
Fr(0)は角度0つまり光線を垂直に入射したときのs波のエネルギー反射率rs^2なので、まずs波の振幅反射率rsを考えます。
電場の振幅反射率の式から
$$r_s = \frac{n_1 \cos \alpha – n_2 \cos \beta}{n_1 \cos \alpha + n_2 \cos \beta}$$
垂直入射ではα=β=0なので、
$$r_s = \frac{1 – \frac{n_2}{n_1} }{1 + \frac{n_2}{n_1} } = \frac{1 – ior }{1 + ior } ,\ \ \ \ Fr(0) = r_s^2 = (\frac{1 – ior }{1 + ior })^2$$
となるはず。つまり、Fr(θ)は物質の屈折率から求めることができます。
個人的にこんな簡単な近似式でどの程度近似されているのか気になったので、mathematicaでグラフにしてみました。
比較してみると、金属の場合の80°付近でのへこみが近似できていないがそれ以外はほぼ一致していることが分かります。
しょっぱなから話がそれましたが、Blenderでフレネルを考慮する場合、下のようなフレネル入力を使います。このノードはiorから上のような近似式により、Fr(θ)のグラフを算出していると考えられます。
ノード構成としては単純ですが、初見では分かりにくいと思うので説明しておきます。まあ、説明とは言っても式を見ればすぐ分かるかと思います。
$$mix出力 = shader1 * (1-Fac) + shader2 * Fac$$
Shader1にdiffuse,shader2に光沢を入れれば、係数Fr(θ)のグラフに従ってdiffuseに光沢がミックスされ、角度が大きいほど光沢が大きくなります。普通にmixさせた場合とフレネル使用時の差を載せておきます。(左:フレネルior=1.4 , 右:mix係数=0.064)
特に球状部分で変化が分かりやすく、立体感が増しています。
今回のはdiffuseと光沢を使いましたが、他のshaderでも、角度が大きいほどshader2させたいというような場合に利用することができます。これにより、作れるマテリアルの幅が広がります。例えば次のような(diffuse+放射)マテリアルです。(左:フレネルあり, 右:ただのmix)
また、フレネルを使えば、glass shaderの代わりに、透過+光沢を使うことができます。フレネルに調節用ノードを挟ませることができるので、自由度が高くなりますが自分で調節しなければなりません。あと、メリットとしてグラスよりも軽くなります。必要に応じて、屈折させることができます。窓ガラス部やバックライトカバーにはこれを使っています。
Material : Bump Map
また、前記事で載せたバンプマップには以下のノード構成を利用しております。係数の値が大きいほどshader2が大きく作用するため、1に近い白を係数として入力すると、shader2金光沢が大きく作用します。そのため、バンプマップの黒色部分は金光沢になり、白色部分は黒光沢になります。(バンプマップをカラーランプで白黒逆転させているから)
Floorのほうの画像を見て分かる通り、バンプマップをディスプレイスメントにつなぐことによりメッシュに高さ情報を与えることができます。しかし、この方法だと、メッシュを細分化しないといけないため、非可逆で調節がしにくいです。そのため、ここではノードをつなぐ代わりにディスプレイスメントモディファイアでバンプマップを利用しています。このようにすることで、subsurfモディファイアによってメッシュを細分化し、その後バンプマップが適用されるので、メッシュの細分化度を後から楽に変更することができました。
また、金属部には異方性シェーダーを使うことにより、金属特有の反射の歪みを表現することができます。
Material: Floor
あとは、床のマテリアルですが、さすがに長くなるうえ、そろそろ書くのが面倒になってきたので説明は省いてノードだけ載せておきます。diffuse map, specular map, normal map, bump map を以下のようにつないであります。この各mapのつなぎ方はテンプレ化してるっぽいので調べればいろいろでてきます。ググるべし。
diffuse mapによりtextureが貼り付けられ、specular mapにより場所ごとの光沢の割合が与えられ、normal mapにより平面に方向が与えられ、bump mapにより平面に高さが与えられます。このようにして2次元のtextureのみから、3次元情報を得ることができます。また、specular mapにより綺麗な反射が再現されるため、ただテクスチャを張っただけのものより数倍美しくなります。その上、メッシュで作るよりも軽いです。cyclesをやるなら知っておいた方がいい技法でした。
マテリアルに関してはこんなところです。どれも応用が利く手法なので、覚えておくといいと思います。
ちなみに、cyclesのマテリアルについて調べるうえで、このサイトが非常に役に立ちました。今回のfresnel,texture map, その他マテリアルについて詳しく書いてあります。
chocofur.com
それでは、次記事ではライティングについて書きたいと思いますー。(工事中)