モデリング

BlenderでXray目の再現

どうも、チョコです。多く知られているMultipassのやり方を(今更)理解したので共有したいと思います。

BlenderではMultipassのことをRenderLayerといい、Compositorで組み合わせができる。

ラムのモデルでデモしよう。

Screenshot (1226)

 

髪の毛の前に目を出したいので、まず目と髪の毛を別のオブジェクトにして、髪の毛をレイヤ2にする。

RenderLayerを2個作り、それぞれのマスクを設定する(Hairはレイヤ2しかレンダしない)。

Screenshot (1221)

これをレンダすると、髪の毛が消えた。さて、Compositorで合成しよう。InputNodeを2個使えば両方のRenderLayer画像が入手できる。

 

レイヤ1から目の部分を切り取りたいので、ObjectIDマスクで分離する(目のObjectID1にした)。

Screenshot (1224)

最後に、二つのレイヤをCombineZで合成し、さらに上から切り取った目をAlphaOverする。

Screenshot (1225)

完成。では。

 

Unityを拡張しよう!#2: 表面分割アルゴリズムの実装(Part 1)

どうも、チョコです。あけましておめでとうございます。

さて、今年初の記事です。わーい。
(もともと去年に完成させたいものですが、バグが出てきてそのまま年越えましたorz)

さて、今回は”Catmull-Clark 表面分割をUnityで使いたい!”と思ったので作ってみました。はいストップ。Catmull-Clarkは何ぞや。説明します。
Catmull-Clark Subdivision Surfaceとは、とあるメッシュを分割し、比較的に滑らかな四角ポリゴンからできたメッシュにするアルゴリズムです。

ニホンゴデハナシテ。

見ていただいた方が早いので、↓の通りピラミッド、キューブとn角はてなメッシュを表面分割させました。

screenshot-426

あらきれい。滑らかになってますね。
ちなみにBlenderではこのようにModifierを追加することで表面分割させられます。

screenshot-428

Catmull-Clark出てきましたね。

では、これをUnityに入れたいと思います。ちょっとまて。なんで入れるのかな。Blenderではもうこの機能ついてるのに??

答え:>>>アニメーションのためです!ボーンを付けてアニメーションさせたところ、Modifierは全部消されてしまいますボーンModifierの前に適用されます。じゃあそもそもボーンの後に表面分割する必要ある?って思ったあなたへ、下の図をご覧ください。

screenshot-434

足ですね。曲がるところに頂点がないことを確認してください。
でもちょっと頂点数少ないので、表面分割しましょう。

screenshot-422

円滑になりました。でも左の方はなんか不自然ですね。これは分割してからボーンを付けたせいですね。曲がるところに頂点が入ってしまいますので、これを2本のボーンだけでは数学的には右のような形にはできません。説明略。
右のほうを見ると頂点は全く同じで、ただボーンと分割の順番を逆にしただけできれいになります!!

疲れた。まだ本文に入っていない。まだちょっとありますので我慢してください。

では、このアルゴリズムをUnityに入れ(たいと思い)ます。Catmull-ClarkのWikipediaページをご覧いただくと、頂点の関係式は中学レベル以下ですね。記事書く必要ある??って思うかもしれません。こんなの3秒で書いてやる!とか、思いましたか?私か思いました。orz

さて問題:よく読むと、このアルゴリズムはN角形に対応しています。そこでUnityは、なんと、三角形(時には四角形)しかできないのです!!!

それだけではありません。メッシュを分割させるために、ボーンに変形された頂点位置が欲しいが、これも、なんと、シェーダー側でしか手に入れられないのです!!!(実はBakeMesh()関数もありますが、indexなどがめちゃくちゃかつ遅いのでやめました。)

ち。面倒なことになってきましたね。そもそも面のデータが取れないのに、どうやって実装するんだ。

あれあれ、この前も記事書きましたよ?この記事#2ですから、#1はどういう内容かな。
それはなんと、Unityにimportされないデータを読み取れるエディタースクリプトでした!!!!!パチパチパチ。
リンク張っておきます。

(ここからが実装の本文になりますが、正直いちいち説明するのがめんどいので手順だけ紹介します。詳しく知りたい人はGithubページへ)

