見出し画像

モーションファイルを調べる その5  MMD用の.VMDファイル

Meridian計画。
モーションファイルを調べる作業の続きです。
前回記事はなんと約2年前となります。
でもこの2年間の間によいことが起きておりまして、それはChatGPTが情報をまとめてくれるということです。
今回はネット検索も行っていますが、基本はChatGPTにファイル内容の調査をお願いしました。サイトの情報と見比べたところかなり正しそうな印象です。

.VMDファイルのデータ構造

.VMD ファイルは、MMD(MikuMikuDance)のモーションファイルです。
キャラクターの動作や表情、カメラモーションなどの情報を含むバイナリファイルとなっています。
データはいくつかのセクションに分かれています。

  1. ヘッダー(Header)

    • ファイルタイプ : 固定の文字列。

    • モデル名 : モーションが適用されるモデルの名前。

  2. ボーンモーションデータ(Bone Motion Data)

    • ボーンキー数 : ボーンモーションデータのエントリ数。

    • ボーンモーションエントリ : 各エントリは以下の情報を持つ。

      • ボーン名(15バイトのShift-JIS文字列)

      • フレーム番号(32ビットの整数)

      • 位置(x, y, z)(3つの32ビット浮動小数点数)

      • 回転(x, y, z, w)(クォータニオンで表現)

      • 補間データ(64バイトのデータ)

  3. 表情モーションデータ(Morph Motion Data)

    • モーフキー数 : モーフモーションデータのエントリ数。

    • モーフモーションエントリ : 各エントリは以下の情報を持つ。

      • モーフ名(15バイトのShift-JIS文字列)

      • フレーム番号(32ビットの整数)

      • モーフ値(32ビット浮動小数点数)

  4. カメラモーションデータ(Camera Motion Data)

    • カメラキー数 : カメラモーションデータのエントリ数。

    • カメラモーションエントリ : 各エントリは以下の情報を持つ。

      • フレーム番号(32ビットの整数)

      • 距離(32ビット浮動小数点数)

      • 位置(x, y, z)(3つの32ビット浮動小数点数)

      • 回転(x, y, z)(3つの32ビット浮動小数点数)

      • 補間データ(24バイトのデータ)

      • 視野角(32ビット整数)

      • パースペクティブ(パース有無フラグ)(1バイトのブール)

  5. 照明モーションデータ(Light Motion Data)

    • ライトキー数 : ライトモーションデータのエントリ数。

    • ライトモーションエントリ : 各エントリは以下の情報を持つ。

      • フレーム番号(32ビットの整数)

      • 色(r, g, b)(3つの32ビット浮動小数点数)

      • 位置(x, y, z)(3つの32ビット浮動小数点数)

  6. セルフシャドウデータ(Self Shadow Data)

    • シャドウキー数 : シャドウデータのエントリ数。

    • セルフシャドウエントリ

      • フレーム番号(32ビットの整数)

      • モード(8ビット整数)

      • 距離(32ビット浮動小数点数)

  7. IKボーンデータ(IK Bone Data)

    • IKキー数 : IKデータのエントリ数。

    • IKエントリ : 各エントリは以下の情報を持つ。

      • フレーム番号(32ビットの整数)

      • IKボーン名(20バイトのShift-JIS文字列)

      • 有効/無効フラグ(8ビット整数)

MMDのボーン名

一般的なMMDモデルで使用される主要なボーン名は以下の通りです。

上半身のボーン名

センター(センター)
 キャラクター全体の中心点。モデル全体を移動させるときに使用。
グルーブ(グルーブ)
 腰の動きを制御するボーン。モデルの重心を動かすのに使用。
上半身(上半身)
 上半身全体を動かすボーン。
上半身2(上半身2)
 上半身のさらに細かい動きを制御。
通常、胸や肩の動きに使用。
首(首)
頭(頭)
肩(肩P)
腕(左腕, 右腕)
ひじ(左ひじ, 右ひじ)
手首(左手首, 右手首)
指(左親指0, 左人指0, …, 右小指3)

 各指の関節の動きを制御するボーン。
 親指から小指まで各関節にボーンが設定されている。

下半身関連のボーン

下半身(下半身)
 下半身全体を動かすボーン。足の動きと連動。
