メッシュ保存の内部動作
このページを読むと メッシュ保存(Bake)がどの順番で何をするのか、いつ頂点を整理し、いつ整理を飛ばすのか、頂点あたり 4 つを超えるボーン影響を持つメッシュがどう保持されるのかがわかります。
順番
- 表情キーの編集が開いている場合は、保存を止めて、先に編集を終えるよう案内します。
- 自動正規化をオフにして作業していた場合は、ウェイトを一度正規化します。
- Work Mesh のコピーを作ります。ライブのメッシュには触れません。
- コピーの上で使われていない頂点を整理します。
- データを検証します。NaN、Infinity、トポロジー、配列の長さを確認します。
- 出所の記録(provenance)から出力パスを決め、アセットを書き込みます。
- レンダラーを新しいアセットに切り替え、セッションを終わらせます。
大きなメッシュでは、進行状況のバーが表示されます。
使われていない頂点の整理
選択・移動 で X を押すと、トライアングルだけが削除され、頂点バッファーはそのまま残ります。編集中に頂点を並べ替えると、選択、マスク、元に戻すスナップショットのインデックスが、すべてずれてしまうためです。
そこで整理は、メッシュ保存 のときに、コピーに対して 1 回だけ行われます。どのサブメッシュのトライアングルからも使われていない頂点を取り除き、残りを番号付けし直します。
保持されるもの: 法線、接線、UV0~UV7、カラー、ボーンウェイト(可変の影響を含む)、bindpose、ブレンドシェイプの全フレーム。
整理は、ステージング用のコピーの上で全工程を行い、すべて成功したときにだけ対象へコピーされます。半分だけ書き換わったメッシュが残ることはありません。
整理を飛ばす場合
| 条件 | 結果 |
|---|---|
| 三角形ではないサブメッシュ(Quad、Line、Point)がある | 整理を飛ばします。ウィンドウには表示されず、診断スイッチ(EditorPrefs StudioRaming.EasyMeshEditor.Diag)をオンにしたときだけコンソールに残ります |
| 同じ名前のブレンドシェイプがある | ブレンドシェイプのチャンネルをそのまま移して整理します。そのように移せないときだけ飛ばし、その理由は診断ログにのみ残ります |
| 整理そのものが失敗する | メッシュは変えずに、その旨が通知されます |
整理を飛ばしても、メッシュ保存 は続行されます。頂点の数が減らないだけです。
法線
メッシュ保存 は、法線を勝手に計算し直しません。編集中に明示的に作られた法線だけが反映されます。
法線を再計算: 選択した頂点の法線を、面積重み付きのスムーズで計算し直します。法線を反転: 選択したフェイスの巻き順を反転します。ブレンドシェイプの法線・接線のデルタと、頂点の接線も一緒に反転します。- 表情キーを作成または編集すると、そのキーの法線デルタが面積重み付きで計算し直されます。キー編集の保存、新規キーの保存、
新規キーとして保存のいずれも同じです。
可変ボーンウェイト
メッシュは頂点あたり 4 つを超えるボーン影響を持てます。従来の BoneWeight API は 4 つまでしか扱えないため、それだけを使うと、塗っていない頂点も含めて、メッシュ全体が 4 スロットに切り詰められてしまいます。
そこで、セッションは 読み込み の時点で、元の可変ウェイトのデータを別に保持しておきます。
- ウェイトを塗ると、塗ったウェルドグループだけを 4 スロットに書き換えます。
- それ以外は、保持しておいた元のデータをそのまま使います。
- 保存するときに 2 つを合わせて、一度に書き出します。
その結果、腕 1 本にウェイトを塗っても、脚にある 5 つの影響を持つ頂点は、そのまま残ります。
元に戻すスナップショット、削除と分離、最後の同期もすべてこの経路を通ります。
選択・移動 で切り離した _Part パーツは、元のメッシュのボーン影響の数をそのまま引き継ぎ、4 スロットには縮めません。→ 現在の制限
名前の一致
Unity は、アセットファイル内のメインオブジェクトの名前がファイル名と異なると警告を出します。メッシュ保存 は、保存の直前にメッシュオブジェクトの名前をファイル名に合わせます。
失敗したとき
メッシュ保存 が失敗しても、セッションは閉じられません。 原因を直してから、もう一度試せます。
複数のメッシュをまとめて保存した場合、成功したものだけがアセットとして書き出されます。失敗したセッションは開いたままになり、もう一度試せます。結果は対象ごとの表に整理されます。→ ウィンドウの使い方
カラーバッファー
メッシュのカラーチャンネルが 8 ビット(UNorm8)でインポートされている場合は、float のカラーをそのまま書き込めません。スナップショット、整理、分離、セッションの同期はすべて同じ読み書きの経路を通り、元のメッシュのフォーマットに従います。