リアルタイム系の3DCG制作に関するノウハウや実践的なTipsを共有するWiki形式のWEBサイトです。


スキニングした後のモデルにエッジを足したり編集して「ヒストリが残ってる」と怒られたことは無いでしょうか。
メッシュを編集したらウェイトは付け直しだと思っている人もいます。
この問題、Softimageなど非破壊のツールでは気にしなくて良かったんですが、MAYAでは避けて通れない問題だと思います。
公式のコラムではウェイトマップテクスチャという現場では残念ながら見たことのない方法を使っていて釈然としません……。
そこで今回はこの問題の解決方法を解説します。

kmj的手順

ってことで一例として私kmjのやり方を説明します。
現場でもこの方法か、この手順を内包したスクリプトを使ってる方が多い印象です。
(こういう方法でやってますというのがあれば是非教えてください!)

頂点単位でのウェイトコピーについてはこちら

要約

先に手順について要約すると、
  1. ウェイトの付いたモデルをDuplicate
  2. 複製した新しいモデルをsmoothBind
  3. 古いモデルから新しいモデルにCopySkinWeights
となります。
もうやってる、という方やノンデフォーマーヒストリーの削除で良いという方は以下飛ばして大丈夫です。
良かったらスクリプト化したものでも見てやってくださいませ。
スキンオブジェクトを複製してウェイトコピー
問題点
この方法ではブレンドシェイプやラティス等のデフォーマーも全て消えてしまいます。
これらを残したい場合はEdit->Delete by Type->Non-Deformer Historyに思いを託すしかありません。

説明

試しに作った腕のモデルにウェイトを入れ、編集、コピーしてみたいと思います。

ウェイトを付ける

少し脇道に逸れますがウェイト付けの手順もおさらいしておきます。
メッシュのヒストリを消す
メッシュを選択し
Edit->Delete by Type->Historyでメッシュのヒストリを消します。
バインド
メッシュ、ジョイントの順に選択してSkin->Bind skinのオプションを開きます。
下図のように設定してBind Skin

オプションの細かい説明はヘルプを参照していただくとして、
ゲームグラフィックにおいては下記の注意が必要です。
  • インフルエンスにはジョイントを使う
    • メッシュやロケーターを骨としてバインドすることも可能ですが機能が制限される事が多いのでおすすめしません。
  • Skinning MethodはClassic Linearを選択
    • DualQuaternion等は綺麗に変形してくれますがエンジン側でサポートされていないと意味がありません。
  • Normalize WeightsをInteractive
    • ウェイトの合計は1.0である必要があります。作業段階ではOFFにしても構いませんが原則として出力時には正規化する必要があります。
  • Max Influences
    • だいたいどのようなプロジェクトでも2〜4くらいが多いです。ゲームグラフィックではプロジェクトによって仕様が決まっているかと思います。
ウェイト編集
デフォルトのウェイトでも構いませんが、ゲームグラフィックではウェイトを入れない骨が存在したり、複数インフルエンスに分散したウェイトを減らしたかったりするので手入力することも多いです。
その場合、下記のツールを使用します。
  • Paint Skin Weights Tool
  • Component Editor
  • Weight Editor(Bonus Tool内)
  • その他MEL、内製ツール

基本的な手順としては、
  1. 全身のウェイトを根本(親)に100%付ける。
  2. ひとつ下の階層のジョイントにウェイトを付ける
  3. そのまたひとつ下の〜〜
という感じで末端までウェイトを付けます。
こうすることで余計な所に分散するウェイトが無くなり、変形も一箇所ずつ確認しながらウェイトを付けることが可能です。
ポイントは、腕の階層でもまずは腰にウェイト100%付けておく、ということです。
ちょっとこの辺はオールドスクールな手法かもしれません。
ハイポリのキャラだったりするとウェイト付け用の簡易モデルを用意してウェイトコピーしたりもしますが、簡易モデルに付けるウェイトは上記の様な手順になるかと思います。

今回はシンプルなのでPaintSkinの塗りつぶし機能を使いました。

頂点を選んでFlood、頂点を選び直してFloodという感じです。
Shift+<(選択領域の縮小)と組み合わせると選択し直さなくてよいので楽です。