足(左足, 右足)
 両足の動きを制御するボーン。左足と右足に分かれる。
ひざ(左ひざ, 右ひざ)
足首(左足首, 右足首)
つま先(左つま先, 右つま先)

その他のボーン

目(左目, 右目)
あご
 口の開閉に関連。
 腰の細かい動きを制御。
IKボーン(IK左足, IK右足)
 インバースキネマティクス(IK)を使用して、
 足や腕の位置を制御するボーン。
捻りボーン(左捻り, 右捻り)
 肩や腕の捻りを制御するボーン。

モデルごとに異なるボーン

物理演算用のボーン
 モデルによっては、髪の毛やスカート、リボンなどを動かすための
 物理演算用のボーンが定義されている。
カスタムボーン
 モデルの作者が設定した特定の役割を持つボーン。

というのがChatGPTのまとめ(を少し手直し編集したもの)になります。

MMDのツールとしての全容や使用したときの画面などについては以下の記事がとても参考になりました。(ありがとうございます)

補完曲線操作のところが悩ましい

1関節で3軸ずつあり、クオータニオンで表現される関節情報については、変換の計算などをkiruroboシステムなどの活用でなんとか頑張るとします。そこが今回の開発の醍醐味でもあります。

悩ましいのは補完曲線操作の部分です。
サーボがA地点からB地点まで移動する際、等速直線運動的に動くか、加速・減速を使ってなめらかに動くかなどを決めるところです。いわゆるイージングです。。
当初はイージングのパターンテンプレートをいくつか用意し、そこから選ぶということを考えていましたが、自由度やCG用モーションの再現度という観点で考えると、パラメータから曲線を算出できるようにした方が良さそうです。これを関節ごとに持つとすると、16ビットに情報を収めなければならずなかなかややこしいです。
PCからデータを100Hz送信する際には、目標値だけをずっと送ればデータ上でイージングの情報を持たせる必要もありませんが、キーフレームで区切ったモーションファイルを設定する際には、イージング情報も持たせる必要があります。

ベジェ曲線はどうか

イラストレーターなどのベクターグラフィックソフトでお馴染みのベジェ曲線が思い浮かびます。
ベジェ曲線は、4つの点座標があればさまざまな形の曲線を描くことができます。Meridianではモーション指定の際、最初の点は現在位置、目標点はサーボの目標位置として指定しますので、中間点として2つの座標があればベジェを計算できることになります。
とすると追加で2つの点座標が必要になります。

簡易化のため、座標の値を8ビットとすると、xy座標で16ビット、2座標分で2スロットのMeridimを使用することになります。
ストップモーションの1コマについてイージングが1種類であれば、導入は比較的簡単そうです。

イージング情報の区切りをどうするか

たとえば右腕は60フレームかけてイージングで滑らかに動き始めて、スッと止まる。一方、左腕は30フレームかけて徐々に頂点に達し、次に折り返して40フレームかけて逆方向に動く…という場合。
イージングの時間がバラバラになるので、関節ごとに①目標位置②補完曲線情報③時間情報が必要となります。
そこまで必要な詳細なダンス情報はPC無線接続前提としてしまう手もあり悩みどころです。
先ほどの例で、ストップモーションの1コマについて1種類であれば導入はかなり現実的です。
全関節にイージングの情報を持たせるかどうかはかなり悩ましく、関節をいくつかのグループに分けて、グループごとにイージング設定を行う方法などもかんがえられます。またモーションファイルの場合には通信が発生しないので、一コマあたり通常90個のところを180個などにデータを増やす形で設定することもできます。しかしその場合、データの解読が少し複雑になるので、ちょっと悩ましいとも考えています。

今のところ

Meridim90は機能をなるべくシンプルにするという目的があります。
判断基準をシンプルさとすると、移動フレーム数やイージング(ベジェ曲線)の情報は全身で画一的に持つことになるかもしれないと思っています。

そもそもPCで100Hzに分解した目標位置データを計算してMeridianに流し込めば、リモートブレインでどんな動作も再現可能ですしそのためのMeridianですし…(弱気)


次回記事:


前回記事:


目次:


この記事が気に入ったらサポートをしてみませんか?