まず、1で作ったスクリプトをEditorで呼ぶことにしました。.netでBlenderのexeを見つけて、それにアセットを入れて、同じフォルダーにデータを出力させました。こんな感じです。(.blend)の隣のn++ファイルが出力ファイル。

screenshot-429

これで面のデータが取れますので、これを表面分割アルゴリズムに突っ込みます。中学レベルの数学なので省略。
*ここでは、頂点を生成するアルゴリズムを実行しました。この関数はStart時点に一回だけ実行したいので、頂点関係をあらかじめバッファーに入れました。データ構造以下のようです。

screenshot-430

次に、変形された頂点の位置を読み込み、関係式に突っ込みたい。あれ、データが入手できない。ち。

シェーダーを使うしかないですね。では、どうやってシェーダーから頂点データを出力すればいいんだ?

やり方は2通りあります。テクスチャに書き込むか、ComputeBufferを使います。

テクスチャ使ったら、まあそれは簡単になりますし、一般のパソコンでも動くでしょうけど、分割したいメッシュ1体につき、カメラが一個増えます!!
仕方ない。ComputeBufferを使います。

待てよ、ComputeBufferつうのは、シェーダー語のRWStructuredBufferなので、行列のindexはどうするんだ??
indexは頂点のindexと同じなので、シェーダーが今レンダ―している頂点のindexを分かればよいのです!。。。どう渡すんだ?

答え:>>>UVマップを使います!!そもそも最終的にオリジナルメッシュは見えないので、UVを使っても問題ない!!

というわけでシェーダーはこんな風になります。

screenshot-431

さすがに長すぎますので、Part 2に続きます!戻ってくるぜ。

Blender Cycles “Lamborghini Gallardo LP570-4″作成 Part2:Material

こんにちは、画像の使いすぎでメディアを占領してしまい申し訳なくなってるmoumouです。
前回のモデリング編に続いて、Part2:マテリアル編を書いていきたいと思います。

応用が効きそうなことだけ書いているので、だんだんランボルギーニ関係なくなってます(笑)

 

このような流れで書いています。

  1. 全体の設計&モデリング編(+ドローン動画)
  2. マテリアル設定 (←今ここ)
  3. ライティング& 環境設定
  4. コンポジットによる実写合成

今回の目次

  1. フレネル効果
  2. バンプマップを利用したノード構成
  3. 綺麗な床のマテリアル

cyclesを扱ううえで知っておくと良いことを書いていきます。

続きを読む

Blender Cycles “Lamborghini Gallardo LP570-4″作成 Part1:Modeling (+ ドローン動画)

こんにちは、moumouです。

今更ですがBlender Cycles講習会、楽しんでもらえたみたいでよかったです。

今回は、みなさんご存じ超高級車”ランボルギーニ“をBlender Cyclesにて作成しました。

 

春休みには作り終えてたモデルなのですが、記事書くのがめんどかった,いや, ある程度長くなる記事だったので,  今更ですが連載記事として投稿したいと思います。

連載記事ということで、以下のような流れに分けて書いていきます。

  1. 全体の設計&モデリング編(←今ここ)
  2. マテリアル設定
  3. ライティング& 環境設定
  4. コンポジットによる実写合成

Blender経験者なら分かるように書いていくので、説明記事みたいになるかもしれません。

基本的に役に立ったことをメインで書いています。

今回の目次

今回のモデリング編は3ページの構成です。最後はオマケです。

このページ:  3Dモデル,モデリングの流れ
2ページ目: 小ネタ, モデリングの際に役立ったこと
3ページ目: ドローンお土産動画

 では早速、Part1.モデリング編を書いていきたいと思います。が、ぱっと見てさっと記事閉じる人向けに(笑)、まずはじめに今回作成した画像と3Dモデルをひとつ載せておきますね。

3Dモデル

↓が3Dモデルです。▶を押して約15秒後3Dモデルを見ることができます。マウス操作で360°回転,拡大できます。また、右下の設定ボタンでワイヤフレームを見たりMatCapで見たりできます。

Lamborghini gallardo lp570-4
by moumou
on Sketchfab

………………………….

続きを読む