2ntブログ

MMDの新フォーマット解析

MMDはV8かV9ぐらいからプロジェクトファイルであるpmmフォーマットが新しくなり、それまでは少しでもモデルを弄ってしまうと異常終了していたのが多少のことではビクともしなくなりました。
以前、私が公開していたPmmDumpは旧フォーマット用でしたので公開を停止していましたが、新フォーマットでも尚開けなくなるpmmファイルが出てきましたので新フォーマットに対応する事にしました。
解析中の情報をここに記録します。


1.ヘッダ
ヘッダ情報はそれほど旧フォーマットとそれほど変わっていませんが、Format IDが001から002にバージョンアップしていますので、ここで新旧を判断します。
Field Type Size Description
Format ID C String 30 Polygon Movie maker 0002\0
View Width Int32 4 出力画面サイズの幅
View Height Int32 4 出力画面サイズの高さ
Frame Width Int32 4 フレーム操作ウィンドウの幅
View Angle Float 4 視野角(編集中)
Unknown Byte[7] 7 恐らくフラグ


2.モデル
モデルの格納数が記録されていますので、この数だけ2-1~11までを繰り返します。
Field Type Size Description
ModelCount Byte 1 格納モデル数(255までしか格納できない?)

2-1.モデルヘッダ
新フォーマットになって少々のモデルデータの変更でも異常終了しなくなった理由がここです。
旧フォーマットではこれらの情報はモデルデータを開いて取得していましたが、新フォーマットではpmmファイル内に格納するようになりました。
後のキーフレーム数などの算出に使用する情報なので、少なくともpmmファイル内では矛盾が起こらなくなり異常終了を招かなくなっています。
Field Type Size Description
ModelNo byte 1 モデル番号(0から連番)
ModelName VString (Variable) モデル名JP
ModelNameE VString (Variable) モデル名EN
ModelPath C String 256 モデルパス(Windows標準最大パスは260なので不味い?)
Unknown Byte 1  
BoneCount Int32 4 モデルのボーン数
BoneNames VString[BoneCount] (Variable)*BoneCount ボーン名JPがBoneCount分繰り返す
SkinCount Int32 4 モデルのモーフ数
SkinNames VString[SkinCount] (Variable)*SkinCount モーフ名JPがSkinCount分繰り返す
IKCount Int32 4 モデルのIK数
IKIndex Int32[IKCount] 4*IKCount IKのボーン番号がIKCount繰り返す
OPCount Int32 4 モデルの外部親ターゲットに設定可能なボーン数
OPIndex Int32[OPCount] 4*OPCount 外部親ターゲットのボーン番号がOPCount分繰り返す
Unknown Byte 1 モデル描画順?
Display Bool 1 表示(編集中)
SelectedBone Int32 4 選択ボーン(編集中)
SkinPanel Int32[4] 16 表情パネル:眉、目、リップ、他の選択モーフ
FrameCount Byte 1 表示枠の数(表示、表情含む)
FrameOpen Bool[FrameCount] 1*FrameCount 表示枠の展開状況
Unknown Int32 4 なにかのフレーム番号?
LastFrame Int32 4 最終フレーム番号

2-2.ボーン初期フレーム
たびたび登場するMMDのフレーム構造です。頻繁に挿入・削除が繰り返されるデータなので内部ではフレーム番号順には並んでおらず、BeforeIndexとAfterIndexでフレームデータがリンクされています。初期フレームだけ DataIndexを持ちません。

以下をボーンの数(BoneCount)だけ繰り返します。
Field Type Size Description
Frame Int32 4 フレーム番号
BeforeIndex Int32 4  
AfterIndex Int32 4  
IPL_X Float[4] 16 補完曲線X軸
IPL_Y Float[4] 16 補完曲線Y軸
IPL_Z Float[4] 16 補完曲線Z軸
IPL_R Float[4] 16 補完曲線R軸
Translation float[3] 12 移動(X,Y、Z)
Rotation Float[4] 16 回転(X,Y,Z,R)クォータニオン
Unknown Byte 1 ただのパディング?
Selected Bool 1 選択状態(0:非選択、1:選択)

2-3.ボーンキーフレーム
Field Type Size Description
BoneKeyCount Int32 4 キーフレームの数(0フレーム除く)