前腕のウェイトが入りました。

メッシュの編集からウェイトコピー

メッシュ編集
今回は、肘の分割を変更するという体でやってみます。

分割を足しつつ、肘の内側のエッジを減らしました。

で、Mayaの場合この状態では追加された頂点にウェイトが付けられません。
いやそれどころか既存の頂点もウェイトを変更しようものならトンチンカンな場所のウェイトを変えてしまうことになります。
これは頂点順を基準にウェイトが振られているからかと思われます。
メッシュ複製
ヒストリの残ったメッシュは複製してウェイトをコピーしましょう。
まず、Skin->Go to Bind Poseでバインドポーズに戻します(重要)

メッシュを選択してEdit->Duplicate
複製ですね。
これで新しいメッシュの方はヒストリが整理されます。
ただウェイトも消えます。これが厄介なんですね。
メッシュ編集もウェイト情報もヒストリなんです。
Edit->Delete by Type->Non-Deformer Historyでウェイトを保ったままヒストリを整理することができます。
が、正直ウェイトの保持がイマイチです!
今回のようなシンプルなウェイトなら上手く行くかもしれません。
バインド
複製されたメッシュの方にはウェイトが付いていないためバインドします。
バインド方法は前述と同じです。
この時点ではデフォルトのウェイト値が入っているため元のメッシュからウェイトをコピーしてやる必要があります。
ウェイトコピー
  1. 元のメッシュを選択
    • 位置が同じで選択しづらいはずなのでOutlinerで選択すると確実です。
  1. 新しいメッシュを選択
    • Ctrlキーを押しながらOutlinerで追加選択
  1. Skin->Copy Skin Weightsのオプション
  • 頂点順が違うためSurface AssociationはCloset point on surface(サーフェス上の最近接ポイント)を選びます。
  • 同じ骨構造のためInfluence Association 1はOne to one(1対1)
    • 一般的なCloset jointの場合同じ位置にあるジョイントに対して上手くウェイトコピーが行なえません。ゲームの仕様では同じ位置に骨を置くことが結構あります。

厳密にはこのウェイトコピー機能は小数点以下の細かいウェイトが入っていると誤差が出ます。
細かいウェイトを嫌う仕様の場合は別途ウェイト丸めの処理を行う必要があります。
またスケールによっては頂点が近すぎたりするとコピーが上手くいかない頂点があります。
新しいメッシュのウェイトを編集
ウェイトコピーは行いましたが、追加された頂点には未調整のウェイトが入っているはずです。
ヒストリが整理されたことで新しい頂点もウェイト編集が可能になっていますのでこの段階で調整します。

最後に古い方のメッシュを削除すれば終了です。

まとめ

ウェイトの付いたモデルを編集したら
複製してコピースキンウェイト
でヒストリを整理できる
ということでした。

スクリプトあります

この手順、ヒストリが残るたびにやらないといけないので面倒です。
手順は分かったから面倒なのなんとかせいという方は下のスクリプトを使ってみてください。
スキンオブジェクトを複製してウェイトコピー

頂点単位でのウェイトコピー

ちなみに任意の頂点のウェイト値を他の頂点にコピーしたい時はこちらを使います。
Skin->Copy Vertex Weights, Paste Vertex Weights

ホットキーは
コピーCtrl+Alt+C
ペーストCtrl+Alt+V
シンメトリー等で2頂点以上選択しているとコピーできないのでご注意を。

ペイントスキンウェイトツール内の下図のアイコンでもコピペできます。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

※現在 ユーザーID保持者 のみがコメント投稿可能な設定になっています。

Wiki内検索

メニュー

Maya

管理人


管理者:kmj
Twitter:@kmj3dcg
ゲームグラフィックに携わり十数年、現在フリーランスのモデラーとして活動しています。
専門分野:モデリング、テクスチャ、ウェイト(キャラモデルがメインのゲームグラフィッカーです)
お問い合わせはこちらまでお願いいたします。

Amazonアソシエイト

皆様のご協力感謝しておりますm(_ _)m























管理人/副管理人のみ編集できます