How to duplicate vertex weight
3DキャラクターをBlenderにインポートし、ボーンを削除したらそのボーンに割り当てられていた肌(スキニングされていたメッシュ)が動かなくなり、関節を曲げると肌が餅のように伸びてしまいました。ボーンを消す前に頂点ウェイト(ボーンと肌の関連度)を親ボーンにコピーしたら解決したのでその方法をまとめました。
環境
- Windows 10
- Blender 2.77
ボーンを削除すると起きる問題
株式会社サファイアートがUnityアセットとして公開している「サファイアートちゃん」を例に挙げます。UnityアセットのFBXファイルとテクスチャ画像ファイルをコピーしてBlenderにインポートしました。
サファイアートちゃんは両腕に手首を捻らせるための ForearmTwist ボーンがあります。
これらの捻りボーンを削除して腕を動かすと下の画像のように手首が伸びてしまいます。
サファイアートちゃんの腕の各頂点は複数の頂点グループを共有し、どの頂点グループの影響をどれくらい受けるかという「頂点ウェイト」が設定されています。
頂点ウェイトに影響を与えるボーンを削除したため、動かなくなってしまったわけです。
Modifierで頂点ウェイトを親ボーンにコピーする方法
ボーンを削除する前に削除したいボーンの頂点ウェイトを親ボーンにコピーすれば解決します。しかし頂点ウェイトは無数の頂点ごとに0.0から1.0までの数値を指定するため、手作業でコピーするのは現実的ではありません。
頂点ウェイトをコピーするには Modifier を使うと簡単です。
Modifierの設定方法は次の通りです。
(ドロップダウンメニュー) | VertesWeightMix |
Vertex Group A: | 削除したいボーンの親ボーン (の頂点グループ) |
Vertex Group B: | 削除したいボーン (の頂点グループ) |
Mix Mode: | Add |
Mix Set: | VGroup B |
Modifier で VertesWeightMix を設定するときはWeight Paint画面にしてボーン名を表示すると変化がわかりやすくなります。
Modifierが正しく設定できたらApplyボタンをクリックし、ボーンを削除します。
下の画像は左手首のみ捻りボーン (ForearmTwist_L) の頂点グループを親ボーンにコピーしてから左右の手首捻りボーンを削除した結果です。
ModifierをPythonスクリプトで実行する方法
ModifierはPythonスクリプトでも実行できます。下のスクリプトの日本語で書いた部分を個別に修正すればコピー・ペーストで実行できるサンプルです。
どんなときに役立つか
UnityアセットやMMDモデルなど、ボーンの数や構成はそれぞれ異なりますです。多くの人型モデルの指は3本のボーンで構成されることが多いですが、下の画像のように4本の指で構成するモデル作者もいらっしゃいます。
マンガ・CG動画の作成ソフト CLIP STUDIO では3Dキャラクターの各指のボーンは3本と決められているため4本ボーンのキャラクターを登録した場合、手を握りしめるポーズが下の画像のようになります。
これでは手に見えません。
CLIP STUDIOの仕様に合せて各指のボーンを3本に減らす必要がありますが、前述の通りボーンを削除するだけでは肌が伸びてしまいます。
4本目のボーンの頂点グループを親ボーンにコピーしてから4本目のボーンを削除し、手を握りしめるポーズをとった結果が下の画像です。
期待通りの表現になりました。
モデルデータを他のアプリケーションに移植する際にボーンを削除する必要があるかもしれません。
そんなときに知っていると便利です。
関連ブログ
[Blender] ボーンを曲げてもメッシュが曲がらない原因と修正方法BlenderのモデルデータをMMDに変換する方法
Blenderで作ったアニメーションがUnity3Dで違う動きをする原因と直し方
[Blender] Pythonで複数の設定を一瞬で編集する方法
MakeHumanでCLIP STUDIO用3Dキャラクターを作る方法
Metasequoia EX の FBXファイルの互換性を試してみました
Shade3D の FBXファイルの互換性を試してみました
以上、参考になれば幸いです。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。