blenderでunity向け3dキャラ作成ワークフロー

[Blender Advent Calender](http://www.adventar.org/calendars/833) 2015 12月3日の記事です。

僕の考えるイケてるゲーム用3d character 作成ワークフローについて書きます。
ターゲットはunity ですが ue4とかでも工夫すればなんとかなると信じてます。
blender2.78aを使用しました。

#blender の基本設定
![0001.jpg](https://qiita-image-store.s3.amazonaws.com/0/75247/371a3d4a-e379-f88c-2be4-d59974bc288d.jpeg)

unity は default 60fpsなので合わせます。
もし他のfpsにしてるなら合わせてください。
昔24fpsで作ってましたが剣を振るみたいな早い動きに対応出来なかったです

#座標軸
blenderの伝統にしたがった-y向きでよいです。
むしろ他にするとbinary fbx出力でバグります。

なるべくゲームエンジンに合わせたほうがよいです。
blenderでキャラ作ると伝統的に -y向きになります
しかしunityなら　+yを向くように作った方がクリーンなデータになります。
preference でviewショートカット（numpad1,3,7）調整しておくと開発が楽
export 時の座標変換で対応してもいいですが、向きが不明瞭な建物作った時混乱しました。


#モデルデータ作成　
好きに作ると良いです
あんまりオブジェクト細かく分けすぎるとリギングの際ウェイト作業がつらくなります。
僕は髪、顔、目、体（服込み）　くらいにしてます
できるだけ裸モデルと服モデルはつながってることが望ましいです（特にTシャツみたいな肌にピッタリしそうなやつ
分けるとモーションつけた時にめり込みやすくなります。
ウェイトが正しく設定されれば問題ないはずですが、ウェイトの設定が死ぬほど大変です
にわかアーティストには無理です

クロスシミュを検討している場合はその部分だけ別オブジェクトにした方がパフォーマンス的に有利です

#マテリアル
1 object 複数material 
複数のobject で1つのmaterial を共有はやめたほうがいいと思います
uv展開する時不便なのと、substance painter に持って行った時正しく認識してくれません

モバイル向けで material を極力減らしたい drawcall 減らしたい、substance painter なんて使わないよ　というなら止めません
https://youtu.be/rbJbZU3B-Vo


#uv展開
昔はphotoshop で根性塗りするので uvを整えることに命かけてました(関連素材は近くにまとめるなど)
今はsubstance painter でパパーっと済ませちゃうので　あんまり気にしないです
uv squaresは積極的に使ってきます
http://blenderartists.org/forum/showthread.php?339991-Addon-UvSquares-UV-reshaper

#テクスチャリング
photoshop で塗る場合は根性です

substance painter の場合はなにかしらの方法で素材id みたいのを割り振る必要があります
http://blender.stackexchange.com/questions/28398/is-there-a-way-to-create-a-color-id-map-in-blender
この辺が参考になるのですがこれだとmaterialが無駄に増えてしまいます。
ゲーム用に出力する時は消したいのですが、OnPostprocessModelでやるくらいかなぁ


vertex color に素材id割り振るもの検討したのですが頂点がつながっているとグラデーションになって
substance painter で期待通りに塗り分けれません。
まだ悩んでます。

vertex colorで素材塗り分けが一番楽です。
Face Selection Masking For Painting チェックを有効にして塗るフェイスを選択してshift+kで塗ると早いです
あらかじめパレットを作っておけば後から塗り足すときに困らなくてすみます
![2016-09-04_22h58_13.png](https://qiita-image-store.s3.amazonaws.com/0/75247/d228b79e-1e96-07df-4fee-945d79592249.png)

#リグ
![0002.jpg](https://qiita-image-store.s3.amazonaws.com/0/75247/785b6cc8-80ed-f2f3-8bb0-7a724073c0fb.jpeg)

root
ctr_root
大きく2つに分けます
root以下はdeform boneや特殊用途のnull nodeなど、unityで使うboneで構成です。
ctr_root以下は好き勝手作ります、ik fk switch, dynamics なんでもかんでも。
unityのOnPostprocessModelで fbx import 時にctr_root 以下を削除して運用してます
blender で指定 bone group だけ export みたいな機能あればよかったんですが…（自作？　えー

def_系bone には copy transform constrain のみくっついてます、対象は対応する ctr_系bone です
キーフレームは全て ctr_root 以下のbone につけます
fbx export 時にdef_bone にモージョンの情報が焼き込まれるので unity でも正しく再生されます
	


#フェイシャルリグについて
難しいのでモーフにした方がいいです。
https://de45xmedrsdbp.cloudfront.net/Resources/files/Jeremy_Ernst_FastAndEfficietFacialRigging2-1007627780.pdf
昔 gears of war のこの記事に触発され組んだことありましたが
ウェイトで詰まります
ウェイトを破綻なくきれいにできるひとは優秀なアーティストです
にわかアーティストには無理です
https://www.youtube.com/watch?v=OuqYPJoBnT4
http://deskyg.com/?p=1314
先駆者はいますが大変です。
ゲーム用途ではdeform bone の数が増えすぎるのもネックです。

モーフすら使わない昔ながらのテクスチャ切り替えもアリです。
デフォルメチックなアニメ顔なら一番手軽にかわいくできます。
ただし視線制御が無理です

折衷案としてスクストっぽいフェイシャルがあります。
http://www.jp.square-enix.com/info/images/image_technical_seminar2014_06/pdf/SQEX_DevCon_sugimoto.pdf
unityで専用のシェーダー書く必要ありますが視線制御可能なのでなかなかよいです。


#ウェイトについて

auto bone weight で一発、これでうまくいかない場合は地獄のウェイト調整に突入します
そしておそらくエンドレスです

blenderのwith automatic weightsは頂点がつながっていないとうまくウェイトがのってくれません
スカート、フリルとかでmerge されてないのは当たり前のようにあります
悲しいです
![0003.jpg](https://qiita-image-store.s3.amazonaws.com/0/75247/7a05ef38-b428-e9bd-610c-83405ab7480b.jpeg)
なのでwith automatic weights向けの頂点繋がってるオブジェクト作ってやります（髪の毛の細いパーツもしっかり連結
頂点の重複も除きます。
failed to find solution for one or more bones　メッシュデータに問題（頂点重複、異常につながってない頂点）があるとこのエラー
http://blender.stackexchange.com/questions/15964/heat-weighting-failed-to-find-solution-for-one-or-more-bones

そしてそのウェイトデータをtransfer weightsで転写します
https://wiki.blender.org/index.php/Doc:JA/2.6/Manual/Modeling/Meshes/Vertex_Groups/Weight_Paint_Tools#Transfer_Weights
するとウェイトがきれいになります
![2016-09-04_20h22_12.png](https://qiita-image-store.s3.amazonaws.com/0/75247/d792bcf6-1571-293f-aa0a-44482fe36466.png)


長髪のキャラの場合、髪のボーンのウェイトがあらぬところに影響することがあります
そのためwith automatic weightsする時、髪boneのdeform設定オフにしておくとウェイト修正の手間はぶけます（bone groupのdeformオンオフスクリプト書くと楽です

bone selection sets addonで髪ボーンを選択して
weightsPaint のweights メニューからAssign Automatic From Bonesがよいかも
https://wiki.blender.org/index.php/Dev:JA/Ref/Release_Notes/2.76/Animation

#exportについて
モデル+スケルトン.fbx
スケルトン+アニメーション.fbx 多数

アニメーションデータとモデルデータは分けます
全action を一つのfbx につっこむのは楽ですがダメです
モーションの数が増えると出力に時間がかかるようになります。30秒？1分？　どんどん増えていきますよ？　
1個のaction修正したら全データ更新はさすがに悪です（本当に全データ更新したい場合はスクリプト書いて対応するべき
まずはモデル+スケルトン.fbx
![2017-01-01_14h43_16.png](https://qiita-image-store.s3.amazonaws.com/0/75247/1b5fad06-75f7-c2bf-1a7c-4d5e0997893a.png)



次にスケルトン+アニメーション.fbx　ですが少し裏ワザ出力です
![0004.jpg](https://qiita-image-store.s3.amazonaws.com/0/75247/e41ba87d-4efe-499f-c04d-6f3190986d34.jpeg)
pose modeもしくはobj modeでarmature選択した状態でaction editorで出力したいactionを選択。
その状態でfbx export
![2017-01-01_14h43_38.png](https://qiita-image-store.s3.amazonaws.com/0/75247/7d5b59dc-88ea-846e-2b09-d709c93dcf66.png)


![0008.jpg](https://qiita-image-store.s3.amazonaws.com/0/75247/1426fc9e-aa58-384f-1757-24f1650c22a7.jpeg)
こんな感じになります。
ゲーム用リソースは自動バックアップを兼ねてdropbox管理下のフォルダに置いてます（いちいちsvnコミットダルいですし

mecanimで使うならこのままunityのassets以下にコピーします。
legacy運用してた時はanimationClipを抽出する専用unity project を作りスクリプトでいい感じに処理してました。

コピー処理はrubyスクリプト使ってます。
昔はbatやpowershellでしたが使い勝手が悪かったのでやめました。

#binary fbxについて
blender2.78aで検証したところ実用的になってます。
オブジェクトアニメーションが使えるのが最大のメリットです。
ワークフロー今考えてます

#あとがき
効率よく高品質なキャラを作るワークフロー追い求めてます。
まだ道半ばです。


次(12月4日)は  かがやす(@kagayasusi)さん、よろしくです。