LoginSignup
18
10

More than 1 year has passed since last update.

Unityでカスタム法線メッシュにブレンドシェイプを適用した際に法線が崩れる問題の解決法

Last updated at Posted at 2020-11-15

はじめに

UTS2.0などのNPRシェーダを使ってキャラクターを可愛く見せようとした時、顔メッシュの法線編集は必須になってくると思います。
しかし、Blenderなどでカスタム法線メッシュを作成し、ブレンドシェイプを適用すると、デフォルトではカスタム法線とシェイプキー適用後の法線が競合し、最終的な法線が崩れてしまします。
これではいい感じの陰影が出るように法線を調整していても、ブレンドシェイプを使用して表情が変わった際に陰影がおかしくなってしまいます。

この記事で書くこと

  • カスタム法線メッシュにブレンドシェイプを適用した時に法線が崩れ、陰影がおかしくなる問題の解決法

この記事で書かないこと

  • 法線(Normal)に関する基礎知識
  • 法線編集そのもののやり方

環境

  • Windows 10
  • Unity 2018.4.20f1

結論

UnityへのFBXファイル読み込み時、Import SettingsBlend Shape NormalsNoneに設定してください。
これにより、ブレンドシェイプを適用した場合も法線が変化せず、設定したカスタム法線通りの陰影が出ます。
image.png
以下ツイートを参考にしています。
https://twitter.com/momonoki3000/status/1327679608490061824/photo/1

推奨されない方法

以下のようにLegacy Blend Shape Normalsにチェックを入れた場合も、上記画像の設定をした場合と同様にブレンドシェイプを適用した際にカスタム法線が崩れなくなります。
しかし、上記のツイートにもありますが、これは非推奨のようです。
image.png
公式マニュアルを確認したところ、記載そのものがありませんでした。
Legacyとありますが、ドキュメントに項目を記載する価値すらないということなのでしょうか…。

Blend Shape Normalsの動作確認

2020年11月時点でのVRChat公式バージョンであるUnity 2018.4のマニュアルによると、以下の記載があります。

ブレンドシェイプの法線を計算するかどうか、および法線の計算方法を定義します。 Normals プロパティーと同じ値を使用します。

なお、設定値は以下の3つで、マニュアルには説明が記載されていません…。
※分かりやすいようデフォルト値であるCalculateを一番上に記載しています。

  • Calculate (デフォルト値)
  • Import
  • None

これだけでは動作がわからないため、カスタム法線を適用した自作モデルを使用して動作検証をします。
その他設定はすべてデフォルト値を使用します。

Setting_PlaneFacial_Rotation.gif
ブレンドシェイプを適用していない状態では、FBXに設定したカスタム法線そのままの陰影が出ています。

Blend Shape Normals : Calculate (デフォルト値)

NoSetting_Facial_NoRotation.gif

動作の推測

名称から、ブレンドシェイプ適用後のメッシュ形状に合わせて法線を計算する…というパラメータと考えられます。
それがメッシュに設定されたカスタム法線と競合し、結果として法線が崩れてしまってるのではないでしょうか。

なお、このモデルでは全メッシュを結合しているため、ブレンドシェイプを使用した場合に顔を中心としてモデル全体の法線が崩れ、陰影もおかしくなってしまっています。

Blend Shape Normals : Import

Setting_BlendShapeImport_Facial.gif

動作の推測

Calculateでは崩れていた耳や腕リボンの陰影は変化しなくなりました。
しかし、カスタム法線を使用した顔の陰影は崩れたままになっています。
どのようなパラメータであるかは、結果からは判断できません…。

Blend Shape Normals : None

Setting_Facial_NoRotation.gif

動作の推測

ブレンドシェイプ適用後もカスタム法線の陰影がそのまま維持されています。
ブレンドシェイプの法線を使用しないというパラメータで、ブレンドシェイプの法線がカスタム法線と競合せず、陰影も崩れない…という動作と考えられます。

このため、カスタム法線をブレンドシェイプで崩さないよう、Noneを選択した方がいいでしょう。

Legacy Blend Shape Normals (おまけ)

余談ですが、この項目にチェックを入れると、動作としてはBlend Shape NormalsNoneを選択した場合と同様のものになります。
しかし、レガシーという文字、そしてマニュアルに記載がないという部分から、Unityとして非推奨の設定と考えられますので、基本的にこちらではなくBlend Shape Normalsを使用した方がよさそうです。

その他設定項目

今回詳細に動作検証はできなかったのですが、上記ツイートによるとBlend Shape Normals以下の設定の推奨値は以下のようになっているそうです。

設定項目 推奨値 設定値の説明
Normals Mode Unweighted 法線にウェイト設定はありません。
Smoothness Source None ハードエッジで頂点を分割しません。
Tangents None 頂点接線をインポートしません。メッシュに接線がないため、法線マップしたシェーダーとは使用できません。

自分が動作検証をした限り、Blend Shape NormalsNoneにした状態でこれらの設定を変化させた場合、モデルの見た目に変化を確認することはできませんでした。
しかし、「モデルデータの軽さ」という観点ではこの設定にしたほうがデータが軽い…というのはありそうですので、どの設定にしたらいいかわからない、という方はこちらの設定にするのがオススメだと思います。

最後に

自分はこれまで非推奨となっているLegacy Blend Shape Normalsを使用していたのですが、上記ツイートを見て検証した結果、公式マニュアルにも記載されないレガシー設定の危うさを知ることができました。
同様にLegacy Blend Shape Normalsを使用されている方への助けになれば幸いです。

もし間違いや不明点などがありましたら、ご指摘をお願いします。

参考情報

更新履歴

2021/12現在VRChatのUnityバージョンであるUnity 2019.4.31f1.においても本記事の対応に変更はない認識のため、記事を更新。

18
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
10