背景
- Maya で(特に)キャラクターモデルがある. UV 付き. skinning あり. render 時は subdivision されるようになっている.
- subdivide された状態の形状で, skin weight 付きで, データをエクスポートしたい.
- Maya で, メッシュに smooth(subdivision) をかけてからデータを export(glTF など)すると, subdivide された頂点にはスキンウェイトがついていない
- Skin weight を visualize しても, subdiv された頂点には weight がついていない. Maya 上では, skinning したあとに subdiv しているので, 動いているように見える(subdiv してから skinning すると, うまくいかない)
- Smooth proxy だと, subdivide されたメッシュ頂点と, skin weight が取得できるが, どうも subdivide される形状が render 時 subdivision と合わないっぽい
skinned mesh に対して, mesh smooth(subdivision) をかけて, skin weight visualize すると, こんな感じになってしまいます.
Maya の機能で行う方法
処理としては, skin weight の値を, subdivide mesh にうまく補間できればよいことになります.
- shape をコピー(必要に応じて, copy special)
- Mesh smooth(subdivide)
- (optional) subdivide されたメッシュの freeze. 基本不要のはずですが, うまくいかなければ freeze お試しください.
- src shape の skeleton(joints) を選択し, subdivide された mesh に skinCluster で bind
- Skin weight copy(UV 空間で行う)
- 通常, このようなことをやりたい状況では, UV 座標がついているはずだとは思います. ついてなければまずは UV 座標をアサインするとよいでしょう.
joints 選択は,
Skinning: Select Joints Assigned to a SkinCluster
https://kleinhei.nz/2019/03/skinning-select-joints-assigned-to-a-skincluster/
でいけます. ありがとうございます.
$sel = `ls -sl`;
select -r `skinCluster -q -inf (findRelatedSkinCluster($sel[size($sel)-1]))`;
Skin weight copy の設定はこんな感じです.
Influence Association は Name にしましたが, ほかでもいいかもしれません.
これでうまくいくはずです!
(手前が subdivided mesh)
あとから分割(?)
Copy skin weight は, ヒストリには対応していないようです. subdivision level をあとで変更するとおかしな結果になります.
subdivision before skinning
今回の skin weight コピー以外にも, subdivide(polySmooth) してから skinning というノード構成にしたいときがあります.
Maya の Hypershade や Node editor で入れ替えはやりやすいかな? .ma
を吐いて, テキストエディタでつなぎ順を変えたほうが手っ取り早いかもしれません.
元メッシュに反映させたい
元メッシュに blendshape が設定されているなどで, duplicate したメッシュでシーンを差し替えるのが難しいときもあります.
その場合は, 元メッシュも subdivide し, 一旦 skin bind を外してから, 複製して subdivide されたメッシュから skin weight copy すればうまくいくかもしれません. ただ, この場合は元メッシュが subdivide されて重くなりますので, シーンエクスポート用のみとして利用しましょう.
推奨される方法
skin weight 自体は, 頂点のスカラーデータなので, エクスポータや, Maya python や, 自前形状処理ツールで opensubdiv など使ってでうまく weight を補間するのが理想です.
Maya skinning 情報の import/export メモ
https://qiita.com/syoyo/items/32a65647dea165e47b9f
リアルタイムレンダリングの場合は, tessellation shader で分割(skinning 処理したあとにメッシュ分割)ですが, Catmark 分割シェーダを移植するなどの必要があります.
ただ, どちらも開発の手間がかかるので(Maya python の場合は API 調べるのがめんどい), Maya の標準機能だけで完結するのであればそのほうがいいでしょう.
TODO, 問題点
- Skin weight copy, どうもいろいろ input connection がついていると Maya(最新 2020 でも) だと不安定っぽい?
- Skin map(テクスチャ)を読むという手もあるが, これも Maya だと不安定っぽくよく落ちる
- bindPose を考慮する