background

とうとうアレの。

2018年07月09日(Mon)

自分的最大の難所、UV展開がどうにか完了したので、木目っぽいテクスチャでも作ろうかなって思ったんだ。プロシージャルテクスチャで作ったマテリアルを、テクスチャに焼き込んで出力するベイクという機能。去年ターナーを作った時にもなんとか出来たから、たぶん今回もなんとかなるだろうって思ってたんだ。

Blender。

去年ダウンロードした時、操作方法を調べて右クリックと左クリックを入れ替える的なカスタマイズを少しやって、カメラ操作方法なんかのメモは机の前に貼ってある。

……他の事はなんにも覚えていなかった(笑)。

慌ててあちこちのサイトを検索しながら、あーでもないこーでもないって試行錯誤したんだけど。マテリアルの概念とか画像ファイルの扱いとか、基本というより根本的な部分から抜け落ちてるから、どの説明を読んでも途中でひっかかるところが出てくる。やっぱり、こういうのは書いて残しとかないとな~。

その昔、自分は「ウンチクはひけらかさないと身につかないから~」などと嘯きつつ覚えたての雑学を語ろうとするイヤな子供だった。けど実は今でも、知識を身につけるには他人に説明をするのが一番だと考えている。

というわけで、Blenderでベイク機能を使ってテクスチャを作る手順の覚書。主に未来の自分に向けた用。モデリングは別のソフトで行い、UV展開済みのデータをWavefront OBJ形式で出力しているとする。

スポンサーサイト





アウトライン。

2017年10月18日(Wed)

ここにGR-700があるじゃろ?

171018-01

これがこうなって

171018-02

あとこうして

171018-03

こうじゃ。

171018-04

って、ちょうど一年ぐらい前にも同じネタやってるし。ファンアートだから載せないとか言ってた舌の根も乾かないうちにこれだし。まあ、枡久田マスクさんのR-707に合わせる絵がやっとできたから、自分で自分を大目に見ることにする。

足元に置くものの絵を作ろうと思ったら、どうしても俯瞰にならざるを得ないというか。すると今度は人物の頭しか見えないし、ギターも見せようと思ったら構図もありそうなシチュエーションも限られてくるし。案外楽器絵って厳しい。というか、無知だけに何か間違えてそうで怖い(笑)。

人物とケーブルは手描き、右の椅子に載ってるマニュアルは公式のものを貼り込んじゃった。

で、一枚の絵を作るのにSuperflyとFireflyとプレビューと手描きを合成したわけだけども。Fireflyとプレビューは輪郭線だけを描画するためにレンダリングしたわけで、このFIreflyの輪郭線がちょっとめんどくさかった。

171018-05

Fireflyレンダリングオプションのトゥーンの輪郭(Toon outline)はマテリアルのToon IDごとに、ノイズは入るけれどもなかなかいい感じで輪郭線を引いてくれる機能だ。たとえば頭と胴体でマテリアルが分かれているけれど、境界線を区切りたくないという場合には、同じIDを振っておけば線が描画されない。

ところがまあ、Superfly用にマテリアルを調整したり、色々やっているとこのToon IDがどうなっているかなんてまったく把握できないわけだ。同じ材質っぽいところは同じマテリアルファイルを適用してるけど、そうすると逆に線を引きたい箇所なのに描画されない、なんてことが起こる。そもそも物理サーフェイスノードを使っていたらIDそのものが定義されてない。万全を期すなら、すべてのマテリアルグループごとにPoserサーフェイスノードを作成して、個別のIDを振っておきたい。

そこでシーンに並べたアイテムを眺めて暗澹とするわけだ。なにせ自分で作ったターナーだけでも20近いマテリアルグループがある。

171018-06

誰か、そういうPythonスクリプト作ってー!><

と絶叫しながら、とりあえずその場は手作業で乗り切った。だってモデリング脳からようやく絵作り脳になって、次はお絵描き脳にならないといけないのに、プログラミング脳に切り替える余裕なんてないしー。

でも次は手作業ではやりたくない。じゃあ絵が完成した今やるしかないよね。

