MMDの材質モーフ(着せ替え・色替え)の中身|ブラウザで表情を動かしても変わらない理由

表情の一覧に「Mスカート」「髪色R+」のような名前が並んでいるのに、動かしても何も起きない。これは材質モーフという種類の表情で、three.jsのMMDLoaderが計算を実装していないためです。

最終更新: 2026-10-06 · 実PMX 3体の材質モーフを three.js 同梱のパーサで読んで数え、人物Aで表情の重みを変えたときの画面の画素を比べて確認

このサイトの再生と表情パネルは、2026-10-06から材質モーフの色・不透明度・輪郭線を当てています。 テクスチャ係数(色替えに使うもの)はまだ当てていません(下記)。

材質モーフは「材質の値を変える表情」

頂点モーフが形を変えるのに対して、材質モーフは材質の拡散色・不透明度・反射色・環境色・輪郭線の色と太さ・テクスチャ係数などを変えます。変え方は乗算(値へ掛ける)か加算(値へ足す)の2通りで、表情の重みに応じて効き方が変わります。対象の材質番号に -1 を書くと、全材質が対象になります。

実物のモデルでの数

モデルモーフ頂点材質UVグループボーン
人物A(ad_ik2)1577762864
人物A(ad_org8)1598655864
アリシア63594000

人物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モーフとボーンモーフ)。