「モデリング入門」の編集履歴(バックアップ)一覧に戻る

モデリング入門 - (2016/04/13 (水) 19:11:36) のソース

ゲーム用アセット制作に役に立つ基本情報をここでまとめたいと思います。

#contents

*ゲームのモデリング
三次元のモデルを作ることをモデリングといいます。
モデルはポリゴン(三角形・四角形・多角形の面)で構成されていて、分解すると頂点、辺、面、面・頂点の向き(法線=ノーマル)です。
三角ポリゴンであれば、頂点の位置が決まれば高速で面が決まります。そのためリアルタイムで動くゲームのメッシュはすべて三角ポリゴンで構成されています。

&bold(){しかし}、データとして作りやすいのは&bold(){四角ポリゴン}の方です。
ポリゴンの構成(※トポロジー、後述)がわかりやすく、ポリゴンの分割・拡張、ループカットや選択もしやすいのでまずはこちらで作るべきです。
四角ポリゴンから三角ポリゴンに分割する(triangulation)のは簡単で、ゲーム用に出力をしたとき(スカイリムはnif exporter通した時)に自動ですべて三角ポリに分割してくれます。

歪みを防止するために仕上げに三角面に分割する場合は、四角ポリゴンで作成したデータは必ず残しておいてください。あとから修正するのが非常に困難になります。

三角ポリゴンは、少ないポリゴン(減ポリ)で構成するために天球体割りしたり、自動分割で発生する歪みを補正する場合に部分的に使いますが、慣れないうちは気にしないでください。

&bold(){Point}
-&bold(){ゲームはすべて三角ポリゴンを使う}
-&bold(){制作データはなれないうちは四角ポリゴンで制作する。}
-&bold(){四角ポリゴンで作ったデータは必ず保管しておく。三角ポリ化後は修正が大変なので。}

*モデリングのワークフロー
まず、どういう工程で作っているのかという流れを把握します。
正解ではなく、人によって工程が前後したり、何かしら違いはあると思います。
※厳密にはテクスチャ・マテリアル作成やウェイト設定等はモデリングの工程には含まれないです。
ただしゲームにモデルを出すには必要な作業なのでここではまとめてます。
#ref(modeling_workflow.png)
グレーのは必ずしも必要ではない工程。

**資料収集
資料収集ですが、構造の理解してないと全然進まないので&bold(){この工程は時間をかけます}。
Google画像検索、Pinterestなどでリファレンスに使う画像は集めれられます。
&bold(){現物が見れるなら現物を見て}、そして写真も撮っておくと良いです。
できれば作るものについての知識もつけておきましょう。
鎧を作るならばその種類や歴史を知っておくと説得力のあるモデルになります。
検索だけだと色々と混同しがちで、ファンタジーとはいえ地に足の付かないものは説得力がありません。

**ラフスケッチ
必ずしも必要な工程ではないですが、&bold(){何を作るのかイメージを固めないとこの後が進みません}。
人に見せるものではないので絵が下手くそでも、線が狂っていても全く構いません。

もしくはスカルプト(SculptrisやBlenderのスカルプト機能、3D CoatやZ Brush等)でラフモデルを作るのもおすすめです。スケッチよりこっちのが得意な人も一定数はいるはず。


横と正面を書いて2面か図にして下絵にそって頂点を配置していく手法があるんですが、3D空間でのシルエット形成技術やポリゴン分割の練習にならず応用が効かないのでオススメしません。
ポリゴンモデリングの場合はトポロジーをある程度意識しながら作ることになるので、ざっくりポリゴンの流れも描いておくとやりやすいです。
:トポロジー|3DCGでいうトポロジーというのはポリゴン面の構成です。どういう分割の仕方をすれば綺麗な流れになるのだろうかというの考えていきます。
トポロジーが綺麗とはポリゴンの流れが綺麗とも言い換えられます。 

トポロジーがきれいな利点
-ループ選択がしやすい
-UV展開がしやすい
-ウェイト作業がしやすい(アニメーションで破綻が少ない)
-少ないポリゴン数で済む(負荷が軽く編集しやすい)
-実際に画面で表示するときに歪みなく良好な結果を得やすい