細かく書くとややこしくなるから省略するけど、とりあえずPoserサーフェイスノードは新しく作成された時、必ず重複しないToon IDを持っている。ということは、全部のマテリアルグループに新しくルートノードを作成する、というスクリプトがあればいい。全部のマテリアルグループにアクセスするのは難しそうだから、WacroのShiftキーを押したら全部に適用される機能、あれを使おう。

というような感じでマニュアルと既存のスクリプトをコピーしながらPythonスクリプトを書く。リファレンスマニュアル、引数の記述が間違ってたんだけど……勘弁して。

171018-07

でもって作ったスクリプトをアプリケーションフォルダのRuntime>Python>poserScripts>Wacros>UserDefinedフォルダに放り込む。

171018-08

Poserを再起動すると、マテリアルルームのWacroの下にスクリプトが表示される。ところが、これはShiftキーを押下しながら起動しても、残念ながら全部のマテリアルグループに適用されることはないみたい。

仕方ないので、元からあるWacroボタンを書き換えることにする。どうせ元からあるやつ、古いものばかりでRemove Detached Node(未接続のノードを消すやつ)しか使ってないし。

171018-09

WacrosフォルダにあるmainWacors.pyというファイルがWacroボタンを定義していて、毎回起動時に実行されている。これの適当な行を自分の作ったスクリプトを参照するように書き換える。

171018-10

するとこうなる。

171018-11

ついでにレンダラやレンダリングオプションを書き換えるように記述を追加して、とりあえず適当なフィギュアを選択してShift+クリック。で、そのままレンダリング。

171018-12

これが

171018-13

こうなる。らくちーん。

Python、書いているうちにちょっと思い出してきて、別にWacro機能使わなくても作れるような気がしてきたんだけど。まあいいかな、需要もなさそうな気がするし……。



お返しに。

2017年03月14日(Tue)

170314

KYO’s Superfly materials 01 - Rosy -

ポチポチと自分用に作り貯めていた、Superfly用のマテリアル集です。ざっくり金属系36個、布系12個と革っぽいの4個、ガラス4個と液体っぽいの10個。実用に耐えるかな?というものもあれば、実験的なだけで汎用性に乏しいものもあり。

ちなみにFireflyには非対応です。中には専用のルートノードを持つものありますが、むしろ消していないから残っているだけで、調整などは一切してません。FireflyはCycles系ノード挟むと出力が0になっちゃうので、中には真っ黒だったりするのもあると思います。

ファイルにいちいち01とか番号がついてたり、そのくせなんだか飛び飛びになってたりするのは仕様です。作ってた中で不採用にしたものとか、最初から作っていないものなどがあるので。金のヘアラインとか、あっても仕方ないしね。そのうち第二弾とか出たら、同じ種類のものは同じフォルダにぶっ込むかもしれません。

とりあえず製作者側が作りやすい金属系、需要が高いであろう布系、作るのめんどくさい屈折系、あたりをちょこちょこ揃えています。他にも蝋とか紙とか石とか考えてたんだけど、いかんせん本格的に取り掛かるのが遅くなって時間が……あうあう。布系は概ねスケールを調整できるようになっているはずなので、アイテムに合わせて調整してやってください。シェーダってついてるのはだいたい色とか自分で指定できるようになっているはず……はず。たぶん。

あと、綿には普通のと透けるのと二種類を用意してるけど、実は普通の方も若干透けているのでご注意ください。服が透けるのは女子としては恥ずかしいことなので、女の子の外出着に適用するのは現実的ではない、とかね。

ええっと。

どのへんがバラ色なんだと聞いてはいけない。言うから。今から言うから。

いつだったかなあ。

「roseさんがPoser 7を購入されたら、マテリアル集でも出しましょうか」

……つまり、そういうことだ。

そんな、ぶっちぎりの不義理をぶちかますようなこのうつけ者を見捨てないでいてくれる、薔薇館のペンギン女史に日頃の感謝の気持ちを込めて。



みろくレンダリング。

2017年03月03日(Fri)

普通に撮る分にはFireflyに戻れない理由の一つがこれ。

170303-1

640×640pixelのテストレンダで、ピクセルサンプルはFireflyが3、Superflyが5。Fireflyはさらにレイトレースシャドウ+IDLの品質は7、イライラキャッシュをフル使用でシェーディングレート0.2というカナーリ抑えめなテストレンダでこの有様。Fireflyは透過体のIDL計算がやたらと苦手なんである。

