モデリングの効率化
前回で、流れだけですがShade3Dを使った木造建築のモデリングについて書きました。
あっさりとモデリングできるように見えますが、結構時間がかかります。
前回は比較のためにすべて手作業でモデリングしたのですが、
ほとんどは繰り返しになるため、こういった部分はプラグインを使って自動化しています。
まずは、Shade3Dでのスクリプトとプラグインについて簡単に説明します。
筆者の場合は、インハウスで公開していないプラグインやスクリプトをいくつか作って用意してます。
その他、いくつかのプラグインは公開しています。
これをちょっとだけ紹介していきます。
Shade3Dでの拡張手段
Shade3Dでユーザが機能を拡張する方法としては、「スクリプト」を使う方法と、「プラグイン」を使う方法があります。
「スクリプト」はPython言語で書きます。また、ユーザインターフェス(操作ウィンドウ)としてHTMLを使用したものを「ウィジット」と呼んでいます。
ウィジットの場合は、HTML(JavaScript)からPython言語を経由してShade3D側の機能を呼び出すことができるようになっています。
Shade3Dでは、ShadeExplorerや3Dプリントアシスタントがウィジットで実装されています。
スクリプトリファレンスは、http://help.shade3d.jp/ja/support/PythonScriptRefDoc/ にあります。
スクリプトを使用する場合は、特に何かを用意する必要はありません。
スクリプトは、Basic/Standard/Professionalのどのグレードでも使用することができます。
「プラグイン」は、C++言語で書きます。
https://shade3d.jp/community/sdn/sdk.html にて、SDKをダウンロードして開発します。
プラグインはスクリプトの機能に加えて、Shade3Dの形状移動やシーン切り替えなどのイベントで処理を行うことができます。
エクスポートやレンダリングといった、スクリプトでは実装できない機能も拡張できるようになります。
また、C++言語を使うため速度が必要な場合に有用です。
プラグインは、Standard/Professionalのグレードで使用することができます。Basic版では使用できません。
「スクリプト」「プラグイン」を使う目的は、一番の利点は作業の効率化となると思われます。
ということで、今回はプラグインでの機能拡張の利用についてです。
UV展開でプラグインを使用している流れ
今回は昔の建物や空間を作るのが大きなテーマですので、小物類もたくさんモデリングしてます。
小物を作成する流れは以下のようにしています。
- Shade3Dでモデリング。fbxで形状データを出力。
- allegorithmic社の「Substance Painter」でテクスチャを3Dペイント。テクスチャ画像を出力。
- Unityに形状(fbx)とテクスチャを持ってくる
3Dペイントを行う場合は、重なっていないUV展開をする必要があります。
これはShade3Dの標準機能では作業が難しいため、「UVUtil」というプラグインを使用してます。
上記は、UVUtilプラグインで自動的にUV展開してから、UVを手作業で再配置して整えた例です。
UV自動展開は1秒もかからず、そのあとの再配置も含めて作業は数分でできます。
このような時間の短縮が、プラグインを使用する利点になります。
UV展開後、Substance Painterで3Dペイントして以下のようになりました。
キセルと煙草入れを1マテリアル、1テクスチャで表現するようにしています。
Substance Painterは、3D形状向けのペイントツールです。
2Dのペイントツールのようにレイヤで管理できます。
直感的にペイントしたり、用意されたマテリアルで塗ったり、パーティクルで汚れをつけたり、といった操作で、リアル寄りのテクスチャを描いていきます。
Substance Painterはテクスチャ画像を出力するのが目的となります。
以下は、Substance PainterからUnity向けに「拡散反射+透過」「反射+荒さ」「法線」を出力したものです。
Unity上で、このSubstance Painterから出力したテクスチャをインポート、Shade3Dから出力した元形状をfbxでインポートします。
Unity上では以下のようになりました。
隣のかんざしと櫛も、Shade3DでモデリングしてSubstance Painterで3Dペイントしたものです。
AOマップの作成
形状に対して遮蔽での影を疑似的に表現する手段として、AO(Ambient Occlusion)というものがあります。
これにより、形状の角部分が暗くなることで疑似的に間接照明が行われているような効果を出せます。
なお、Unityなどのリアルタイム環境では「SSAO」というスクリーンからリアルタイム生成するAOを与えることができます。
ただ、SSAOだけでは対応できない箇所もあり、その場合は形状に対してAOを割り当てることになります。
個々の形状に対してAOを与える手段としては、
頂点ごとにAOを頂点カラーとして与える方法、テクスチャとしてAOを焼き付ける(ベイクと言います)AOマップを使用する方法、があります。
このAOは、Shade3Dの標準機能では存在しません。
「AOUtil」というプラグインで頂点カラーとしてのAO、AOマップを生成できます。
以下のような社の場合、1つめのUV層を通常のテクスチャマッピング用として使用します。
これとは別に、AOマップ用のUVをUV2として与えています。
UV上の面自体が重ならないように、「UVUtil」プラグインを使用してUV展開してます。
このUV2を使用し、AOマップ計算したものを形状に反映すると、以下のようになります。
AOUtilで計算されたAOマップ用のテクスチャは、以下のようになります。
これをShade3D上でレイトレーシングでレンダリングすると、以下のようになります。
レイトレーシングを使ってますので間接照明計算をしていないのですが、間接照明が行われたようになっていますね。
このAOマップをUnityに持っていくと、以下のようになりました。
左はSSAOをオンにしただけのもの。右はSSAOをオンにして、かつ、AOマップを与えています。
陰影が単調になる部分を、AOによって調整しています。
社の屋根部分や扉の奥が暗くなっています。
AOは強すぎると違和感が出てきますので、ほんの少し影響があるように薄く与えるようにしています。
AOマップの使用は、テクスチャのリソースも使用するため「一部の特徴的な形状にのみ」使用することになるかと思います。
建物に近いけど建物ではない、中間的なサイズのものなど。
なお、建物のような動かない大きめの形状の場合は、Unityなどのリアルタイムではライトマップ(Lightmap)という事前計算を行うことになります。
このライトマップ工程に上記の社のようなAOマップを使う形状を割り当てた場合は、計算時間やテクスチャ分のリソースを消費してしまいます。
このあたりの、どの形状にライトマップを使用して、どの形状に頂点AOまたはAOマップを使用するか、というサジ加減が難しいところです。
これらを含めた、Unityサイドの調整については次回解説予定です。
このように、Shade3Dから他のツールにUVやテクスチャを渡す目的でプラグインを活用しています。
この「UVUtil」「AOUtil」プラグインは公開しているプラグインですが、
次は建物のモデリングで使用している、公開していないプラグインについて書いていきます。
建物のモデリングでプラグインを使用
建物のモデリングは単純作業の繰り返しになりますが、寸法が厳格だったり何よりも工数がかかります。
チュートリアルでは現代の建築物のモデリング手順ですが解説してます。
1つの建物を作るだけでも大変そうです。
木造建築モデリングでも、もちろんこの手間はかかることになります。
ただ、建築物は長い年月をかけて先人がシステム化してくれているのもあり、ルールがある程度決まっています。
それを機能として落とし込み、ある程度自動化する作業をプラグインで行っています。
これについては、自身の作業効率化用としており、インターフェースを整えていない部分、未実装な部分が多々ありますので公開していません。
平面図をプラグインで作成します。
日本的な建物では標準で使われる、910mm単位(単位変更可能)でスナップできるようにしてます。
部屋、柱、壁要素を平面図として配置してます。
基礎となる石を自動配置。
このときの「石」はマスターオブジェクトとしてあらかじめ用意しています。
外壁に沿って並べる部分はプラグインで処理してます。
入力データを元に、柱や梁、屋根の骨組みを自動生成。
平面図に窓や扉情報を追加して、壁を立体化。
窓や扉の開口処理のために、壁は自動的に面分割されます。
壁厚や窓の位置、梁の位置や高さなど、パラメータを調整して何回でも立体化できるようにしてます。
下見坂張り+ささらご、といった昔の典型的な外壁も、別途作成したマスターオブジェクトを指定して入れ替えることができます。
また、テクスチャを貼った木材の大量生産(UVをずらして木材を作る)も、このプラグインで行うことができるようにしています。
基礎の石や窓や扉の素材、テクスチャ素材などをあらかじめ用意し、このプラグインで平面図作成、立体化、とすることで、
数分程度で家一軒を作るというモデリング時間の短縮を行ってます。
建物をモデリングすること自体は、Shade3Dの標準機能だけでももちろんできるのですが、
広い街全体にたくさん建物を建てないといけない場合や、後から壁厚を変えたい、などといった場合に、
やはり専門ツール化、プラグインでの拡張が必要になります。
また、柱や建具(窓や扉など)を配置する場合に壁芯にスナップする、壁に沿うように建具を回転させるなどの機能も必要となります。
これらはプラグインとして実装しました。
このプラグインは、木造軸組構法の伝統工法に特化したツールとしてます。
在来工法だとまた別の機能が必要で、現代の建築だとまたさらに別の機能が必要になりそうですね。
ところで、このプラグインは実際にコンテンツを作りながら、何回も修正や機能追加を繰り返しています。
やはりコンテンツを作りつつ道具をそれに合わせて強化、が一番かゆいところに手が届くツールとなりそうですね。
コンテンツを作るためのツールという立場で、モデリングが面倒なのでついでにプラグインを作っている(やや乱暴な言い方ですが)、という感じです。
公開している「UVUtil」「AOUtil」プラグインもそのようなコンセプトになってます。
今回は、プラグインでの機能強化の解説でした。
プラグインSDKが用意されているのですが、残念ながらドキュメントが整備されていない点も多く、
以前からプラグインSDKを触っている人でないと、なかなか扱いが難しいです。
機会があれば、このあたりのSDKの使い方の整備ができれば、、、。
今はコンテンツを作ることが大きな目標ですので、まずは現状の機能で何ができるのか、で攻めていくようにしています。
さて、次回はガラッと変わり、
Unityに持っていってどうやってリアルな空間にしていくか、ということを書く予定にしています。
なんだかVRというよりも、コンテンツをどう作ってるかになってしまってますね。
でも、コンテンツありきのVRですのでこのまま進めていきます。
VR特有の内容については次の次くらいになるでしょうか、
VRに入る前にもいろいろ知識がいるんだな、というのを感じ取っていただければこれ幸いであります。
One thought on “第4回「プラグインでモデリングを効率化」”
Comments are closed.