MMDの材質モーフ(着せ替え・色替え)の中身|ブラウザで表情を動かしても変わらない理由
表情の一覧に「Mスカート」「髪色R+」のような名前が並んでいるのに、動かしても何も起きない。これは材質モーフという種類の表情で、three.jsのMMDLoaderが計算を実装していないためです。
このサイトの再生と表情パネルは、2026-10-06から材質モーフの色・不透明度・輪郭線を当てています。 テクスチャ係数(色替えに使うもの)はまだ当てていません(下記)。
材質モーフは「材質の値を変える表情」
頂点モーフが形を変えるのに対して、材質モーフは材質の拡散色・不透明度・反射色・環境色・輪郭線の色と太さ・テクスチャ係数などを変えます。変え方は乗算(値へ掛ける)か加算(値へ足す)の2通りで、表情の重みに応じて効き方が変わります。対象の材質番号に -1 を書くと、全材質が対象になります。
実物のモデルでの数
| モデル | モーフ | 頂点 | 材質 | UV | グループ | ボーン |
|---|---|---|---|---|---|---|
| 人物A(ad_ik2) | 157 | 77 | 62 | 8 | 6 | 4 |
| 人物A(ad_org8) | 159 | 86 | 55 | 8 | 6 | 4 |
| アリシア | 63 | 59 | 4 | 0 | 0 | 0 |
人物A(ad_ik2)では、モーフの4割近くが材質モーフでした。中身を読むと、使い方は大きく4つに分かれます。
| 使い方 | 例 | 中身 |
|---|---|---|
| パーツを消す | 「ハイライト消」「髪影消」「照れ消」 | その材質の不透明度に0を掛ける(乗算) |
| 衣装を外す | 「Mスカート」「髪留め」「素足」 | 不透明度から1を引く(加算)。「素足」はニーソと、ニーソ用の脚など4材質を消す |
| 色を変える | 「髪色R+」「瞳色R-」「ネイル色G+」など | テクスチャ係数の赤・緑・青を足し引きする(加算) |
| 輪郭線を変える | 「エッジ+」「エッジ-」 | 全材質の輪郭線の太さを変える |
人物Aの材質モーフの要素111個のうち、加算は106個、乗算は5個でした。拡散色(不透明度を含む)を変える要素は58個、テクスチャ係数を変える要素は48個です。アリシアの4つは「髪影消し」「照れ消し」「照れ2消し」「舌光沢」で、どれも乗算でした。
three.jsは頂点モーフしか当てない
three.js(r171)の MMDLoader は、モーフの種類ごとに分岐を持っていますが、中身があるのは頂点モーフだけです。材質・ボーン・UV・追加UVの分岐は「TODO: implement」と書かれたまま空で、グループモーフも子の頂点モーフしか当てません。そのため表情の一覧には名前が並ぶのに、動かしても形以外は何も変わりません。
手元のVMD 30本で、人物Aの材質・ボーン・UVモーフに当たる表情キーは300個ありました。ただし値が0でないものは1個(「素足」)だけで、ほとんどは「0のまま」と書いてあるだけです。ダンスモーションの再生よりも、表情パネルで手で動かすときや、モデルの見た目を整えるときに効いてくる違いです。
このサイトで当てるようにした範囲
描く直前に表情の重みを読み、材質モーフの計算(元の値 × 乗算の積 + 加算の和)をして、材質の色・不透明度・反射色・環境色・輪郭線へ写しています。写し方はMMDLoaderが材質を作るときと同じにしてあります。不透明度が0になった材質は描きません(輪郭線と影も出しません)。
人物Aで確かめると、「Mスカート」で20,638画素、「エッジ+」で22,562画素、「素足」で34,739画素が変わりました。「素足」を0.5にすると半透明になり、0に戻すと元の画面と1画素も違いません。
- テクスチャ係数・スフィア係数・トゥーン係数は、まだ当てていません。 「髪色R+」のような色替えはここを使うので、動かしても画面は変わりません(人物Aで変化した画素は0)。テクスチャの色へどう掛けるのかを、MMD本体と見比べて確かめる手段がないためです。
- ボーンモーフは、まだ当てていません(人物Aに4個)。UVモーフは2026-10-06から当てています(UVモーフとボーンモーフ)。