しかもログを見ると、表示がなんだか怪しい。

170303-2

しめて1京8446兆7449億4988万2880秒。約6億年だなんて弥勒菩薩ぐらいしか待てないようなレンダリングを、小一時間で完了させるなんてFireflyある意味すごい……っていうかどこかで桁モレてるんじゃないのって感じだけども。

でもって、時間だけならまだ待てないこともないんだけど、アップにするとこの通り。

170303-3

暗い部分がベッタリと暗くなってしまう。Fireflyではちゃんとしたトランスルーセントを扱えなかったのが一番辛かったところで、レンダ設定を変えつつ複数枚撮りを合成することで対応してた。それがSuperflyではちゃんとマテリアル設定すれば、サクっと一発でレンダリングできるようになった。これが大きい。

170303-4

Superflyと同じ設定でFireflyレンダするとこんなになっちゃうしね。

ちゃんとしたTips記事にするのが面倒くさくてやってないけど、みんなSuperfly使うならトランスルーセントも活用しようね、っていう話。



屈折について

2017年02月18日(Sat)

今回はちょっと長めの記事。あ、いつもか。

1. 簡単なマテリアル

Superflyで屈折を持つマテリアルを実現するには、二通りの方法が考えられる。一つはFireflyと同様、Poserサーフェイスノードの屈折色にレイトレース>屈折のノードを追加すること。もう一つはCyclesサーフェイスノードのSurfaceにRefractionBsdfノードを追加することだ。

170218-01

大抵の透過体は表面がツルツルしているので、反射成分を追加することになる。CyclesカテゴリにあるGrassBsdfノードなら、屈折と反射を同時に描画してくれるのでお手軽だ。

170218-02

で、大体はこれで話が終わってしまうんだけど、もう少し複雑な構造やシチュエーションをレンダリングしたい場合には、知っておきたいことがある。

2. 屈折とは何か

そもそもなぜ、まっすぐに進むはずの光が曲がってしまうのだろう?

光はこの世で最も速く進む存在だ。その速度は3.0×108[m/秒]、一秒間に約30万キロも移動する。だけど実は、何かの物質の中を通り抜ける時には少しだけ遅くなる。真空を進むより空気中を進む方が、空気中を進むより水中を進む時の方が遅くなるのだ。

この速度の違いが、光の屈折という現象を引き起こす。斜めに当たった光が、そのわずかな到達時間のズレによって向きを変えてしまうのだ。これは、片側の前輪だけ先に砂利道に乗り上げた車によく似ている。反対側の前輪が砂利道に入った時、先に乗り上げた車輪は後から追いついた車輪ほど先に進んでいない。両輪の進む速度が違えば、車体は進みの遅い側へ曲がってしまう。しかし両方とも砂利道に入ってしまえば、車体は再びまっすぐに進む。

170218-03

実際には光は波の性質を持っているので、この現象はホイヘンス=フレネルの原理によって説明される。詳しく知りたい人は検索してみるといいだろう。

170218-04

ある物質に入る前の光を入射光、入らずに反射した光を反射光、中に入った光を屈折光、そして光が進む物質を媒質と呼ぶ。屈折率は真空中を進む光の速度を、媒質中を進む光の速度で割った数字だ。これを絶対屈折率と呼ぶ。どんな媒質の中でも光は真空中より速く進むことはできない。だから絶対屈折率は必ず1より大きい。

絶対屈折率 IOR = 真空中を進む光の速度 c ÷ 媒質の中を進む光の速度 v

波は、波長が短く振動数が高いほど媒質の影響を受ける。つまり波長の短い光ほど屈折率が高くなり、たくさん曲がることになる。この屈折率の違いがプリズム、分光という現象を起こす。よく水の屈折率は1.33であると言われるけれど、これは波長589.3ナノメートルの電磁波(黄色い光)を基準にした絶対屈折率だ。

さて、光はいつも真空から飛び込んでくるわけではない。空気から水の中へ、あるいは空気からガラスの中へ。ある媒質から別の媒質へ進む場合の屈折率は、どう求めればいいだろう。

媒質Aの物質から媒質Bの物質へ入射する時、その速度の変化の度合い、比を表す式はvb÷vaとなる。先ほどの式から、それぞれの速度vは光速cを絶対屈折率IORで割った値であるから、