以下を、ボーンキーフレーム数(BoneKeyCount)だけ繰り返します。どのボーンの情報かはボーン初期フレームからAfterIndexを辿ることで分かるようになっています。
Field Type Size Description
DataIndex Int32 4  
Frame int32 4 フレーム番号
BeforeIndex Int32 4  
AfterIndex Int32 4  
IPL_X Float[4] 16 補完曲線X軸
IPL_Y Float[4] 16 補完曲線Y軸
IPL_Z Float[4] 16 補完曲線Z軸
IPL_R Float[4] 16 補完曲線R軸
Translation float[3] 12 移動(X,Y、Z)
Rotation Float[4] 16 回転(X,Y,Z,R)クォータニオン
Unknown Byte 1 ただのパディング?
Selected Bool 1 選択状態(0:非選択、1:選択)

2-4.モーフ初期フレーム
ここもボーンのフレームデータ構造と同じですね。

以下をモーフの数(SkinCount)だけ繰り返します。
Field Type Size Description
Frame int32 4 フレーム番号
BeforeIndex Int32 4  
AfterIndex Int32 4  
SkinValue Float 4 モーフ値
Selected Bool 1 選択状態(0:非選択、1:選択)

2-5.モーフキーフレーム
Field Type Size Description
SkinKeyCount Int32 4 キーフレームの数(0フレーム除く)

以下を、モーフキーフレーム数(SkinKeyCount)だけ繰り返します。
Field Type Size Description
DataIndex Int32 4  
Frame int32 4 フレーム番号
BeforeIndex Int32 4  
AfterIndex Int32 4  
SkinValue Float 4 モーフ値
Selected Bool 1 選択状態(0:非選択、1:選択)

2-6.表示・IK・外親初期フレーム
新フォーマットの特徴でもある外部親の情報が追加されています。
外部親の情報は ModelIndex(Int32) と BoneIndex(Int32)のペアで表現され、これを外部親ターゲットとして登録可能な数分(OPCount)だけ繰り返します。ModelIndexが-1だとそのターゲットボーンには外部親は未登録となります。
構造としてなんだか弱いような気がしますね。
ただ、VMDフォーマットは外部親の情報がサポートされていないようなので、モーションを取り出す際には無視して良いかもしれません。私は別途、CSVの状態で取り出すことにします。
Field Type Size Description
Frame Int32 4 フレーム番号
BeforeIndex Int32 4  
AfterIndex Int32 4  
Display Bool 1 表示状態(0:非表示、1:表示)
IK Bool[IKCount] 1*IKCount IK有効状態。IKCountだけ繰り返す
OPData (Int32 + Int32)[OPCount] (4+4)*OPCount 外部親定義情報。OPCountだけ繰り返す。
Selected Bool 1 選択状態(0:非選択、1選択)

2-7.表示・IK・外親キーフレーム
Field Type Size Description
VisibleKeyCount Int32   キーフレームの数(0フレーム除く)

以下をキーフレーム数(VisibleKeyCount)だけ繰り返します。
Field Type Size Description
DataIndex Int32 4  
Frame int32 4  
BeforeIndex Int32 4  
AfterIndex Int32 4  
Display Bool 1 表示状態(0:非表示、1:表示)
IK Bool[IKCount] 1*IKCount IK有効状態。IKCountだけ繰り返す
OPData (Int32 + Int32)[OPCount] (4+4)*OPCount 外部親定義情報。OPCountだけ繰り返す。
Selected Bool 1 選択状態(0:非選択、1選択)

2-8.ボーンステータス
pmm保存時のボーン編集中の状態が記録されます。モーションデータには関係ないので、適当に読み飛ばせば良いと思います。

以下をボーン数(BoneCount)だけ繰り返します。
Field Type Size Description
Translation Float[3] 12 移動(X,Y、Z)
Rotation Float[4] 16 回転(X,Y,Z,R)クォータニオン
Moved Bool 1 未確定状態(0:確定、1:未確定)
Pysic(?) Bool 1 なんだろ?物理演算のON/OFF状態と関係あるようです。
Selected Bool 1 選択状態(0:非選択、1選択)

