MathematicaでMikuMikuDance 4

  ダンスをさせる計算。

# 1. ボーンの可視化
 3D CGモデルのダンスはボーン(骨)を回転したり移動させたりする計算が必要です。まず、前回のPMDモデルのボーンを可視化してみます。

```Maathematica:Mathematica
In[100]:=f["Bones"][[1]]
Out[100]={"﻿センター", 65535, 116, 1, 0, {0., 8., 0.}}
```
ボーンは、{ボーン名、親のボーンID、子のボーンID、ボーンの種類、IK影響化フラグ、ボーンの位置}のリストで構成されています。
 PMDファイルの詳細については、[MMDのモデルデータ(PMD)形式　めも　(まとめ)](http://blog.goo.ne.jp/torisu_tetosuki/e/209ad341d3ece2b1b4df24abf619d6e4)を参照ください。

  あにまさ式初音ミクの場合、ボーンは下記140個ほどあります。

```Maathematica:Mathematica
In[101]:= #[[1]] & /@ f["Bones"]
Out[101]= {"﻿センター", "﻿上半身", "﻿首", "﻿頭", "﻿左目", "﻿右目", "﻿ﾈｸﾀｲ１", \
"﻿ﾈｸﾀｲ２", "﻿ﾈｸﾀｲ３", "﻿下半身", "﻿腰飾り", "﻿左髪１", "﻿左髪２", "﻿左髪３", "﻿左髪４", \
"﻿左髪５", "﻿左髪６", "﻿左肩", "﻿左腕", "﻿左腕捩", "﻿左ひじ", "﻿左手捩", "﻿左手首", "﻿左袖", \
"﻿左親指１", "﻿左親指２", "﻿左人指１", "﻿左人指２", "﻿左人指３", "﻿左中指１", "﻿左中指２", \
"﻿左中指３", "﻿左薬指１", "﻿左薬指２", "﻿左薬指３", "﻿左小指１", "﻿左小指２", "﻿左小指３", \
"﻿左ｽｶｰﾄ前", "﻿左ｽｶｰﾄ後", "﻿左足", "﻿左ひざ", "﻿左足首", "﻿右髪１", "﻿右髪２", "﻿右髪３", \
"﻿右髪４", "﻿右髪５", "﻿右髪６", "﻿右肩", "﻿右腕", "﻿右腕捩", "﻿右ひじ", "﻿右手捩", "﻿右手首", \
"﻿右袖", "﻿右親指１", "﻿右親指２", "﻿右人指１", "﻿右人指２", "﻿右人指３", "﻿右中指１", "﻿右中指２", \
"﻿右中指３", "﻿右薬指１", "﻿右薬指２", "﻿右薬指３", "﻿右小指１", "﻿右小指２", "﻿右小指３", \
"﻿右ｽｶｰﾄ前", "﻿右ｽｶｰﾄ後", "﻿右足", "﻿右ひざ", "﻿右足首", "﻿両目", "﻿前髪１", "﻿前髪２", \
"﻿前髪３", "﻿左目光", "﻿右目光", "﻿ﾈｸﾀｲ４", "﻿左髪７", "﻿右髪７", "﻿左つま先", "﻿右つま先", \
"﻿ﾈｸﾀｲＩＫ", "﻿左髪ＩＫ", "﻿右髪ＩＫ", "﻿左足ＩＫ", "﻿右足ＩＫ", "﻿左つま先ＩＫ", "﻿右つま先ＩＫ", \
"﻿下半身先", "﻿頭先", "﻿左目先", "﻿右目先", "﻿腰飾り先", "﻿左袖先", "﻿左手先", "﻿左親指先", \
"﻿左人差指先", "﻿左中指先", "﻿左薬指先", "﻿左小指先", "﻿左スカート前先", "﻿左スカート後先", "﻿右袖先", \
"﻿右手先", "﻿右親指先", "﻿右人差指先", "﻿右中指先", "﻿右薬指先", "﻿右小指先", "﻿右スカート前先", \
"﻿右スカート後先", "﻿センター先", "﻿両目先", "﻿ﾈｸﾀｲＩＫ先", "﻿左髪ＩＫ先", "﻿右髪ＩＫ先", \
"﻿左足ＩＫ先", "﻿右足ＩＫ先", "﻿左つま先ＩＫ先", "﻿右つま先ＩＫ先", "﻿前髪１先", "﻿前髪２先", \
"﻿前髪３先", "﻿左目光先", "﻿右目光先", "﻿左腕捩先", "﻿左手捩先", "﻿右腕捩先", "﻿右手捩先", \
"﻿左腕捩1", "﻿左腕捩2", "﻿左腕捩3", "﻿右腕捩1", "﻿右腕捩2", "﻿右腕捩3"}
```

 ボーンは親は１つなのですが、ぶら下がる子は複数あります。またボーン種類はIDのままですと分かりづらいです。さらに踊らせる事を考えてボーンを回転させる時の移動先やIK(インバースキネマティクス)計算用の情報を含んだ形にしておきたいです。そこでPMDのボーンを作業用のボーン形式へ変換する為の関数*Pmd2bone*を作成します。
 またボーンの可視化をする際に、親と子を*Line*で結ぶ為、親と子の3D座標のペアがあると便利です。これを求める関数を*Bone2Line*という名前で作成します。

```Mathematica:bone.m
Pmd2bone[pmdbone_] :=
 (* PMDファイルのボーンを扱い易いように変換する。 *)
 (* \
ボーン名　親　子　種類　IK影響下 座標 *)
 Module[{i, s, result},
  result = {};
  For[i = 1, i <= Length[pmdbone], i++,
   s = {};
   s = Append[s, pmdbone[[i, 1]]];
   s = Append[s,
     If[pmdbone[[i, 2]] == 65535, Null, pmdbone[[i, 2]] + 1]
     ];
   s = Append[s,
     Flatten[Position[pmdbone[[All, 2]], i - 1]]
     ];
   s = Append[s,
     {"回転", "回転と移動", "IK", "不明", "IK影響下", "回転影響下", "IK接続先", "非表示", 
       "捻り", "回転運動"}
      [[pmdbone[[i, 4]] + 1]]
     ];
   s = Append[s,
     If[pmdbone[[i, 5]] == 0, Null, pmdbone[[i, 5]] + 1]
     ];
   (* ボーン名　親　子　種類　IK影響下 *)
   s = Append[s, pmdbone[[i, 6]]]; (*ボーン位置 *)
   s = Append[s, {0, 0, 0, 1}]; (*ボーン角度　絶対角*)
   s = Append[s, {0, 0, 0}]; (*移動位置　初期姿勢相対 *)   
   s = Append[s, {0, 0, 0, 1}];(*ボーン角度　初期姿勢相対 *)   
   s = Append[s, pmdbone[[i, 6]]];(* ボーン初期姿勢　位置 *)
   s = Append[s, {0, 0, 0}]; (*移動位置 IK用*)
   s = Append[s, {0, 0, 0, 1}]; (*移動角 IK用*)
   result = Append[result, s];
   ];
  Return[result];
  ];
Bone2line[bone_] :=
  Module[{i, s, result},
   result = {};
   For[i = 1, i < Length[bone], i++,
    s = bone[[i, 4]];
    If[s == "IK" || s == "非表示", Continue[]];
    s = bone[[i, 2]];
    If[s == Null, Continue[]];
    s = {bone[[i, 6]], bone[[bone[[i, 2]], 6]]};
    result = Append[result, s];
    ];
   Return[result];
   ];
```

 下記コマンドでPMDのボーンを変換します。

```Mathematica:Mathematica
In[681]:= bone = Pmd2bone[f["Bones"]];
bone[[1]]

Out[682]= {"﻿センター", Null, {2, 10, 87, 88, 89, 
  117}, "回転と移動", Null, {0., 8., 0.}, {0, 0, 0, 1}, {0, 0, 0}, {0, 0, 
  0, 1}, {0., 8., 0.}, {0, 0, 0}, {0, 0, 0, 1}}
```

 *Graphics3D*と*Bone2line*を使ってボーンを可視化します。

```Mathematica:Mathematica
In[681]:= Graphics3D[Line[Bone2line[bone]], ViewPoint -> Right];
```
![bone1.png](https://qiita-image-store.s3.amazonaws.com/0/119510/2d3c0eab-98c9-a60f-7c23-b6942d0943b4.png)

  ミクさんのボーンが表示できました！
でも、髪の毛やネクタイ、スカートにボーンが入っているので人間の骨と違ってイメージしづらいですね。なので、Pmdモデルを重ねて可視化してみます。

```Mathematica:Mathematica
In[682]:= vertex = f["VertexVectors"];
vv[s_, i_] := f[s][[i + 1]];
poly = Append[
     Append[{vertex[[# + 1]]}, 
      VertexNormals -> f["NormalVectors"][[# + 1]]] ,
     VertexTextureCoordinates -> vv["UVVectors", #]
     ] & /@ f["FaceIndices"];
pl[i_] := Polygon[i[[1]], i[[2]], i[[3]]];
dl = Prepend[
   Flatten[#, 1] & /@ 
    Partition[Riffle[vv["TextureList", #] & /@ f["MaterialIndices"],
      pl /@ poly], 2], EdgeForm[]];
Graphics3D[{
  Opacity[0.3],
  dl,
  Opacity[1.0],
  Glow[Red],
  Red,
  Thickness[0.01],
  Line[Bone2line[bone]]
  }, ViewPoint -> Right, ViewAngle -> Automatic]
```
![bone3.png](https://qiita-image-store.s3.amazonaws.com/0/119510/b61b2865-9ffa-98a6-2899-7436cee6b66a.png)

 指先まで綺麗にボーンが入っている事が分かります。MMDモデルって細かくて丁寧で凄くアートですね！

# n 他関連記事へのリンク
* [MathematicaでMikuMikuDance 1](http://qiita.com/I_HaL/items/caa83662baaca28b5315) PMDファイルの読み込み

# つづく