この記事はUnity 2 Advent Calendar 2016 その2 の13日目の記事になります。
12日目は、fumishitanさんの「帰れま10というUnityワークショップでの出題内容とその出題意図について - Qiita」でした。
■はじめに
先月末にSDユニティちゃんモデルを改造して、サンタ服を公開しました。
http://mi-zmix.hatenablog.com/entry/2016/11/26/200446
その作業のなかで、Unityにインポートした時ミスしておかしくなってしまった様子と、どのように解決したかを書いてみます。
おかしくなった原因はDCCツールで作成したデータのせいです。Unityはまったくわるくありません。
■概要
1、モデルが異型の何かになってしまった。
2、口の周りに何かついている。
3、お顔がはずれた。
この3つの異常について書きます。
■1、モデルが異型の何かになってしまった
はい。
かろうじてユニティちゃんのような形をしてます。実行するとアニメーションは動きます。怖いです。
骨の形は無事なので、ゆれ物用の設定はそのまま生きています。
モデルを初インポートした時ではなく、一度インポートしてプレハブ化してあるモデルのファイルを、エクスプローラー上で上書き更新した後に、こうなりました。ゆれ物設定を最初からやりなおすのはいやだったので、上書きで更新してたのですが、こんな状態になってしまいまして。
原因は、モデルのスケールがおかしくなっていたからです。
スケールファクターや、インスペクター上の値ではなく、DCCツール上のモデルのスケールです。
インスペークターで見ると正常ですが、実はこれスケールがものすごく小さくて、100分の1になってます。
プレハブではなくモデルをシーンに表示すると何も出てこない状態で、データが壊れていると思い込んでしまったのですが、実は小さく表示されていました。
●リグ設定で正常に見えるけど
メカニムのRig > config の設定で、強制的にリセットし、Enforce T-poseすると正常に見えてしまうのですが、これはこれでおかしい状態をさらにおかしくしてるので、やってはいけません。
●DCCツールでの確認ミス
一番最初にインポートしたモデルはスケールに問題がなかったので、そのままスムーズに設定できました。なぜ、スケールが変わるような問題が出てしまったかというと、モデルを修正したとき、MayaLTから別のDCCツールのMODOに持っていって修正作業をしたためです。
UVの修正をしたかったのですが、MayaLTよりはMODOの方がやりやすいので、そちらを使ったのです。
MODOがわるいわけではなく、スケールの単位の統一をしていなかった自分のミスです。
このへんは、ほんとに注意しないとだめですね。
MODOのFBXまわりは10.2なら、問題が少なくけっこう安定しています。
MODOで開くと下図のような感じです。
ジョイントの構造など、ちゃんと読み込めています。見た目はビューアのセッティング次第ですが。
MayaLTからFBXで書き出してmodoに読み込み、修正作業後にFBXで書き出して、MayaLTに戻しました。ここでスケールがおかしくなっていました。
MayaLTは2017、MODOは10.2v1を使いました。
ルートのロケーターをよく見れば、スケールが100倍になってます……これに気づきませんでした。表示しておけば、異様な大きさに気づくと思うのですが、普段非表示にしてるので見落としてました。
ロケーターやNURBUSカーブなど、オブジェクトは邪魔でも一度は全表示状態にして確認しておくようにした方がいいですね……
100倍になっていたのを、フリーズすれば1になるよね? ということでやってみましたが、そう簡単にはできません。
スキニングの設定など全部外さないと無理で、その状態にしてしまったら、完全にやりなおしにはならないにしても、かなりの修正が発生しそうなので断念しました。
こんなエラーが出ます。
もちろん、スケールのフリーズをせずに、強引に「1」に設定するのもだめです。
こんなんなります。
●解決
とりあえずスケール以外は正常なので、FBXの書き出し時に単位を変えることで解決しました。
FBXのエキスポートで「高度な設定」を開きます。「単位」の項目を探し設定します。
デフォルトでは、自動にチェックが入っているので、それを外し、
変換先のファイル単位:を、メートルにします。自動的にスケール係数が0,01になりました。スケール係数を0.01にしたいので、それに該当する単位を探したといったほうがいいかも。
根本的には解決になっていませんが、Unity上でスケールファクターが1、それぞれのメッシュのスケールが1になれば、大丈夫なのです。(たぶん)
スケールファクターが1になりましたが、File Scaleも1になってます。
元のSDユニティちゃんは、FileScaleが0.01なのです。これが原因で不具合がでないといいのですが……
■2、口のまわりに何かついている
スケールが正常になって、だいたい無事に表示されたユニティちゃんですが、
口の周りがなにかおかしい。
たらこ(´・ω・`)?
口の周りにシェーダのアウトラインがはみでてるのかな? と思いましたが特にそんなこともなく、よく見るとテクスチャのような感じ。
口のUVがずれたか? と思い、確認してみましたが、UVは特に問題なし。
これは嫌な予感がします。
ゆうこちゃんにいたっては、変な吹き出しのようになってるし……わざわざこんなUV展開しません。
頂点の並び順がずれてるときに見られる感じに似ている気もします。
メッシュがおかしいなら、Importの設定の、Optimaize Meshのチェックを外してみるかと思って試しましたが、変化ありませんでした。
●モデルのインポートの設定で法線を変える
もうわからないので、インポートまわりでさわれるところは片っ端からさわって確かめてみました。
そんな中ようやく変化が見られる設定がありました。
インポート設定の、法線と接線のところです。
Normalsの設定を、Importではなく、Calculateにします。
変な線は消えました。
けど、何かおかしい見え方をしています。法線の方向が口のまわりだけ変わっているようです。
ちょっとだけ光のアタリ方がおかしい感じです。3人共おなじでした。
●解決
法線ならば、MayaLTで調整です。
MayaLT上での見た目は問題なさそうに見えるのですが、とりあえず法線の「ロックを解除」し、いったん「フェイスに設定」してから、「法線角度の設定」から再設定します。
フェイスに設定でいったんフラットシェーディングにするのは、自分がよくやる手順で、一度スッキリリセットさせておく方がよいと思っているだけのおまじないみたいなものです。このひと手間は必要ないかもしれません。やっておかないと、なんかスッキリしないという気持ちの問題です。
角度が89度なのは、90度に満たない値にしておくことで、90度以上の角度が確実にハードエッジになるためです。
「デフォーマー以外のヒストリの削除」も忘れないようにします。
SDユニティちゃんは、特に特殊な法線の設定がされているようには見えなかったので、素直にリセットするような形で設定してみました。勘違いだったらすいません。
ねんのため、ブレンドシェイプ用のメッシュも確認してみます。
法線が崩れていますね。
コレが原因だったのだろうか?
これも、法線を再設定して正常にしておきます。こちらは、頂点の位置が正常になれば良いので、「法線のロックの解除」のみ実行しておきます。
修正が終わったら、ブレンドシェイプ用のメッシュは全部非表示にしておきます。
法線を修正し終わって、あらためてエキスポートしてみます。
上書き更新してUnityで見てみると、線とおかしな光が消えました。
Unity側のFBXインポートの法線設定は、Importに戻しておきます。
テクスチャに影響が出ていた部分が、法線の修正で正常になるのはなんだか不思議なのですが、根本的原因は不明です。すいません。
■3、お顔がはずれた
変な線がきえたので、あらためて実行してチェックしてみたところ……
これは、表情を変えていたり、まばたきのときにおかしくなるので、ブレンドシェイプ用のメッシュがおかしいのでしょう。たぶん、フェイスの法線を変更したので、ブレンドシェイプの設定が更新されてしまったのだろうと思います。(推測)
一度、ブレンドシェイプ名が変わってしまい、名前を修正するという変更もしていたので、その時に変わった可能性もあります。
●解決
ブレンドシェイプ用のメッシュは100分の1の状態のままだったので、100倍に設定しておきます。
ルートの階層とは別にあるメッシュなので、スケールのフリーズはせずそのままにします。書き出し時に0.01倍されるはずなので。
MayaLT上のシーンでは、下図の位置にあるのが正しいです。
メッシュを非表示にして、書き出し直します。
表情も無事に動きました。
めでたし。
■おわりに
モデルのスケールは、最初に仕様をきっちりきめて、絶対に守り抜かないとなりません。
ほんとに気をつけましょう、オレ。
これらは、最初のスケールの異常から、連鎖的に発生した問題という感じでした。
複数のツール上の単位系をできるだけ合わせて、FBXのエキスポート時にスケールの設定を統一するってのを徹底しましょう、オレ。
以上、「サンタこはくちゃんズでの失敗の記録」でした。
明日は、sei ozwさんです。