Table Of Contents

This Page

ボーンの表示

読み取ったデータからまずはボーンの頂点配列を作って表示してみる。

<%= source_view(‘src/PMDBone.py’) %> スケルトンの表示に必要な木構造と各ボーンの親ボーンからの相対位置のみをコピーして表示してみる。

PMDボーンにBVHモーションを流し込んでみる

pmdモデルなのでvmdモーションを流し込めばいいのだが、標準のスケルトンはIKがついているのでそれを解決してからにしないと足などがまともに動かない。もうひとつvmdのモーションはキーフレームを採用していて間をベジェ補間しているのでそれもひと手間かかる。とりあえずBVHのモーションで試してみよう。ただし、PMDとBVHではスケルトンの構造とボーンの命名が違うのでそれに対処する必要がある。

今回使ったBVHのスケルトン

bvhloader.pyに直接引数を与えると木構造を表示するようにしてある

Hips 0.000000 35.647600 0.000000
  Chest 0.000001 12.147400 0.000000
    Neck -0.000000 11.804900 0.000000
      Head -0.000000 3.970430 0.000000 > 0.000000 9.264330 0.000000
    LeftCollar -0.000000 11.804900 0.000000
      LeftUpArm 8.024650 0.000000 -0.000007
        LeftLowArm 11.118800 0.000000 -0.000008
          LeftHand 9.988660 0.000000 -0.000007 > 5.851260 0.000000 -0.000004
    RightCollar -0.000000 11.804900 0.000000
      RightUpArm -8.024650 0.000000 -0.000001
        RightLowArm -11.118800 0.000000 0.000000
          RightHand -9.988660 0.000000 0.000000 > -5.851260 0.000000 0.000000
  LeftUpLeg 3.912320 0.000000 0.000000
    LeftLowLeg 0.000000 -16.654500 0.000002
      LeftFoot 0.000000 -15.447000 0.000002 > 0.037397 -3.865870 6.717130
  RightUpLeg -3.912320 0.000000 -0.000000
    RightLowLeg 0.000000 -16.654500 0.000002
      RightFoot 0.000000 -15.447000 0.000002 > 0.034208 -3.883120 6.707190

初音ミクVer2のスケルトン

