2012年3月26日月曜日

Secondlife Avatar ボーン構造 と PMD のボーン構造

MikuMikuDance (MMD) のモーションファイルである VMD から Secondlife (SL) 用に BVH 変換 (mio –> mmdbvh2slbvh) して SL の中で楽しむのはもう何度かご紹介してきましたが、もともとこの仕組みは MMD 標準ボーンを前提としたモーションファイルの変換をしています。
MMD に同梱されているあにまさ式ミクさんや他のモデルのボーン構造は以下のようになっています。これは mio で VMD ファイルを BVH ファイルに変換して、BVHacker でみた構造です。ただし、指のボーンや髪のボーンは割愛して、SL で関係するものだけをリストしています。

ルート(VMDではセンター)
   下半身
      左足
         左ひざ
            左足首
      右足
         右ひざ
            右足首
   上半身
      左肩
         左腕
            左ひじ
               左手首
      右肩
         右腕
            右ひじ
               右手首
      首
         頭

最近のモデルは、特に上半身を親ボーンとする「上半身2」、腕の「捩りボーン」などを追加して、いわゆる「多段ボーン化」したものが増えてきています。多段ボーン化されたモデルを前提とした VMD モーションファイルの公開も多くなってきました。多段ボーン化することにより、より滑らかなアニメーション、ダンスが可能になります。(ただし、その分モーション作成の手間が増えます)
mio や mmdbvh2slbvh では、上述のような後発の多段ボーンには基本は対応していないので、たとえば、上半身2 前提のモーションファイルを SL 用に変換すると、上半身2 の情報(上半身を親とした X, Y, Zの回転情報)は mio を使った時点で欠落します。(追記:必ず欠落するのではなく mio で読み込んだ PMD モデルに依存しているようです。後述の dictionary に記述がない場合は、日本語ボーン名が英語に変換されず吐き出されます。)
一方、Secondlife のアバターの標準ボーン構造をみると以下のようになっています。

hip
   abdomen
      chest
         neck
            head
         lCollar
            lShldr
               lForeArm
                  lHand
         rCollar
            rShldr
               rForeArm
                  rHand
   lThigh
      lShin
         lFoot
   rThigh
      rShin
         rFoot

QAvimator などで Secondlife 用のポーズやアニメーションを作ったことがある人なら、この構造は見慣れたものでしょう。
この Secondlife の Avatar のボーン構造を、MMD の PMD/PMX の最近のボーン構造と照らし合わせてみると、以下のように考えることもできます。

hip (センター+下半身)
   abdomen (上半身 ただし、hip に含まれる下半身の向き・回転要素を削除)
      chest (上半身2  だだし、hip に含まれる下半身の向き・回転要素を削除) 削除の必要ないかも。ただいま検証中。理論的には相殺する必要はないはずです。。。。
         neck (首) *1 
            head (頭) *1 
      lCollar (左肩)
         lShldr (左腕)
            lForeArm (左ひじ)
               lHand (左手首)
      rCollar (右肩)
         rShldr (右腕)
            rForeArm (右ひじ)
               rHand (右手首) 
   lThigh (左足) 
      lShin (左ひざ) 
         lFoot (左足首) 
   rThigh (右足) 
      rShin (右ひざ) 
         rFoot (右足首)
*1 たぶん、調整が必要。なぜなら親ボーン(hip)に VMD で本来ないはずの下半身要素が入っているから。 これも調整の必要ないかも。検証中><

優れものツールである mmdbvh2slbvh は作者様のご好意によりソースコードも公開されていますが、その中をみると、hip の部分はセンターと下半身の位置・回転を合成そして微調整をし、adbomen は hip の子ボーンとなるため、VMD 上半身の回転から hip に含まれてしまった VMD 下半身の回転を割り引いたものとしてモーションを生成しています。上記の chest の部分は当時は上半身2 ボーンがそれほど普及していなかった、さらに mio が吐き出す bvh のボーン構造も標準以外の上半身2ボーンを無視していたため(正確に書くとmioでの使用ボーンに依存し、dictionary に上半身2対応の英語表記が登録されていないため、後の工程で処理可能になっていなかった)、chest の部分は基本的にはなにもしない(=abdomen の直線延長ボーン)扱いとなっています。