vb ÷ va= ( c / IORa ) ÷ ( c / IORb ) = IORb ÷ IORa

つまり、新しい媒質Bの絶対屈折率IORbを元の媒質Aの絶対屈折率IORaで割ってやればいい。

相対屈折率IORA→B = 新しい媒質Bの屈折率IORb ÷ 元の媒質Aの屈折率IORa

またこのことから逆の場合、つまり新しい媒質から元の媒質へと出て行く時、光は相対屈折率の逆数の屈折率で屈折することがわかる。

3. Poserマテリアルへの反映

ではこのような屈折率を、どのようにPoserのマテリアルに反映するべきだろう。薄いガラスの板を通り抜けるシーンを考えてみよう。

170218-05

ガラスの絶対屈折率はだいたい1.45~である。大気の屈折率はほぼ1であるとしていいだろう。大気とガラスの境界面のマテリアルは、屈折率1.45を指定すればいい。じゃあガラスと大気の境界面のマテリアルは、その逆数の0.69を指定すればいいのだろうか。

170218-06

これはもちろん正しい。ただし、問題が一つある。光がいつも表から入ってくるとは限らないことだ。光源が反対側にある時、あるいはカメラがガラスの中にある時。どこから光が入ってくるかわからないのに、入る時と出る時で二種類のマテリアルを用意することはできない。じゃあどうしよう。

Poserはポリゴンの表と裏で、この二つを区別している。

つまり、媒質の境界をポリゴンで表現した時、面の表を元の媒質、面の裏側を新しい媒質として、その相対屈折率を適用するのだ。表から裏へ光が通り抜ける時は、適用された相対屈折率をそのまま使う。そして、裏から表へ通り抜ける時は、相対屈折率の逆数を適用する。ポリゴンで形成されたオブジェクトは、境界面に囲まれた任意の媒質で満たされた空間だと考えることができるわけだ。

170218-07

ためしにガラスの屈折率を設定した球体を二つ並べて、片方の面を反転させてみよう。ちょうど逆数の屈折率を適用した場合と同じ屈折像が得られる。

170218-08

というわけで長々と考えてきたけれど、結局冒頭に載せたように屈折ノードを接続すればいいことがわかる。

また、この媒質の厚さが十分に薄い場合、光は直進する時とほとんど変わらない軌跡を辿る。

170218-09

これは、形状が薄ければ屈折率が1に近づくということではない。厚さを無視しても良いような場合に限り、屈折のマテリアルは透明度で代用することができるということだ。また逆に、厚みを持たない形状の場合、屈折率は1でなければならない、ということでもある。表面しかないメガネのレンズに屈折を設定すると、光はいつまでもガラスの中を進んでいると考える。レンズから肌までの距離も全部ガラスだと判断してしまうのだ。

4. コップの屈折

さて、ややこしいのはここからである。

水晶球のようなアイテムを作りたいなら、球体に水晶の屈折率を適用すればいい。地面にできた水たまりを表現したいなら、平面に水の屈折を適用すればいいだろう。では、水を入れたガラスのコップを表現したい時、それはどんなジオメトリを持つべきだろうか。

170218-10

まず、こんなジオメトリに屈折率を持つマテリアルを適用してみよう。

170218-11

とても私たちの知るガラスのコップには見えなくなってしまった。コップが空の時、その中身は空気である。しかしこのようなジオメトリでは、光は中身を正しく判断することができない。

170218-12

だから屈折を使用するオブジェクトは、厚みを持つジオメトリでなければならないのだ。

170218-13

では次に、水を注いでみよう。それはどんなジオメトリを持っているべきだろうか。最初に思いつくのはこんな形だろう。

170218-14

しかし、これではやはり正しい屈折を計算することができない。なぜならガラスと空気、空気と水の境界は正しく設定できていても、ガラスと水の境界を設定できていないからだ。

170218-15

この状態では、コップの中身は空気なのか水なのかはっきりしない。ガラスと水の境界を設定しなければならないのだ。

丁寧に作られたコップのいくつかはこんな形状をしている。コップの形状の中に、液体の形状が入った形だ。

170218-16