センター
<ROTATE_MOVE センター>(center)
 +<ROTATE 上半身>(upper body)
 | +<ROTATE 首>(neck)
 | | +<ROTATE 頭>(head)
 | |   +<ROTATE_INFL 左目>(eye_L)
 | |   | +<ROTATE 左目光>(eyelight_L)
 | |   | | +<UNVISIBLE 左目光先>(bone128)
 | |   | +<UNVISIBLE 左目先>(bone095)
 | |   +<ROTATE_INFL 右目>(eye_R)
 | |   | +<ROTATE 右目光>(eyelight_R)
 | |   | | +<UNVISIBLE 右目光先>(bone129)
 | |   | +<UNVISIBLE 右目先>(bone096)
 | |   +<ROTATE 左髪1>(hair1_L)
 | |   | +<IK_ROTATE_INFL 左髪2>(hair2_L)
 | |   |   +<IK_ROTATE_INFL 左髪3>(hair3_L)
 | |   |     +<IK_ROTATE_INFL 左髪4>(hair4_L)
 | |   |       +<IK_ROTATE_INFL 左髪5>(hair5_L)
 | |   |         +<IK_ROTATE_INFL 左髪6>(hair6_L)
 | |   |           +<IK_TARGET 左髪7>(hair7_L)
 | |   +<ROTATE 右髪1>(hair1_R)
 | |   | +<IK_ROTATE_INFL 右髪2>(hair2_R)
 | |   |   +<IK_ROTATE_INFL 右髪3>(hair3_R)
 | |   |     +<IK_ROTATE_INFL 右髪4>(hair4_R)
 | |   |       +<IK_ROTATE_INFL 右髪5>(hair5_R)
 | |   |         +<IK_ROTATE_INFL 右髪6>(hair6_R)
 | |   |           +<IK_TARGET 右髪7>(hair7_R)
 | |   +<ROTATE 両目>(eyes)
 | |   | +<UNVISIBLE 両目先>(bone117)
 | |   +<ROTATE 前髪1>(front hair1)
 | |   | +<UNVISIBLE 前髪1先>(bone125)
 | |   +<ROTATE 前髪2>(front hair2)
 | |   | +<UNVISIBLE 前髪2先>(bone126)
 | |   +<ROTATE 前髪3>(front hair3)
 | |   | +<UNVISIBLE 前髪3先>(bone127)
 | |   +<UNVISIBLE 頭先>(bone094)
 | +<IK_ROTATE_INFL ネクタイ1>(necktie1)
 | | +<IK_ROTATE_INFL ネクタイ2>(necktie2)
 | |   +<IK_ROTATE_INFL ネクタイ3>(necktie3)
 | |     +<IK_TARGET ネクタイ4>(necktie4)
 | +<ROTATE 左肩>(shoulder_L)
 | | +<ROTATE 左腕>(arm_L)
 | |   +<ROLLING 左腕捩>(arm twist_L)
 | |   | +<ROTATE 左ひじ>(elbow_L)
 | |   | | +<ROLLING 左手捩>(wrist twist_L)
 | |   | | | +<ROTATE 左手首>(wrist_L)
 | |   | | | | +<ROTATE 左親指1>(thumb1_L)
 | |   | | | | | +<ROTATE 左親指2>(thumb2_L)
 | |   | | | | |   +<UNVISIBLE 左親指先>(bone100)
 | |   | | | | +<ROTATE 左人指1>(fore1_L)
 | |   | | | | | +<ROTATE 左人指2>(fore2_L)
 | |   | | | | |   +<ROTATE 左人指3>(fore3_L)
 | |   | | | | |     +<UNVISIBLE 左人差指先>(bone101)
 | |   | | | | +<ROTATE 左中指1>(middle1_L)
 | |   | | | | | +<ROTATE 左中指2>(middle2_L)
 | |   | | | | |   +<ROTATE 左中指3>(middle3_L)
 | |   | | | | |     +<UNVISIBLE 左中指先>(bone102)
 | |   | | | | +<ROTATE 左薬指1>(third1_L)
 | |   | | | | | +<ROTATE 左薬指2>(third2_L)
 | |   | | | | |   +<ROTATE 左薬指3>(third3_L)
 | |   | | | | |     +<UNVISIBLE 左薬指先>(bone103)
 | |   | | | | +<ROTATE 左小指1>(little1_L)
 | |   | | | | | +<ROTATE 左小指2>(little2_L)
 | |   | | | | |   +<ROTATE 左小指3>(little3_L)
 | |   | | | | |     +<UNVISIBLE 左小指先>(bone104)
 | |   | | | | +<UNVISIBLE 左手先>(bone099)
 | |   | | | +<UNVISIBLE 左手捩先>(bone131)
 | |   | | +<ROTATE_MOVE 左袖>(sleeve_L)
 | |   | |   +<UNVISIBLE 左袖先>(bone098)
 | |   | +<UNVISIBLE 左腕捩先>(bone130)
 | |   +<TWEAK 左腕捩1>(bone134)
 | |   +<TWEAK 左腕捩2>(bone135)
 | |   +<TWEAK 左腕捩3>(bone136)
 | +<ROTATE 右肩>(shoulder_R)
 |   +<ROTATE 右腕>(arm_R)
 |     +<ROLLING 右腕捩>(arm twist_R)
 |     | +<ROTATE 右ひじ>(elbow_R)
 |     | | +<ROLLING 右手捩>(wrist twist_R)
 |     | | | +<ROTATE 右手首>(wrist_R)
 |     | | | | +<ROTATE 右親指1>(thumb1_R)
 |     | | | | | +<ROTATE 右親指2>(thumb2_R)
 |     | | | | |   +<UNVISIBLE 右親指先>(bone109)
 |     | | | | +<ROTATE 右人指1>(fore1_R)
 |     | | | | | +<ROTATE 右人指2>(fore2_R)
 |     | | | | |   +<ROTATE 右人指3>(fore3_R)
 |     | | | | |     +<UNVISIBLE 右人差指先>(bone110)
 |     | | | | +<ROTATE 右中指1>(middle1_R)
 |     | | | | | +<ROTATE 右中指2>(middle2_R)
 |     | | | | |   +<ROTATE 右中指3>(middle3_R)
 |     | | | | |     +<UNVISIBLE 右中指先>(bone111)
 |     | | | | +<ROTATE 右薬指1>(third1_R)
 |     | | | | | +<ROTATE 右薬指2>(third2_R)
 |     | | | | |   +<ROTATE 右薬指3>(third3_R)
 |     | | | | |     +<UNVISIBLE 右薬指先>(bone112)
 |     | | | | +<ROTATE 右小指1>(little1_R)
 |     | | | | | +<ROTATE 右小指2>(little2_R)
 |     | | | | |   +<ROTATE 右小指3>(little3_R)
 |     | | | | |     +<UNVISIBLE 右小指先>(bone113)
 |     | | | | +<UNVISIBLE 右手先>(bone108)
 |     | | | +<UNVISIBLE 右手捩先>(bone133)
 |     | | +<ROTATE_MOVE 右袖>(sleeve_R)
 |     | |   +<UNVISIBLE 右袖先>(bone107)
 |     | +<UNVISIBLE 右腕捩先>(bone132)
 |     +<TWEAK 右腕捩1>(bone137)
 |     +<TWEAK 右腕捩2>(bone138)
 |     +<TWEAK 右腕捩3>(bone139)
 +<ROTATE 下半身>(lower body)
 | +<ROTATE 腰飾り>(waist accessory)
 | | +<UNVISIBLE 腰飾り先>(bone097)
 | +<ROTATE 左スカート前>(front skirt_L)
 | | +<UNVISIBLE 左スカート前先>(bone105)
 | +<ROTATE 左スカート後>(back skirt_L)
 | | +<UNVISIBLE 左スカート後先>(bone106)
 | +<IK_ROTATE_INFL 左足>(leg_L)
 | | +<IK_ROTATE_INFL 左ひざ>(knee_L)
 | |   +<IK_ROTATE_INFL 左足首>(ankle_L)
 | |     +<IK_TARGET 左つま先>(toe_L)
 | +<ROTATE 右スカート前>(front skirt_R)
 | | +<UNVISIBLE 右スカート前先>(bone114)
 | +<ROTATE 右スカート後>(back skirt_R)
 | | +<UNVISIBLE 右スカート後先>(bone115)
 | +<IK_ROTATE_INFL 右足>(leg_R)
 | | +<IK_ROTATE_INFL 右ひざ>(knee_R)
 | |   +<IK_ROTATE_INFL 右足首>(ankle_R)
 | |     +<IK_TARGET 右つま先>(toe_R)
 | +<UNVISIBLE 下半身先>(bone093)
 +<IK ネクタイIK>(necktie IK)
 | +<UNVISIBLE ネクタイIK先>(bone118)
 +<IK 左髪IK>(hair IK_L)
 | +<UNVISIBLE 左髪IK先>(bone119)
 +<IK 右髪IK>(hair IK_R)
 | +<UNVISIBLE 右髪IK先>(bone120)
 +<UNVISIBLE センター先>(bone116)