もし、mio が上半身2ボーンを含めた BVH ファイルを生成し、さらに、mmdbvh2slbvh が chest 部分のデータを上半身2から生成することができれば、そもそも SL Avatar のボーン構造からすると上半身2を前提としたアニメーションのほうがなめらかになるのでは?というのが今回考えたことでした。

ここでいえることは「多段化されていない標準モデル」用のモーションはきれいに変換できるが、多段化されたボーンを前提としたモーションはちょっと違和感が出る、その理由は特に上半身2ボーンにツールたちが対応していないから、ということでしょう。
VMD モーション変換をするときは、この点に注意してモーションを選ぶといいですね。



さて、、、、
以下は、まだおすすめできる十分な情報と経験が私にないので、質問やご要望をうけても対応できませんので、、、、その点をご了承いただける方はご参考までに。。。。
これは、試行錯誤で見つけた方法であり、そのプログラム的な根拠はありません。ですので、なんら保証もありません。本当に参考程度に見てください。

----------------------------------------------------

[追記:2012/9] 以下の情報のアップデートになります。以下の投稿では mio でのカスタマイズが不要な MMDBVHToSLBVH.EXE をご紹介しています。

http://snumaw.blogspot.jp/2012/09/chest.html

----------------------------------------------------

mio で上半身2 を BVH ファイルに組み込む方法

1) mio のサブフォルダ data を開く
2) mmd サブフォルダを開き、dictionary テキストファイルをメモ帳などで開く
3) 標準ミクのボーン構造が書かれているので、上半身,upper_body の下に 上半身2,upper_body2 を追記し、上書き保存する。(バックアップはあらかじめとっておくこと)
4) mio を起動して、上半身2 ボーンを持っているモデルを読み込む。(このとき、たぶん、頂点数などが多かったり(?)すると、モデルが表示されれない場合もあります。が、気にしない) 5) VMD を読み込み、Export する。

(たぶん、vmdviewer を使わずにコマンドラインでの convert がもっともスマートかも。上半身2モデルを読み込む必要があるかどうかは、私も実は疑問です。)(追記:これがビンゴでした。。。mio で指定する pmd/pmx は対応するボーンを持ったモデルじゃないとだめだったんです)

これで吐き出された BVH をメモ帳(は、正直つらいので、他のテキスト編集エディタがお勧めです)で開き、ボーン構造に upper_body2 が含まれていれば成功、フレームの upper_body2 に該当する要素にデータが入っていれば大成功です。
しかし、これだけでは SL に持っていくことはまだできません。
以下は Visual Studio という Microsoft のプログラム作成ツールを使います。(無料版もあります)なので、正直一般的には難しいと思います。


mmdbvh2slbvh で上半身2ボーンと chest を関連付ける

mmdbvh2slbvh のソースコードをダウンロードして、ソリューションを開き、BVHConverter.cs の abdomen 変換処理の下に chest 変更処理を abdomen を参考に追記して、ボーン対応構造にも chest と upper_body2 を追記して、ビルドする。
上を読んで「なるほどね」と思った人はトライしてみる価値はあるかもです (^^;
まだ、首と頭の調整をいれていませんが、上記 改造 mio と改造 mmdbvh2slbvh を使ってコンバートした 上半身2 前提モーションが以下になります。


なんか、まだまだやること(楽しめること)いっぱいありますね。

[追記]
mio は読み込んだ PMD モデルの構造を参照して BVH ファイルを吐き出すようです。ですから、上半身2のモーションを変換するには上半身2ボーンをもったモデルを使わなければいけません。dictionary ファイルでは日本語ボーンを英語に変換する対応を提供しているようです。

mmdbvh2slbvh では、シンプルに上半身2(upper_body2)を処理し、それが chest であることの関連づけだけで OK でした。

検証のために比較した動画が以下になります~。

2 件のコメント:

  1. まさに「なるほどわからん」状態です@@
    MMDの多段ボーンも使ったことなかったりしますし・・・(笑)

    返信削除
  2. ま、、、私もまだ「なるほど、わからん」状態ですけどね^^;
    上半身2をchestに対応させるときに下半身回転を差し引くのは間違いでした。上記の動画の2分37秒くらいのモーションみて確信しました。また、親である上半身(abdomen)で差し引いているから必要ないということが正しかったんですね~。

    返信削除