2-9.モーフステータス
ここもモーションには関係ないので適当にスキップします。

SkinCount分だけ以下を繰り返します。
Field Type Size Description
SkinValue Float 4 モーフ値

2-10.IK・外親ステータス
ここもモーションには関係ないので適当にスキップします。Unknown部分は外部親のステータスなのは確実なのですが、今一つ想定した記録の仕方がされていないためUnknownとしています。
Field Type Size Description
IK bool[IKCount] 1*IKCount IK有効状態。IKCountだけ繰り返す
Unknown (Int32+Int32+Int32+Int32)[OPCount] (4+4+4+4)*OPCount 外部親のステータス

2-11.終端
何かを意味するバイト列だと思いますが、今のところ無視しても問題なさそうなのでスキップします。pmmが壊れた場合、このバイト列を目印にしてモデルデータの境界を探すと良いかもしれません。
Field Type Size Description
Unknown byte[7] 7 00 00 00 80 3F 01 ??
?? は 01 からボーンごとに連番となるようです。

3.カメラ
ボーン追従の情報が追加されています。あれ?ボーン追従って旧フォーマットの頃からありませんでしたっけ?

3-1.カメラ初期フレーム
Field Type Size Description
Frame int32 4 フレーム番号
BeforeIndex Int32 4  
AfterIndex Int32 4  
Distance Float 4 カメラ距離
Position Float[3] 12 カメラ中心位置(X,Y,Z)
Angle Float[3] 12 カメラ角度(X,Y,Z)ラジアン角
FollowModel Int32 4 ボーン追従モデルIndex(-1:非選択)
FollowBone Int32 4 ボーン追従モデルのボーンIndex
IPL_X Float[4] 16 補完曲線X軸
IPL_Y Float[4] 16 補完曲線Y軸
IPL_Z Float[4] 16 補完曲線Z軸
IPL_R Float[4] 16 補完曲線R軸
IPL_Distance Float[4] 16 補完曲線距離
IPL_Angle Float[4] 16 補完曲線視野角
IsOrth Bool 1 パースOn/Off
ParseAngle Float 4 視野角
Selected Bool 1 選択状態(0:非選択、1選択)

3-2.カメラキーフレーム
Field Type Size Description
CameraKeyCount Int32 4 カメラキーフレーム数(0フレーム除く)

以下を、キーフレーム(CameraKeyCount)の分だけ繰り返します。
Field Type Size Description
DataIndex Int32 4  
Frame int32 4  
BeforeIndex Int32 4  
AfterIndex Int32 4  
Distance Float 4 カメラ距離
Position Float[3] 12 カメラ中心位置(X,Y,Z)
Angle Float[3] 12 カメラ角度(X,Y,Z)ラジアン角
FollowModel Int32 4 ボーン追従モデルIndex(-1:非選択)
FollowBone Int32 4 ボーン追従モデルのボーンIndex
IPL_X Float[4] 16 補完曲線X軸
IPL_Y Float[4] 16 補完曲線Y軸
IPL_Z Float[4] 16 補完曲線Z軸
IPL_R Float[4] 16 補完曲線R軸
IPL_Distance Float[4] 16 補完曲線距離
IPL_Angle Float[4] 16 補完曲線視野角
IsOrth Bool 1 パースOn/Off
ParseAngle Float 4 視野角
Selected Bool 1 選択状態(0:非選択、1選択)

3-3.カメラステータス
編集時の情報ですので、モーションには影響しないためスキップします。
Field Type Size Description
Position Float[3] 12  
ViewPosition Float[3] 12  
Angle Float[3] 12  
IsParse Bool 1  


VString:先頭1Byteに文字列長が入る可変文字列(要するに最大256文字)。
CString:NULLで終了する文字列。



続いて、照明やアクセサリの情報が格納されていますがここは旧フォーマットと変わりは無いようですので割愛します。

一応上記の解析情報をPmmDumpに反映させてHDD内の幾つかのpmmファイルを処理にかけてみましたが問題は無いようです。外部親やアクセサリの情報がVMDに反映されないのを別のファイルに書きだしていますが、これをMMDに簡単にロードできる仕組みも含めて考えて、まとまったらPmmDumpを再公開しようと思います。

