Mesh Bake の実装
Mesh Bake とは
この機能を Freeze と呼ぶこともあります
Unity にはその名もずばり BakeMesh という関数があります。
SkinnedMeshRenderer-BakeMesh - Unity スクリプトリファレンス
SkinnedMesh で bone を動かしてからこの関数を呼ぶと、その状態の mesh を得ることができます。
blendShape の変更も Bake されます
mesh に入っている blendshape は変更されません
Bake と Mesh.bindposes
bake された Mesh を SkinnedMeshRenderer で動かすには、 bake した状態の bone から Mesh.bindposes を計算して置き換える必要があります。 以下のコードでできます。
SkinnedMeshRenderer smr;
mesh.bindposes = smr.bones.Select(x => x.worldToLocalMatrix).ToArray();
ヒント
逆に言うとこの計算で得られる値と異なる bindposes には、 なんからの mesh 変形が含まれています。
- scaling, mirrorring … etc
- A スタンスの T スタンスへの補正
- Z-UP を Y-UP に回転
クリーンナップする効果があります。
例えば、mirror を表現する負のスケーリングをクリアする効果があります。
mesh が反転して格納されていて、bondpose でミラーリングする手法があった。
bindposes の変更
bone の world 位置を維持して回転と拡大縮小を変更してから bindposes を計算した場合でも、 Skinning が壊れることはありません。
bone の position が関節の回転原点
回転は自由に設定しても問題ありません
任意の流儀の rig に合わせられます。
スケールは 1 がお勧め
lossyScale と同じ問題があり、行列では表現できるが scale では表現できないなどのトラブルがあります。