Blenderで制作したモデルのTextureをSubstancePainterで制作するまでのフロー

#初めに
Blender Advent calendarですが、遅れてしまい申し訳ありません。年内にはと思い書き始めました。
この記事では、Blenderで制作したモデルに、Substance Painterで制作するフローとその過程で行うチェック項目についてまとめました。(**以降、Substance Painterのことを以下ではSPと省略します**)
#目次
[1.なぜSubstancePainterを使うのか?](#1-%E3%81%AA%E3%81%9Csubstancepainter%E3%82%92%E4%BD%BF%E3%81%86%E3%81%AE%E3%81%8B)
[2.Low polyモデル制作](#2-low-polyモデル制作)
[3.Face-Orientationに気を付ける](#3-face-orientationに気を付ける)
[4.Materialを設定する](#4-materialを設定する)
[5.ポリゴンを分ける](#5-ポリゴンを分ける)
[6.Vertex paintでID Mapを制作する](#6-vertex-paintでid-mapを制作する)
[7.High Polyモデルを制作する](#7-high-polyモデルを制作する)
[8.ScaleとRotationの初期化](#8-scaleとrotationの初期化)
[9.Meshを正常化する](#9-meshを正常化する)
[10.UVを展開する](#10-uvを展開する)
[11.Bake](#11-bake)
[12.Combineする](#12-combineする)
[最後に](#最後に)



#1. なぜSubstancePainterを使うのか?
この記事では、[SubstancePainter](https://www.substance3d.com/)を使うことを前提に書いています。
Blender単体でも作成したモデルのマテリアルを十分作り込めます。また、keyframeなどをMaterialのノードでも利用できるので、用途として幅広い表現ができます。一方で、Blender内で作ったMaterialは、Blender以外の場所へ持ち出して利用することが難しいです。というのも、BlenderでMaterialをTextureへbakeする機能があるのですが、このBake機能は結構時間がかかってしまう上、出来上がりとして、精度の良いTextureを作るのには若干不向きな気がします。(何度か試した経験則です)

例えば、Blenderで作ったモデルをUE4などのゲームエンジンにExportしたときに見た目の質感をつけるためには、UE4内で制作するか、Blenderでbakeするか、Substanceなどの外部アプリで制作するかの選択肢がありますが、Normal Mapの制作とTextureの精度、プリセットの豊富さなどを考えるとSubstanceなどの外部アプリ(そのほかには、Toolbagなど様々なアプリがあります。)で行うのが良いという判断になりました。

##動作環境
Blender2.9
SubstancePainter 6.2.1
Windows 10

#2. Low polyモデル制作
まず、Blenderで、SubdivisionやBevelをする前のlowpolyモデルを制作します。今回は、Hard Surfaceのモデルを例に説明させてもらいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/2a73f997-3bf6-0d10-814d-bc2c005e10c0.png)

#3. Face Orientationに気を付ける

このモデルのディーテルを作成する前に、ゲームエンジンやSubstancePainterでのBakeの際に正常に表示、機能するようにMeshのFaceの向き(=Face Orientation)を確認します。Meshの表面の法線の向きが外側に向くように設定をしておかないと、Blenderで正常に表示されていても、UE4やSPで透明に表示されてしまいます。Face Orientarionは、Blenderの右上のタブから、チェックボックスにチェックすることで表示できます。
![スクリーンショット 2020-12-29 17.39.58.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/1a3d7948-f56f-0add-c78b-28c6f98233cf.jpeg)

この状態で、Meshは青と赤色に塗りつぶされた二つの領域に分かれます。青色は、法線が外側に向いているFaceを表し、赤色は、faceが内向きになっていてSubstanceなどで透明になってしまう部分です。赤色の部分があれば、法線を逆向きに設定しなおしてください!(きちんとモデリングされていると、全て青色に表示されます。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/26b1570e-f1ae-aeb2-ab05-3b6d942197d6.png)

#4. Materialを設定する
次に、SubstancePainterでTextureを制作するための基盤になるモデルのMaterialを設定します。名前を適当に設定し、アサインしておきます。ゲームエンジンなどでモデルを使うときに、ドローコールを減らす目的でMaterialは、なるべく複数セットせずに、一つにしておく方が良いです。

#5. ポリゴンを分ける
上記の設定で、1つまたは、複数のMeshのMateiralを一つで設定しました。このように設定しておくと、後から、モデルの部品ごとに質感を変えることが大変になります。具体的には、SubstancePainterでPolygon一つずつを塗りつぶして質感を設定する必要があります。あとで面倒な作業を行わないためにも、質感が異なる部品と他の部分とポリゴンで切り離しておきます。同じメッシュではあるが、地続きに繋がっていない状態にしておくことで、この後の作業を簡単に行えます。
ポリゴンの分離については、以下の記事を参考にしてください。
[【Blender】辺の分離(切り分け)と切り裂き方法](https://blender-cg.net/edge-split-rip/)

#6. Vertex paintでID Mapを制作する
ポリゴンを分けるやり方の他に、VertixPaintを用いて同じマテリアル、同じMesh内で部品ごとに質感を分けることもできます。現実の世界では、異なる物質同士は、境目があることが多いですが、3Dモデルで表現するときには、Vertix Paintを用いる方が良い時もあります。VertixPaintを用いて質感を分ける方法は、以下の記事を参考にしてみてください。
[【IDマップ】質感ごとにマスクを作る【Substance Painter 頂点ペイント】](https://bookyakuno.com/substancepainter-id-map/)

#7. High Polyモデルを制作する
ここまでの設定が終わったら、モデルのディテールを作り込んでいきます。low polyモデルで表現できなかった表面の微妙な凹凸、窪み、面取り、表面を滑らかにするための細分化などをここで行います。一旦low polyのモデルはコピーして、コピーしたものをベースに詳細を作り込む方がいつでも元のモデルに戻れるので安全だと思います。
ベベルについては、以前の記事を参考にしてください!
[なぜベベルするのか? ](https://qiita.com/tring/items/e40a7d824d778ceb1b2b)

この段階では、BevelもSubdivisionもModifierとして設定し、まだ適応しない方が良いと思います。
以下では、初めのlow polyモデルにさらに詳細を加えたモデルを元の画像と比較して載せておきました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/27732921-8bed-cbf6-5e3f-c27ea84a069f.png"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/2a73f997-3bf6-0d10-814d-bc2c005e10c0.png">

#8. ScaleとRotationの初期化
ScaleとRotationの初期化は、ここで初めてすることは少ないと思います。ベベルや他のModifierを利用する際に、初期化していると思いますが、念のためここでも確認しておきます。ScaleとRotationの初期化はモデルを選択肢、Ctrl + Aで行えます。
#9. Meshを正常化する
Meshの頂点、辺、面が二重になっているということが、ゲームエンジンやSubstancePainterでのBakeを邪魔する原因となることがあります。UV展開する前に、以下のチェックを行うと良いと思います。上部のタブから、Mesh>Clean Up>Merge By Distanceを選択し、実行します。この他にも、Faceがダブっているところは、ダブりを解消しておくようにすると良いです。

![スクリーンショット 2020-12-29 20.11.37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/ceb5646e-069d-a191-d7a6-c381fba64460.jpeg)


#10. UVを展開する
UV展開をすときには、注意する点はいくつかありますが、特に次のことに注意して展開しておくようにしています。
①複数のMeshをなるべく一緒にUV展開する
②UV展開したときになるべく隙間がなく、重なりがないようにする。
③同じ部品に関しては、なるべく同じUVを再利用する
④Hard Edge部分は切り離して展開する。

①の複数Meshを同じUVとして開く方法は簡単で、同じUVに含めたいモデルを選択し、editモードに入り、普段通りUV展開すれば良いだけです。
![スクリーンショット 2020-12-29 18.39.57.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/b127841d-d717-458e-52bd-87581472f540.jpeg)

②のUVをつめて配置するメリットは、一枚の限りある画質のTextureを効率的に利用できることです。もし、4KのTextureを使っていても、UV Mapに隙間がたくさんあると、実質支え得ているサイズは、2Kになってしまっているなんてことが起きてしまうからです。(せっかく4KのTextureを使っているのに、2K分の画像しか使っていないと、残りの2K部分が無駄にメモリーを圧迫することになるので、ゲームエンジンなどで利用する観点で非効率です)このUVの配置を手動でやると大変なので、ここは、Add-Onに頼っています。僕自身よく、[UVPackmaster 2](https://gumroad.com/l/uvpackmaster2)を使っています。このAdd-Onを使うことで以下のように最適化ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/d348a8b0-f1e1-aedf-0847-259587347177.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/8f81038f-9f25-5716-f275-61b3ad423bb3.png)

③全く同じ部品の複製がいくつかある場合や、繰り返しの部分がある場合は、全てをUV展開せず同じものは一度だけUV展開すると(Array Modifierなどを適応せずそのままUVを展開する)効率的にUV Mapが利用できます。ただし、同じ部品に同じUVをアサインしていると重複感が出てしまうので使い所を選んで利用すると良いと思います。

④最後に、UV展開の切れ目についてです。以下の画像を用いて、Hard Edgeになぜ切れ目を入れておいた方が良いか説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/4915543b-b3a5-f702-d3a8-d6b55f8ef8cf.png)

これは、SubstancePainterでBakeを行った時のモデルのMaterialの見た目です。上記の画像で中央部分にあるEdgeは、綺麗に表現されていますが、その右側のEdgeは、糸で縫われたような模様が現れノイジーです。Hard Edge部分ではときに気にせずUVを開くと、このようなノイズが現れてしまいます。以下では、実際のUVMapがどうのようになっているかを可視化して表てみました。
赤く塗った部分は、UVの島が連続的になっているのに対して、青く塗った部分は、UVの島が半分に切れていて、連続に繋がっていません。先ほど確認したように青い線の方は、ノイズが現れていなかったので、Hard Edgeはこのように切り離して展開しておくのが良いです。切り離しに関しては、以下のZen UVというAdd-Onが便利です。
[Zen UV](https://gumroad.com/l/ZenUV)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/e337aa77-a580-baae-8e32-be68c92a6aa5.png)

実際のUV展開のFlowは以下の動画が参考になります。
https://www.youtube.com/watch?v=BhKQiuzQipg
https://www.youtube.com/watch?v=SChr2ThZ9C4


#11. Bake
ここまでで、BlenderからSubstanceへExportする準備が整いました。SPでは、具体的にどのようなことをするかをここで詳しく説明するのは趣旨から外れるので、他の記事に譲ることにして、簡単に注意点をまとめていきます。

[Substance Painterのチュートリアルでお勉強その５前編　テクスチャのベイク(焼きこみ)](https://www.hildsoft.com/entry/2017/02/03/030258)
[Substance Painterのチュートリアルでお勉強その５後編　テクスチャのベイク(焼きこみ)](https://www.hildsoft.com/entry/2017/02/06/230000)

上記を参考に、LowPolyモデルに、HighPoluモデルをベイクしたものを以下に載せておきます。NormalMapを作成することで、ポリゴン数を押さえながら、見た目に違和感のないモデルを作れます。bakeの際に、Max Frontal DistanceとMax Rear Distanceの値で迷うことが多いですが、**Max Frontal DistanceはMesh同士が近い距離にあり鑑賞しやすそうであれば、0.001~くらいから下げる、Max Rear DistanceはLow polyモデルからの凹みが大きいのであれば大きくすると覚えておくと良いと思います。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/b920b9a3-e25c-2693-b1e4-05d60c6134ab.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/ec2af08f-76cc-a648-c833-494976fb84df.png)

きちんとbakeができたら、以下の動画などのやり方にしたがって、質感ごとにPolygon FillでMaskを制作することができます。そのあと、実際の質感を設定すると、以下の画像のようになります。

https://www.youtube.com/watch?v=oYLY9lPr59o

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206272/51dd47ae-7d33-1312-95ac-eb56c8192804.png)

#12. Combineする
最後に、制作したモデルが複数のMeshからなる場合は、UVが共通なものは、Combineしておくとゲームエンジンでの調整や配置が楽になります。ただし、ゲームエンジンで動かしたいパーツに関しては予め別Meshとして作っておいた方が良いです。

#最後に
ここでのフローは僕がよくやっていることであり、間違いや効率的でない部分があると思います。何かあれば是非、コメントいただけると嬉しいです。