特に人体と人体に身につける布など柔らかいものはポリゴンの流れが筋肉に沿っていないとアニメーションで破綻しやすいので重要です。
[[きれいなトポロジーの例>http://www.pinterest.com/aelaraji/clean-3d-topology/]]

**モデリング
すべてのディテールをポリゴンのみで表現するのは現状のゲームではまずできません。
なので少ないポリゴン+ノーマルマップというテクスチャにディテールを焼き付けて(ベイクと言います)擬似的に再現します。
#ref(normalmap.png)
(c)wikipedia

このノーマルマップは手で描くには非常に難しいので、ハイポリのモデルを作ってベイクもしくは画像からノーマルマップを作成のどちらかです(あるいは両方)。
初めからハイポリで作って、あとからリトポ(ポリゴンの面を貼り直してローポリへ)する&bold(){スカルプトモデリング}
ローポリで作って必要に応じて画像からノーマルマップ作成か、ハイポリのモデル作ってベイクする&bold(){ポリゴンモデリング}
2種類の手法のどちらかで作ります。(実際には他にいくつか手法はあります。)
人によって向き不向きもありますし、作る題材によっての向き不向きもあります。

&color(#444444){※ここで言うローポリはゲームで使えるレベルのポリゴン数、ハイポリはそのまま使うには重すぎるポリゴン数ぐらいの意味で、特に数が決まってるわけではないです。}

***ポリゴンモデリング
&bold(){ポリゴンモデリング}は基本のモデリング方法でこれでほとんどのものが作れます。
ただしトポロジーを常に意識しないといけないので複雑な形状やディテールになるほど難しいです。
応用が効きやすいので他の手法を混ぜたり、ディテールの部分をスカルプトやテクスチャで補助することもできます。

例えば電池など単純な形状のものをわざわざハイポリのモデルを用意する必要はありません。円柱を少しいじればすぐできます。
マグカップなどのディテールが少ないのもテクスチャからノーマルマップを作れますので同様にわざわざハイポリモデル作る必要ありません。
こういった事例はポリゴンモデリングが向いてます。

***スカルプトモデリング
&bold(){スカルプトモデリング(スカルプティング)}は近年急速に普及してきた手法で、彫刻や粘土細工のような感覚で作ることができます。
造形中はトポロジーをあまり意識しなくていいので、複雑な形状やディテールを得意としますが、代わりに正確な形状を作るのが難しいです。

人やクリーチャー、オーガニックモデル(自然物)の制作に向いてます。
ハードサーフェイスモデル(Hard-Edged Modelとも。人工物。表面の硬そうなもの)には向いていないとされてきましたが、
ノウハウの蓄積やソフトの進化で十分対応できるようになってきました。※ただし、エッジがきれいに立つZbrush向きの話

***サブディビジョンサーフェスモデリング
&bold(){サブディビジョンサーフェス(以下サブディビ)}は日本語で細分割曲面と呼ばれ、その名の通り細かくポリゴンを分割して曲面に仕上げます。
ポリゴンモデリングは曲線多くなると制御が難しくなりますが、サブディビの場合は少ないポリゴンで複雑な曲面を制御できます。
どれだけ分割するのかの度合い(サブディビジョンレベル)を設定できます。
立方体でサブディビをかけて分割数を増やすと、球体になります。
#ref(subdiv.png)

その性質を説明するのは難しいですが、どれだけ曲面になるかは&bold(){隣接する辺によって決まります。}
辺と辺の幅が狭いほど元の形状が維持されるので、四角形を維持したい場合は辺と辺の幅を狭いエッジループを作ります。
基本的に四角形で構成します。三角形や多角形は歪みが発生します。辺の集中する箇所は歪みが発生します。
#ref(subdiv2.png)

[[サブディビジョンサーフェスの基本的な性質についての動画>https://vimeo.com/2158706]]

***結局どれで進めたほうがいい?
作るものによるんですが、Blender単体だとポリゴンモデリングをまずはオススメします。
というのもハイポリモデルの方作って、いざリトポとなると、トポロジーが理解できてないとそこで詰まる可能性があります。


***ディテールの追い込み
模様・装飾・シワ等の細かい部分をポリゴンモデリングでやるには難しく手間がかかるのでノーマルマップを作成するためにスカルプトする場合があります。

マルチレゾリューション(Multi Resolution=多重解像度)モディファイアを使うとベースはローポリのまま、ハイポリのディテール部分を持たせることができます。
もしくはローポリゴンモデルを複製して、サブディバイドやサブディビジョンサーフェス(細分割曲面)モディファイアで細かくポリゴンを分割したあと、ディテールを作ります。
どちらもその後ノーマルマップにベイクします。

***リトポロジー(Re-topology)
一からスカルプトした場合は数百万~数千万の膨大なポリゴン数で制作しますが、これをゲームで使えるレベルまでポリゴンを再構成します。
これがリトポロジー(リトポ)です。要はポリゴン減らすことです。

Blenderの場合はスナップ機能を使ったポリゴン貼り付けか、デフォルトで含まれるアドオンBsurfaceを使ってペンで描いてポリゴンを貼り付けるかのどちらかです。

ZbrushならZremesher、3DCoatならautopoと呼ばれる自動リトポ機能がありますが、基本的にはゲーム制作ではそのまま使えないので手動でやります。
3DCoatの方は手動のリトポも強力なためリトポ・UV専用での使用例も。


**UV展開
3次元上のポリゴンに対して、2次元のテクスチャを貼る時にその貼る位置を指定する必要があります。それがUV展開です。
Seamと呼ばれる切れ目を入れて、展開します。
立方体にサイコロのテクスチャを貼り付ける場合は以下の展開図になります。
#ref(http://cdn50.atwikiimg.com/skyrim_mod/?plugin=ref&serial=90)

[[UV展開>UV展開]]

**テクスチャ作成
この作業は使用するツールや個人によってかなり差が出やすいので中々共通化が難しいですが、最も見栄えに関わる部分でもあります。

***テクスチャの解像度について
ほとんどのテクスチャサイズには決まりがあって、縦横の大きさが&bold(){2のべき乗}です。
&bold(){2,4,8,16,32,64,128,256,512,1024,2048,4096,8192}
これは”割りやすい”からです。これ以外のサイズだと小数点誤差が出てしまって実際の見た目と変わってしまいます。
基本的に正方形がなんですが、縦1024*横512みたいな長方形もできます。(プログラム的に正方形が扱いやすいので正方形推奨)

テクスチャには最適な解像度が存在します。
メモリの大半をテクスチャが占めますので&color(#992211){&bold(){テクスチャのサイズはできるだけ小さいほうが良い}}です。
ただし、UVとの面積比も重要で
メッシュが大きい(UV面積が大きい)のにテクスチャサイズが小さすぎるとボケるのでそれは大きいテクスチャサイズが必要になります。

ここまでまとめ
&bold(){良いテクスチャはサイズが小さくてディテールが濃い}
&bold(){悪いテクスチャはサイズが大きくてディテールが薄い}

制作上の手順としては
+1024(1k),2048(2k),4096(4k)などのサイズで制作
+小さいサイズ(テクスチャによりますが例えば256*256)から出力してゲームまたはnifskopeで確認する。
+目視で気になるぐらいにボケていれば、サイズを上げる(例:512*512)
+一つ上のサイズとあまり差がなくなったらやめる。(1kと2kで&bold(){大きく}差がないなら1kで配布)

目視もあんまりあてにならないので、定量的にやりたい場合、画像にどれだけディテール量(密度)があるかは[[フーリエ変換を用いたテクスチャ解像度推定とその応用>>http://www.slideshare.net/nikuque/ss-52190439]]を読んでください。
実際の検証と応用例としてこちらもどうぞ。→[[DDSの最適なミップマップフィルターの検証>>http://skyrimshot.blog.fc2.com/blog-entry-80.html#more]]

実例で見ましょう。
画像はドラゴンのディフューズマップの一部です。
#image(Dragon.PNG)

鱗部分の細かいディテール密度があり、メッシュ自体が大きいのでこの場合は大きいテクスチャサイズが必要です。
ですのでドラゴンのテクスチャは2048*1024サイズです。
&color(#444444){※逆にこれ以上の解像度は通常意味がないです。&br()これ以上の解像度でクオリティが発揮できるのはZerofrost氏の[[Thanatos as Durnehviir>>http://www.nexusmods.com/skyrim/mods/35576/]]ぐらいのディテールと技量が必要です。&br()Zerofost氏のテクスチャワークはmod界隈でもトップクラスで勉強になると思うのでDLして観察するのをお勧めします。}

#image(GreyNoise.png)

一方ノイズだけのような単純なマップは大きいサイズの必要がありません。
ですので64*64サイズです。逆にこれ以上小さいとパターンが見えてしまって不自然になります。

単色マップなども4*4ぐらいでもいいです。



***基本的なマップ

&bold(){ディフューズマップ}
何もつかない.ddsはほぼディフューズマップ。
ベースとなる色とAO(環境遮蔽)などのシャドウを足したものになります。

&bold(){ノーマルマップ}
~_n.ddsや~_msn.dds。
1ピクセルごとの面の向き(ベクトル)を決めるマップで、平たく言ってこの向きで凹凸を表現するものです。別名法線マップ。(法線=接平面に垂直な直線)
細かい凹凸をポリゴンのみで表現すると非常に負荷がかかるので、ローポリゴンにノーマルマップを貼ることにより詳細かつ低負荷のモデリングが可能になります。

RGB各チャンネルにそれぞれXYZと割り当ててこれで&bold(){面の向きを決めています}。

 チャンネルとは…
 光の三原色、赤、緑、青を合成してディスプレイに表示します。
 RGBの画像はそれぞれ三色別に色情報を持っていてそれがチャンネルです。
 赤はR、緑はG、青はBとなってます。

ただの板ポリゴンに右のノーマルマップを貼ったもの。
#ref(normals.jpg)

これをチャンネル別に分解すると
#ref(normalc.jpg)

マップを貼った状態のXYZ軸(面の向きに依存する)
#ref(normalxyz.jpg)


ノーマルマップにも2つ種類があって、&bold(){モデルスペース}(オブジェクトスペース)と&bold(){タンジェントスペース}があります。
&bold(){モデルスペース}はファイル名が_msn.ddsで顔や身体はこれです。元のモデルの法線情報をすべてテクスチャに描き込みます。
長所
-モデル(メッシュ)の持つ法線は無視され曲面が滑らか
-タンジェントスペースに比べるとわずかに処理が軽量
短所
-編集しにくい
-変形するオブジェクトが苦手
-使い回しが効かない
-タイルやミラー駆使したUVなどで使えない
-圧縮に不向きでブロックノイズが発生しやすく、結果的に容量をつかってしまう。

&bold(){タンジェントスペース}
ファイル名が_n.ddsで基本的にほぼこれです。ポリゴンの向いてる方向(法線)に依存します。
長所
-編集しやすい
-使い回しが効く
-圧縮しやすい
短所
-モデルの形状に依存するので低ポリゴンだとポリゴンのカクカクが目立つ
-モデルスペースよりわずかに処理が重い

ノーマルマップの座標軸は
BlenderやXnormal(デフォルト)では+X+Y+Zですが、スカイリム(nif)の場合は-X+Y+Zになります。
設定を変えるか、赤のチャンネルを反転してください。


&bold(){スペキュラーマップ}
~_s.ddsと&bold(){_n.ddsのアルファチャンネル}。
光沢のマップです。スペキュラーは直訳すると鏡面反射光ですが、&bold(){これは光源の映り込んでできるハイライトなんですが、}フェイク的な実装のために本来の性質と結構違うので単純にテカリだと思ってください。背景が映り込んだりはしません、それは環境マップです。
マップが白いほど光沢があって、黒いほど光沢が無いです。
スペキュラー光は視点と物体の角度によってその反射の仕方が変わります。
よってスペキュラーマップのそっくりそのまま光沢になるわけではないです。

光沢が適用される広さに関してはBSShaderLightingPropertyのGlossness(=Specular Power)の値で変更できます。
値が小さいほど広範囲に光沢が出て、値が大きいほど狭い範囲で光沢が出ます。
光沢そのものの強さ(光源から影響の受けやすさ=弱い光源でも光沢が出る)はSpecular Strengh(=Specular Amount)です。

&color(#cc0000){&bold(){ノーマルマップが~_n.ddsの場合は、スペキュラーマップは_n.ddsのアルファチャンネルに格納されてます。これは余ったスペースを有効活用してリソースの圧縮するためのもので本来は全然別のマップです。}}

 アルファチャンネル(A)という透明の情報を持つチャンネルがあります。
 そのままの意味でこのチャンネルで指定された黒い部分を透明にするために使う場合もありますが、スカイリムの場合は、スペキュラーマップに使う場合があります。
 (少しテクニカルですが、ノーマルマップRGBそれぞれに8bit(256階層)ずつ割り当てると24bit、RGBAで32bitになります。
 スペキュラーマップは単色でいいんですがそれに24bit分使うのにはメモリがもったいないのでノーマルマップで使わないアルファチャンネルの8bitに入れます。)

&bold(){環境(マスク)マップとキューブマップ}
環境マップは_em.dds, _m.dds。キューブマップはtextures\cubemap\フォルダに入ってます。
物体は光を反射する性質があって、例えばガラスや金属は周囲の物体を反射して映り込みますよね。
キューブマップというのは、その名の通り立方体状のもので、背景のようなものが描かれていてこのテクスチャが映り込みとしてゲームに反映されます。
本来ならばゲーム画面内の映り込むのが自然ですが、それだと負荷がかかりすぎるので、予め決まったテクスチャ(=キューブマップ)を写り込ませるというフェイクの技術です。
このキューブマップの映り込みの強さを決めるのが&bold(){環境マップ(Enviroment Map)}です。

金属やガラスなどの映り込みがするオブジェクトに使います。
nifskopeでBSLightiningShaderPropertyをEnviormentMapの設定にしないと使えません。

本来(物理レンダ)だと金属はスペキュラーマップが要らないんですが、この環境マップはフェイクであるので併用しないと違和感があります。屋内なのに屋外の映り込みっぽく見えてしまったり。


*実際に手を動かしましょう
作ることで初めて身につきます。
以下に実践用の記事を準備していきます。


[[鉛筆を作る]]:ワークフローをざっくり学ぶ
[[サイコロを作る]]:サブディビジョンサーフェイスでのモデリングを学ぶ
Tシャツを作る:スカルプト、ウェイトを学ぶ


 
目安箱バナー