左足IK
<IK 左足IK>(leg IK_L)
 +<IK 左つま先IK>(toe IK_L)
 | +<UNVISIBLE 左つま先IK先>(bone123)
 +<UNVISIBLE 左足IK先>(bone121)
右足IK
<IK 右足IK>(leg IK_R)
 +<IK 右つま先IK>(toe IK_R)
 | +<UNVISIBLE 右つま先IK先>(bone124)
 +<UNVISIBLE 右足IK先>(bone122)

ボーン名をマッピングする

全然構成が違うんだけどとりあえずマッピングする。 BVH -> PMD への変換だけを作ればいいので手間はたいしたことは無い。

右手系と左手系とどっちが上なのか

ここで複数のフォーマット間でデータを運用するときにぶつかる、ものによって採用している座標系が違うという問題があらわれる。 三次元の座標系は、どの座標を上下前後左右に割り当てるかで流派がありそれぞれのフォーマットは独自の流派を持つ。

PMDは、右:X, 上:Y, 奥:Zの座標系(DirectX)を採用していて OpenGL(MQOも)は、右:X, 上:Y, 手前:Zの座標系を採用している。 そのため読み込んだ後ボーンのZ座標の正負を入れ替える処理をいれている。

大きくDirectX派(左手系)とOpenGL派(右手系)という方向性と、 CAD派(Z軸が上。たぶん平面図を立体化するという発想)と非CAD派(Y軸が上。モニタに対する奥行きがZという発想)の2軸の組み合わせがある。複数環境を混ぜる場合は注意が必要。

Note

BVHの座標系に関してはよくわからない

<%= source_view(‘src/PMDBoneBVH.py’) %>

Note

class=memo>ToDo: 移動要素の調整

inserted by FC2 system