ろうそく

突然、早苗さんを怪しい場所でみんなでいじめる動画をつくりたいと思ったので下準備です。


早苗さんがいじめられる場所は、ロウソクが無数に燃えるほの暗いステージと考えこれをMMEで実現できないかと調べ始めたのですが私には無理でした。
仕方が無いのでロウソクモデルを1つ作り、それをスクリプトで増殖させてステージを構築することにします。配置されたロウソクの数は420個。総頂点数は25万。炎はボーンで揺らしているので、420個の炎を同時に動かせるかどうか心配しましたが、意外になんともなかったです。
前日にメモリを増設したのが効いているのかもしれませんが、これなら倍ぐらいに増やしても良さそうですね。

次に早苗さんの服。前回作ったファーランジェリーは場違いなので、巫女服を弄る方向で考えます。ちょっと胸元をはだけて、スカートを短く……あれ?早苗さんが履いているのって袴?スカート?
ひとまずステージと衣装が仮組みできたので、よさそうなモーションを探して躍らせてみました。
可愛いダンスが多いので場所にあうモーションを探すのがちょっと大変でしたが、このモーション良いですね。
モーションとカメラは配布されているものを拝借しています。
エフェクトがいい加減なのと破綻が目立つのはテスト動画ということで見逃してくれれば……。


[広告 ] VPS


あとはステージの微調整と、早苗さんの衣装のウェイト修正と物理の変更が終わってやっと動画づくりが始められます。作りかけで放ったらかしにしている動画がいくつか溜まってきていますが、これも飽きずに最後まで作ることができるかどうか、ちょっと不安だったり。さてどうなる事やら。

ちょっとしたスクリプト

先日、モデルの改造をしていた際に必要となって書いた簡単なスクリプトをいくつか紹介します。


調べてはいませんが、同じような事もしくはもっと高度なことを実現するスクリプトやプラグインは既にあったりすると思います。しかし、こういった小さなスクリプトを普段から書いておくと色々な場面で流用ができて便利なので、ちょっとしたものであれば書くことにしています。書いた方が早いというのもありますが、書くのもまた楽しいですので。

プラグイン化せずにスクリプトのカタチで残しておくとその場その場のニーズに合わせて弄れるので便利良いです。また、こうしてスクリプトで晒しておけば、プラグインやスクリプトをどうやって書けば良いかわからないという人の参考になるかも知れません。

基本的な使い方は、PMXEditor(PMDEと略)のメニューから[編集]-[プラグイン]-CSScriptと選び、簡易形式のタブにコードをコピペして実行ボタンを押す事で処理されます。
常用するならプラグイン化も簡単で、CSScriptの画面から[編集]-簡易形式を一般形式に変換を実行し、"CSScript生成プラグイン"と書かれた文字を適当な名前に変えたあとに、[ファイル]-プラグインDLL生成を実行し作成します。
作成したDLLはPMDEのプラグインフォルダにコピーすると次回起動時からプラグインとして使用できるようになります。


[PMDE]選択頂点の鏡像選択
モデル編集中にX軸を挟んで反対側の頂点、つまり鏡像を選択したくなることが時々あります。私がよくやってしまうは、ウェイトの鏡像反映をしようと思って一生懸命頂点を選択したのはいいけれど、処理をするために選択しないといけないのは反対側だったなんて時に、このスクリプトを実行します。
blog2014091501.jpg



[PMDE]頂点の選択状態を保存する
選択頂点の記憶はPMDE標準機能にもありますが、一旦作業を中断してPMDEを終了する時、モデルを読み直したい時に今の選択状態を保存する際に使用します。



[PMDE]頂点の選択状態を読む
前述の「選択状態を保存」で保存した選択状態を読み込んで頂点を選択します。
基本的には頂点番号で管理していますので、頂点を入れ替えたり削除したりすると正常に動作しません。そういったとき、SHIFTキーを押しながらスクリプトを実行すると頂点座標で選択しようとします……がうまくいくとは限りません。



[PMDE]頂点モーフから選択頂点のみを抜き出す
たとえば、「まばたき」のモーフを選択し、顔の左側の頂点を選択してスクリプトを実行すると、左ウィンクのモーフが出来上がります。モーフを分離したいときなど、余計な頂点がモーフに入ってしまったときなどに使用します。
blog2014091502.jpg



