PMXの付与ボーン(回転付与・移動付与)の中身|腕捩・足D・目はこう動いている
モーションは腕捩や足のボーンを動かすだけなのに、腕捩1〜3や足Dまで一緒に回る。これはPMXの「付与」という仕組みで、ボーンがほかのボーンの回転や移動を、決まった割合で受け取っています。
付与は「誰の動きを・どれだけ受け取るか」
付与を持つボーンは、付与親(動きを受け取る元のボーン)の番号と、割合(付与率)を持ちます。付与率が0.5なら半分だけ、1なら同じだけ、-1なら逆向きに同じだけ動きます。ボーンのフラグで「回転を受け取る」「移動を受け取る」「ローカルで受け取る」を選びます。
実物のモデルでの数
| モデル | ボーン | 付与ボーン | 回転付与 | 移動付与 | ローカル付与 |
|---|---|---|---|---|---|
| 人物A(ad_ik2) | 314 | 53 | 53 | 0 | 0 |
| 人物A(ad_org8) | 310 | 51 | 51 | 0 | 0 |
| アリシア | 150 | 22 | 21 | 1 | 0 |
| ステージ | 15 | 0 | 0 | 0 | 0 |
ほとんどが回転付与でした。移動付与はアリシアの「舌1」(「口」の移動を0.5受け取る)の1本だけで、ローカル付与はどのモデルにもありませんでした。
何に使われているか
| 付与ボーン ← 付与親 | 付与率 | 役割 |
|---|---|---|
右腕捩1 右腕捩2 右腕捩3 ← 右腕捩 | 0.25 / 0.5 / 0.75 | 腕のねじれを肘へ向かって段階的に分ける(手捩も同じ) |
右足D 右ひざD 右足首D ← 右足 など | 1 | 足の回転をそのまま写す(準標準ボーン) |
右目 左目 ← 両目 | 1(アリシアは0.5) | 両目を1本のボーンで動かす |
右目戻 ← 右目 | -0.7 | 目の動きを一部打ち消す(人物A) |
右肩C ← 右肩P | -1 | 肩Pの回転を打ち消して、腕から先が一緒に回らないようにする |
腰キャンセル右 ← 腰 | -1 | 腰の回転を打ち消す |
左足親指1 など ← 左足先EX | 0.2〜0.8 | 足先EXで足の指をまとめて曲げる(人物A) |
左腕回転 ← 左腕 | 0.5 | 腕の回転の半分を受け取る補助(アリシア) |
付与率が負の値の付与は、ほかのボーンの動きを打ち消すために使われています。肩Pと肩C、腰と腰キャンセルが典型です。
three.jsで動くもの・動かないもの
three.js(r171)の MMDAnimationHelper が当てるのは、ローカルでない回転付与だけです。移動付与とローカル付与は、ソースに「TODO: implement」と書かれたまま何もしません。実物の3体では付与ボーン126本のうち125本が回転付与なので、ほとんどはthree.jsでも動きます。動かないのはアリシアの「舌1」の移動付与だけです。ただし、手元のVMD 30本には「口」を動かすキーが1つも無かったので、実際の再生で差が出る場面は確かめられていません。
付与は、付与親の付与を先に計算してから子へ伝える必要があります(付与親自身も付与を持つことがあるため)。MMDLoaderは付与の親子関係から木を作り、親から順に並べ替えています。
VMDで付与ボーンを動かすと
付与ボーンにもVMDのキーを書けます。three.jsでは、キーの回転に付与で受け取った回転が掛け合わされます。実物のVMDでも、足Dを動かすキーが18本に入っていました(うち実際に回転しているのは82個中33個)。足Dを持たないモデルでは、そのキーは捨てられます(別のモデルで一部が動かない原因)。