PmmDump モーション取り出し2
遅ればせながら、明けましておめでとうございます。今年もよろしくお願いします。
年末にクリスマス動画を作成していたのですが、動画用の10本前後のpmmファイルのうち殆どが開けなくなるという事態になってしまいました。使用していたモデル名に中黒が入っている事。MMDの内部文字コードはcp932である事(あれ?PMX形式ってUTFですよね?)など怪しそうな理由はあるのですが、モーションデータのバックアップの大切さを改めて実感したのでした。(pmmファイルをバックアップしていても開けなくなったら意味がないので)
そこでpmm形式が新バージョンになったことで使う事を止めていたPmmDumpを新バージョン用に更新する事にしました。
以前から不満に思っていた、モデルを入れ替えたら外部親やアクセサリの親設定をやり直さないといけない面倒さもいずれ解消できればと思い、必要な情報も書きだしています。
まだ出力のログが雑だったりしますが、使いながらブラッシュアップしていこうと思います。ひとまず現在出来ているところでアップロードしておきます。
Download
認証キー tracebox0103
年末にクリスマス動画を作成していたのですが、動画用の10本前後のpmmファイルのうち殆どが開けなくなるという事態になってしまいました。使用していたモデル名に中黒が入っている事。MMDの内部文字コードはcp932である事(あれ?PMX形式ってUTFですよね?)など怪しそうな理由はあるのですが、モーションデータのバックアップの大切さを改めて実感したのでした。(pmmファイルをバックアップしていても開けなくなったら意味がないので)
そこでpmm形式が新バージョンになったことで使う事を止めていたPmmDumpを新バージョン用に更新する事にしました。
以前から不満に思っていた、モデルを入れ替えたら外部親やアクセサリの親設定をやり直さないといけない面倒さもいずれ解消できればと思い、必要な情報も書きだしています。
まだ出力のログが雑だったりしますが、使いながらブラッシュアップしていこうと思います。ひとまず現在出来ているところでアップロードしておきます。
Download
認証キー tracebox0103
MMDの新フォーマット解析
MMDはV8かV9ぐらいからプロジェクトファイルであるpmmフォーマットが新しくなり、それまでは少しでもモデルを弄ってしまうと異常終了していたのが多少のことではビクともしなくなりました。
以前、私が公開していたPmmDumpは旧フォーマット用でしたので公開を停止していましたが、新フォーマットでも尚開けなくなるpmmファイルが出てきましたので新フォーマットに対応する事にしました。
解析中の情報をここに記録します。
1.ヘッダ
ヘッダ情報はそれほど旧フォーマットとそれほど変わっていませんが、Format IDが001から002にバージョンアップしていますので、ここで新旧を判断します。
2.モデル
モデルの格納数が記録されていますので、この数だけ2-1~11までを繰り返します。
2-1.モデルヘッダ
新フォーマットになって少々のモデルデータの変更でも異常終了しなくなった理由がここです。
旧フォーマットではこれらの情報はモデルデータを開いて取得していましたが、新フォーマットではpmmファイル内に格納するようになりました。
後のキーフレーム数などの算出に使用する情報なので、少なくともpmmファイル内では矛盾が起こらなくなり異常終了を招かなくなっています。
2-2.ボーン初期フレーム
たびたび登場するMMDのフレーム構造です。頻繁に挿入・削除が繰り返されるデータなので内部ではフレーム番号順には並んでおらず、BeforeIndexとAfterIndexでフレームデータがリンクされています。初期フレームだけ DataIndexを持ちません。
以下をボーンの数(BoneCount)だけ繰り返します。
2-3.ボーンキーフレーム
以下を、ボーンキーフレーム数(BoneKeyCount)だけ繰り返します。どのボーンの情報かはボーン初期フレームからAfterIndexを辿ることで分かるようになっています。
2-4.モーフ初期フレーム
ここもボーンのフレームデータ構造と同じですね。
以下をモーフの数(SkinCount)だけ繰り返します。
2-5.モーフキーフレーム
以下を、モーフキーフレーム数(SkinKeyCount)だけ繰り返します。
2-6.表示・IK・外親初期フレーム
新フォーマットの特徴でもある外部親の情報が追加されています。
外部親の情報は ModelIndex(Int32) と BoneIndex(Int32)のペアで表現され、これを外部親ターゲットとして登録可能な数分(OPCount)だけ繰り返します。ModelIndexが-1だとそのターゲットボーンには外部親は未登録となります。
構造としてなんだか弱いような気がしますね。
ただ、VMDフォーマットは外部親の情報がサポートされていないようなので、モーションを取り出す際には無視して良いかもしれません。私は別途、CSVの状態で取り出すことにします。
2-7.表示・IK・外親キーフレーム
以下をキーフレーム数(VisibleKeyCount)だけ繰り返します。
2-8.ボーンステータス
pmm保存時のボーン編集中の状態が記録されます。モーションデータには関係ないので、適当に読み飛ばせば良いと思います。
以下をボーン数(BoneCount)だけ繰り返します。
2-9.モーフステータス
ここもモーションには関係ないので適当にスキップします。
SkinCount分だけ以下を繰り返します。
2-10.IK・外親ステータス
ここもモーションには関係ないので適当にスキップします。Unknown部分は外部親のステータスなのは確実なのですが、今一つ想定した記録の仕方がされていないためUnknownとしています。
2-11.終端
何かを意味するバイト列だと思いますが、今のところ無視しても問題なさそうなのでスキップします。pmmが壊れた場合、このバイト列を目印にしてモデルデータの境界を探すと良いかもしれません。
3.カメラ
ボーン追従の情報が追加されています。あれ?ボーン追従って旧フォーマットの頃からありませんでしたっけ?
3-1.カメラ初期フレーム
3-2.カメラキーフレーム
以下を、キーフレーム(CameraKeyCount)の分だけ繰り返します。
3-3.カメラステータス
編集時の情報ですので、モーションには影響しないためスキップします。
VString:先頭1Byteに文字列長が入る可変文字列(要するに最大256文字)。
CString:NULLで終了する文字列。
続いて、照明やアクセサリの情報が格納されていますがここは旧フォーマットと変わりは無いようですので割愛します。
一応上記の解析情報をPmmDumpに反映させてHDD内の幾つかのpmmファイルを処理にかけてみましたが問題は無いようです。外部親やアクセサリの情報がVMDに反映されないのを別のファイルに書きだしていますが、これをMMDに簡単にロードできる仕組みも含めて考えて、まとまったらPmmDumpを再公開しようと思います。
以前、私が公開していた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を再公開しようと思います。
ちょっとしたスクリプト
先日、モデルの改造をしていた際に必要となって書いた簡単なスクリプトをいくつか紹介します。
調べてはいませんが、同じような事もしくはもっと高度なことを実現するスクリプトやプラグインは既にあったりすると思います。しかし、こういった小さなスクリプトを普段から書いておくと色々な場面で流用ができて便利なので、ちょっとしたものであれば書くことにしています。書いた方が早いというのもありますが、書くのもまた楽しいですので。
プラグイン化せずにスクリプトのカタチで残しておくとその場その場のニーズに合わせて弄れるので便利良いです。また、こうしてスクリプトで晒しておけば、プラグインやスクリプトをどうやって書けば良いかわからないという人の参考になるかも知れません。
基本的な使い方は、PMXEditor(PMDEと略)のメニューから[編集]-[プラグイン]-CSScriptと選び、簡易形式のタブにコードをコピペして実行ボタンを押す事で処理されます。
常用するならプラグイン化も簡単で、CSScriptの画面から[編集]-簡易形式を一般形式に変換を実行し、"CSScript生成プラグイン"と書かれた文字を適当な名前に変えたあとに、[ファイル]-プラグインDLL生成を実行し作成します。
作成したDLLはPMDEのプラグインフォルダにコピーすると次回起動時からプラグインとして使用できるようになります。
[PMDE]選択頂点の鏡像選択
モデル編集中にX軸を挟んで反対側の頂点、つまり鏡像を選択したくなることが時々あります。私がよくやってしまうは、ウェイトの鏡像反映をしようと思って一生懸命頂点を選択したのはいいけれど、処理をするために選択しないといけないのは反対側だったなんて時に、このスクリプトを実行します。
[PMDE]頂点の選択状態を保存する
選択頂点の記憶はPMDE標準機能にもありますが、一旦作業を中断してPMDEを終了する時、モデルを読み直したい時に今の選択状態を保存する際に使用します。
[PMDE]頂点の選択状態を読む
前述の「選択状態を保存」で保存した選択状態を読み込んで頂点を選択します。
基本的には頂点番号で管理していますので、頂点を入れ替えたり削除したりすると正常に動作しません。そういったとき、SHIFTキーを押しながらスクリプトを実行すると頂点座標で選択しようとします……がうまくいくとは限りません。
[PMDE]頂点モーフから選択頂点のみを抜き出す
たとえば、「まばたき」のモーフを選択し、顔の左側の頂点を選択してスクリプトを実行すると、左ウィンクのモーフが出来上がります。モーフを分離したいときなど、余計な頂点がモーフに入ってしまったときなどに使用します。
[PMDE]頂点モーフを合成する
いくつかのモーフを合成して新たなモーフを合成します。おそらくTransformViewを駆使すれば同じ事はできるのでしょうが、作成したいモーフがたくさんあったり繰り返し同じ作業をやらないといけない事が多いのでスクリプト化します。
と、まぁ他にも書き捨てのスクリプトは幾つかありますが、整理できれば紹介したいと思います。
PMDE界隈はプラグイン作家さんが意外に少ないので、もっと増えてほしいですね。
調べてはいませんが、同じような事もしくはもっと高度なことを実現するスクリプトやプラグインは既にあったりすると思います。しかし、こういった小さなスクリプトを普段から書いておくと色々な場面で流用ができて便利なので、ちょっとしたものであれば書くことにしています。書いた方が早いというのもありますが、書くのもまた楽しいですので。
プラグイン化せずにスクリプトのカタチで残しておくとその場その場のニーズに合わせて弄れるので便利良いです。また、こうしてスクリプトで晒しておけば、プラグインやスクリプトをどうやって書けば良いかわからないという人の参考になるかも知れません。
基本的な使い方は、PMXEditor(PMDEと略)のメニューから[編集]-[プラグイン]-CSScriptと選び、簡易形式のタブにコードをコピペして実行ボタンを押す事で処理されます。
常用するならプラグイン化も簡単で、CSScriptの画面から[編集]-簡易形式を一般形式に変換を実行し、"CSScript生成プラグイン"と書かれた文字を適当な名前に変えたあとに、[ファイル]-プラグインDLL生成を実行し作成します。
作成したDLLはPMDEのプラグインフォルダにコピーすると次回起動時からプラグインとして使用できるようになります。
[PMDE]選択頂点の鏡像選択
モデル編集中にX軸を挟んで反対側の頂点、つまり鏡像を選択したくなることが時々あります。私がよくやってしまうは、ウェイトの鏡像反映をしようと思って一生懸命頂点を選択したのはいいけれど、処理をするために選択しないといけないのは反対側だったなんて時に、このスクリプトを実行します。
[PMDE]頂点の選択状態を保存する
選択頂点の記憶はPMDE標準機能にもありますが、一旦作業を中断してPMDEを終了する時、モデルを読み直したい時に今の選択状態を保存する際に使用します。
[PMDE]頂点の選択状態を読む
前述の「選択状態を保存」で保存した選択状態を読み込んで頂点を選択します。
基本的には頂点番号で管理していますので、頂点を入れ替えたり削除したりすると正常に動作しません。そういったとき、SHIFTキーを押しながらスクリプトを実行すると頂点座標で選択しようとします……がうまくいくとは限りません。
[PMDE]頂点モーフから選択頂点のみを抜き出す
たとえば、「まばたき」のモーフを選択し、顔の左側の頂点を選択してスクリプトを実行すると、左ウィンクのモーフが出来上がります。モーフを分離したいときなど、余計な頂点がモーフに入ってしまったときなどに使用します。
[PMDE]頂点モーフを合成する
いくつかのモーフを合成して新たなモーフを合成します。おそらくTransformViewを駆使すれば同じ事はできるのでしょうが、作成したいモーフがたくさんあったり繰り返し同じ作業をやらないといけない事が多いのでスクリプト化します。
と、まぁ他にも書き捨てのスクリプトは幾つかありますが、整理できれば紹介したいと思います。
PMDE界隈はプラグイン作家さんが意外に少ないので、もっと増えてほしいですね。
PmmDump モーション取り出し
MMDで動画作成作業をする際に前から欲しいと思っていたちょっとしたツールを書いてみました。まだまだ不具合は多いと思いますので暫定的な公開です。
私はMMDで動画を作成する際、動画を作りながら頻繁にモデルを更新して入れ替えています。
その度にモーションを保存し、モデルを削除→変更したモデルを読み込み→モーションを再度読み込み……といったことをするのですが大変煩雑で、モーションを保存しそこなっていたりといったミスも多くなります。
また、MMDはモデルのバージョンが合わないとpmmファイルが開けなくなりますので、作成が一段落したら動画内の各モデルのモーションをVMDに書きだすようにしているのですが、これも少し面倒でついつい先延ばしにしているうちに忘れてしまい、次にpmmを開こうとしたときにはもう開けなくなってしまっているといったことも数多く経験しています。恐らくMMDを使用されている方の多くが体験していることでしょう。
そんな作業の負荷を軽減するためのツールを書いてみました。
使い方は簡単。コマンドラインからプログラムにpmmファイルを指定して上げるだけです。
するとpmmファイルと同じ場所に日付付きのフォルダを作成し、その中にVMDファイルを出力します。
まだ作り立てですので不具合は多いかもしれませんが恐る恐る公開します。
Download
認証キー tracebox1108
私はMMDで動画を作成する際、動画を作りながら頻繁にモデルを更新して入れ替えています。
その度にモーションを保存し、モデルを削除→変更したモデルを読み込み→モーションを再度読み込み……といったことをするのですが大変煩雑で、モーションを保存しそこなっていたりといったミスも多くなります。
また、MMDはモデルのバージョンが合わないとpmmファイルが開けなくなりますので、作成が一段落したら動画内の各モデルのモーションをVMDに書きだすようにしているのですが、これも少し面倒でついつい先延ばしにしているうちに忘れてしまい、次にpmmを開こうとしたときにはもう開けなくなってしまっているといったことも数多く経験しています。恐らくMMDを使用されている方の多くが体験していることでしょう。
そんな作業の負荷を軽減するためのツールを書いてみました。
使い方は簡単。コマンドラインからプログラムにpmmファイルを指定して上げるだけです。
C:\PmmDump.exe C:\MMD\えっちな動画.pmm
するとpmmファイルと同じ場所に日付付きのフォルダを作成し、その中にVMDファイルを出力します。
まだ作り立てですので不具合は多いかもしれませんが恐る恐る公開します。
なぞの白い液体のつくりかた
PMXEditorのみで液体を作れないものかと考えてみました。
私は動画に液体をよく使用しますが、その液体モデルの作成をPMXEditorのみでできないものかと考えてみました。また、その使い方もふくめて解説動画にしてみました。
液体モデルは用途に合わせて物理演算を組み込んだもの、IKを組み込んだもの、制御ボーンを複数持つものなどありますが、ここでは簡単なモノを例としています。実際に私が今使っている方法とは異なりますが何かの参考になればと思います。
今回初めてナイフ機能を使いました。普段はモデリングソフトにはメタセコイアを使用していますので、編集作業はPMXEditor上ではあまり行いません。PMXEditorも素晴らしいツールソフトですが、込み入ったモデリングを行うのであれば専用のソフトを使用した方が数十倍の効率が得られると思いますので、PMXEditorに固執する必要はないと思います。
[広告 ] VPS
しかしエンコードされた動画を見るとフレームレートが随分落ちているように見えますね。エンコードのことはよくわからずツールに任せていますが難しいですね。
私は動画に液体をよく使用しますが、その液体モデルの作成をPMXEditorのみでできないものかと考えてみました。また、その使い方もふくめて解説動画にしてみました。
液体モデルは用途に合わせて物理演算を組み込んだもの、IKを組み込んだもの、制御ボーンを複数持つものなどありますが、ここでは簡単なモノを例としています。実際に私が今使っている方法とは異なりますが何かの参考になればと思います。
今回初めてナイフ機能を使いました。普段はモデリングソフトにはメタセコイアを使用していますので、編集作業はPMXEditor上ではあまり行いません。PMXEditorも素晴らしいツールソフトですが、込み入ったモデリングを行うのであれば専用のソフトを使用した方が数十倍の効率が得られると思いますので、PMXEditorに固執する必要はないと思います。
[広告 ] VPS
しかしエンコードされた動画を見るとフレームレートが随分落ちているように見えますね。エンコードのことはよくわからずツールに任せていますが難しいですね。