[PMDE]頂点モーフを合成する
いくつかのモーフを合成して新たなモーフを合成します。おそらくTransformViewを駆使すれば同じ事はできるのでしょうが、作成したいモーフがたくさんあったり繰り返し同じ作業をやらないといけない事が多いのでスクリプト化します。
blog2014091503.jpg


と、まぁ他にも書き捨てのスクリプトは幾つかありますが、整理できれば紹介したいと思います。
PMDE界隈はプラグイン作家さんが意外に少ないので、もっと増えてほしいですね。

ビッチもぶ子さん

先週末はとらはぜ式もぶ子さんを弄っていました


ボンヤリと、てとらさんをギャル化させたいなぁと思っていたのですが、そんな折にとらはぜ様がもぶ子さんを公開されたのでこちらを手を付ける事に。
blog20140901a.png
右が改変前のオリジナルもぶ子さん。左が改変中。

もっとアメリカンスクールガール的に胸元を開けて下着出して……ってやりたいのですが、さすがに似合わないですよね。
髪型を変えたいのと、リボンとルーズソックスはカスタム少女からの借り物ですので余裕があればモデリングしなおしたいなと。スカートも短くした分、物理設定しなおさないといけないし……課題は山積みです。
良い改変モデルが出たらそちらを使おうかと一旦手置き。

ほったらかしにしているモデルやモーション溜まってきたかも。

[MMD]TETORA JC

このロリコンどもめ!


今回は「鞍掛てとら」ちゃんの動画です。判りにくいかもしれませんがいわゆるワリキリです。去年の秋ごろに即興で作ってそのあとお蔵入りしていたものにシーンを追加して組み立てました。

今回試した事はいくつかありますが、そのひとつは「1カットを短めにする」です。
私はだらだらと1モーションを作ってしまうのですが、今回は300フレーム程度の動画を幾つか作成して挿入しています。それに合わせて後半3000フレームぐらいの1モーションだった動画も編集でいくつかのカットにわけました。
ボイスも付けてたのですが、カットしたことで合わなくなったのでボイスもカットです。

もう一つは「エロ以外のシーンも入れる」です。ぶっちゃけてしまえば見る側も、そして作る側にとっても余計なシーンなのですが、キャラクターのエロ以外の姿をみせてシチュエーションを示し、エロを際立てようという試みです。
本当ならば日常シーンを入れたかったのですが、シーンとのつなぎ方が想像できなかったので断念しました。
こういう編集技術は普段からいろんな映像を注意して観察しておく必要がありそうです。
エロ以外とエロを見せるやりかたとしては某氏のダンスとエロを混ぜた動画が判りやすいです。前回、Girls salonでパクらインスパイアさせていただきましたが、良いですねアレ。

没モノ。
blog2014081701.jpg

待ち合わせの目印にするためにアクセサリストラップ付きのガラケーを作成しました。
待ち合わせ場所を変更したので目印が必要なくなったので演出としてはカットしました。カメラレンズの付け忘れとスケールが変なので、次に使う機会があればちゃんと修正したいところです。

待ち合わせ場所が駅前広場からコンビニ前に変わったので、序盤のシーンは総とっかえ。待ち人が現れてベンチから立ち上がり腕組みというシーケンスでしたが、モーションが気に入らなかったので没にしました。日常動作って難しいですね。
てとらの暗い表情が作り笑顔に変わるシーンが自分でも好きだったのですが。

部屋へ向かうエレベーターの中でちゅっちゅするシーンのため、エレベーターを作りましたが、部屋のなかで同じようなシーンを入れたのでカット。
参考にしたのは私の会社のエレベーターです。一人でエレベーターに乗ったときにスマホでパシャパシャと内部構造の写真を撮る不審人物は私です。でも、あまりシティホテルのエレベーターっぽくないですね。

本動画とはあまり関係ありませんが、アップロード直前にとらはぜ氏のモブ子さんが公開されました。
ネタが思い浮かべば、この娘でも動画を作らせていただきたいですね。


[広告 ] VPS
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
Twitter