しかし、これではどこか現実的でない結果になる。ガラスのコップと液体との間に隙間、つまり空気の層が存在してしまっている。屈折率が1だから影響はないだろうと思っても、光の進み方はそこで決定的に変わってしまうのだ。

170218-17

そんなわけで、最終的に屈折率を正しく表現するとこのような形になる。空気とガラスが接する面、空気と液体が接する面、そしてガラスと液体が接する面。この三つに別々のマテリアルを割り当て、それぞれに屈折率を設定してやれば、どの角度から見ても正しく計算される。

170218-18

また、間に空気の層を挟む先ほどの例より反射回数も少ない。ただし、このようにモデリングされているアイテムは、まだとても少ない。水量モーフを作るのもめんどくさいしね……。

5. 屈折と影

ところで。

先ほど「地面にできた水たまりを表現したいなら、平面に水の屈折を適用すればいい」と書いた。しかし実際にやってみると、なにやら変なことがわかる。

170218-19

マテリアルは正しく設定されているのに、水面が真っ黒になってしまう。どうしたことだろう。

170218-20

水面を動かしてみれば、真っ黒なのは影が落ちているせいだとわかる。屈折のマテリアルは適用された面を通り越してその向こうの様子を描画することができる。しかし、地面を描画するのは地面に当たったレイである。そして残念ながら、屈折の適用されたマテリアルは、他のオブジェクトから見たら不透明な材質として扱われてしまう。床や地面を計算する時、水面は光を通さない板として影を落としてしまうのだ。これはFireflyのころから変わらない。

170218-21

もちろん、だったら特性パレットで影を落とさないようにしてやればいい。しかし、他の影を落とすマテリアルと一体になっている場合には使えないし、一部のシェーダの描画で不都合が出たりする。なるべくなら使いたくない手段だ。

このような透過後の光を正しく描画するには、レンダリングオプションで屈折コースティクスを使用する。屈折コースティクスが有効な時、Superflyはライトトレースで光の経路を計算するので、地面は水面を通った光で照らされることになる。しかし、コースティクスの描画には膨大なレンダリングコストがかかる。計算結果がなかなか収束しないから、それなりの精度を得るにはもんのすごいサンプル数が必要になるのだ。

そこまで時間をかけたくない場合、また厳密な経路を計算しなくていい場合に有効な方法がある。LightPathノードを使用して、影の計算の時だけ別のシェーダを当てるように振り分けるのだ。

170218-22

LightPathノードのIs Shadow Rayは影の計算を行っている時だけ真(=1の値)を出力する。これで影の計算の時はただの透明シェーダ、それ以外の時は屈折シェーダで計算することができる。

170218-23

影を描画しない場合、Volumeノードの計算がうまく働かない。たぶん影を計算する時に同時に距離を算出しているからじゃないかと思う。だけどこの方法を使えばVolumeノードも正常に描画できる。なので、水深が深くなるほど色が濃くなるといった表現ができる。

170218-24

AbsorptionVolumeノードは距離に応じて色がつく(光が吸収される)シェーダだ。GlassBsdfの色はできるだけ薄くして、表面では吸収されないようにしておく。

170218-25

こんな感じ。屈折と反射と、あと中央付近の色が濃くなっているのがわかるかな。

6. まとめ

長々と書いたけど、屈折についての要点は以下の通りだ。

  • だいたいはCyclesサーフェイスノードにGlassBsdfノードを繋ぐだけでいい。
  • ポリゴンは媒質の境界面を表し、その表裏と屈折率には密接な関係がある。正しい屈折像を得るには屈折を考慮したモデリングとマテリアル設定が必要である。
  • 屈折のマテリアルは影を落とす。光を透過したい場合は時間をかけてコースティクスを使うか、より手軽にLightPathノードのIs Shadow Rayで透明設定と振り分けるのがいい。

そんなところかな。





Menu

Profile

Kyotaro

確定名:Kyotaro
ネタを探しているらしい。

Categories

Calendar

08 | 2023/09 | 10
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Comments

Archives

Track back

RSS feed

Links

Search

※2011年4月6日のサーバ障害の為、エントリのアドレスが以前のものからズレています。当Blogのエントリにリンクを張っておられた方は、お手数ですがアドレスのご確認をお願い致します。

※Internet Explorer非推奨。