ページ 1 / 1
VMDに保存したカメラアニメーションを反映
Posted: 2012年2月20日(月) 23:14
by smr_c
DXライブラリを使用して3Dアクションゲームを作らせていただいている
smr_cと申します。
以下の質問掲示板にて
VMDに保存したカメラアニメーションをDXライブラリで反映させることができると
聞いたので、一緒に載せてあったプログラムを試しに動かしてみたのですが、
どうにもカメラの視点がななめ上からの俯瞰で終始止まってしまいます。
カメラのvmdについて
コードは手を加えておらず、上記のページのものと同一です。
また、モデルはMMD付属の”初音ミク.pmd”、
モーションは”恋愛サーキュレーション short Lat式.vmd”や、
”MikuMikuDance_星間飛行【ソース】.pmm”から抽出し
”初音ミク000.vmd”にリネームしたものを使用しています。
カメラアニメーションは
”MikuMikuDance_星間飛行【ソース】.pmm”から抽出し
”Camera.vmd”にリネームしたものを使用したときはちゃんと動いてくれたのですが、
自分で作った”Camera.vmd”は上手く機能せず、終始ななめ上からの俯瞰でした。
どうやら”Camera.vmd”が原因らしいことはわかったのですが、
MMDで読み直してもきちんと保存はできているようです。
また、”MikuMikuDance_星間飛行【ソース】.pmm”から抽出した”Camera.vmd”に
編集を加えたものは正常なカメラアニメーションになりませんでした。
なにが原因なのでしょうか。
ご助言をお願いします。
Re: VMDに保存したカメラアニメーションを反映
Posted: 2012年2月21日(火) 14:46
by softya(ソフト屋)
データとソースを掲載してもらうと検証可能かと思います。
どうやっても上手く行かない場合は本家で質問して頂く必要がると思いますが。
Re: VMDに保存したカメラアニメーションを反映
Posted: 2012年2月23日(木) 11:13
by smr_c
返信ありがとうございます。
こちらのアップローダーにファイルをアップさせていただきました。
passは”test”です。
ファイルの内容は
VMDCameraTest.exe
main.cpp
Log.txt
Camera.vmd : 自作カメラアニメーション
Camera2.vmd : ”MikuMikuDance_星間飛行【ソース】.pmm”から抽出したカメラアニメーション
Camera3.vmd : 自作カメラアニメーション
初音ミク.pmd : MMD付属モデル
初音ミク000.vmd : ”MikuMikuDance_星間飛行【ソース】.pmm”から抽出したモーションデータ
となっています。
検証よろしくお願いします。
Re: VMDに保存したカメラアニメーションを反映
Posted: 2012年2月23日(木) 11:33
by softya(ソフト屋)
vmdフォーマットに詳しくないので解析は出来ていないのですが、Camera.vmdはファイルサイズが小さすぎる気がします。
Camera2.vmdはちゃんと動くのですが、こちらはファイルサイズが大きいです。
なんかカメラの初期座標しか入っていないような印象を受けました。カメラの全フレーム保存に失敗しているのではないでしょうか?
[追記] MV1GetFrameNum(CameraHandle)を試してみましたがフレーム数が1ですので、モーションが無いです。
訂正。いつも勘違いするがフレーム数は、モーション数ではありせんでしたね。うーん。慣れんわー。
もう少し調べてみます。
Re: VMDに保存したカメラアニメーションを反映
Posted: 2012年2月23日(木) 13:13
by smr_c
ありがとうございます。
Camera.vmdはファイルサイズが小さすぎるかも知れないとの指摘があったので
フレーム数を増やし大きくしましたが変わりはありませんでした。
MMD上で保存→読み込みをしたところきちんとすべて読み込めたので
カメラの全フレーム保存はできていると思います。
[追記]-----------------------------------
重ねての質問となりますが、
MV1GetFrameNum(CameraHandle)はxファイルなどのモデルのフレーム数を調べる関数だと思っていましたが、
カメラアニメーションのフレームもカウントできるのでしょうか。
-------------------------------------------
いろいろと調べてみたところ、以下のようなことがわかりました。
動く場合
・フレームが最初の1フレームしかないとき。
・最初と最後のフレームが同じ視点であるとき。ただしあいだに異なる視点のフレームがあったらダメ。
つまりフレームが2つしかなくそれらが同じ場合。
それ以外は視点がななめ上からの俯瞰で終始止まった状態になります。
フレームの数やフレームごとの間隔の差は関係なく、
どれだけフレームの数を増やしても減らしても(上記の通りフレームが1つだけなら動く)、
どれだけフレームごとの間隔を開いてもなくしても変わりませんでした。
ただ、抽出したカメラアニメーションを使用した際は問題なく動いたので、
自分でフレームを打ち込んだものとの差が他にあるのかもしれません。
こちらは本家のDXライブラリ質問掲示板にて質問させていただくことにいたします。
こちらに質問を上げさせていただきました。
DXライブラリ質問掲示板 - VMDに保存したカメラアニメーションを反映
Re: VMDに保存したカメラアニメーションを反映
Posted: 2012年2月23日(木) 14:59
by softya(ソフト屋)
TEXBINと言うバイナリエディタでcamera.vmdを解析表示してみました。
「Nanashi-soft : TSXBIN用VMDマクロ」 こちらのマクロを少し変えて使用。
http://blog.livedoor.jp/nanashisoft/arc ... 34616.html
このツールで見るとキーフレームが3つ有ることが分かります。
データをいじってみたりして実行結果を見るとFlameNo 00000EC4かのカメラ位置からスタートしてるようですね。
動かないのは、DXライブラリの問題かも知れません。
コード:
00 header.VmdHeader[0] 56 6F 63 61 6C 6F 69 64 20 4D 6F 74 69 6F 6E 20
10 header.VmdHeader[16] 44 61 74 61 20 30 30 30 32 00 00 00 00 00
1E header.VmdModelName[0] 83 4A 83 81 83 89 81 45 8F C6 96 BE 00 6F 6E 20
2E header.VmdModelName[16] 44 61 74 61
32 motion_count 00000000
36 vmd_skin_count 00000000
3A vmd_camera_count 00000003
3E camera[0].FlameNo 00000000
42 camera[0].distance C20C0000
46 camera[0].Location[0] 00000000 41200000 00000000
52 camera[0].Rotation[0] 00000000 00000000 00000000
5E camera[0].Interpolation[0] 14 6B 14 6B 14 6B 14 6B 14 6B 14 6B 14 6B 14 6B
6E camera[0].Interpolation[16] 14 6B 14 6B 14 6B 14 6B
76 camera[0].ViewingAngle 0000002D
7A camera[0].Perspective 00
7B camera[1].FlameNo 00001D88
7F camera[1].distance C20C0000
83 camera[1].Location[0] 00000000 41200000 00000000
8F camera[1].Rotation[0] 00000000 00000000 00000000
9B camera[1].Interpolation[0] 14 6B 14 6B 14 6B 14 6B 14 6B 14 6B 14 6B 14 6B
AB camera[1].Interpolation[16] 14 6B 14 6B 14 6B 14 6B
B3 camera[1].ViewingAngle 0000002D
B7 camera[1].Perspective 00
B8 camera[2].FlameNo 00000EC4
BC camera[2].distance C20C0000
C0 camera[2].Location[0] 00000000 41200000 00000000
CC camera[2].Rotation[0] 00000000 40490FD8 00000000
D8 camera[2].Interpolation[0] 14 6B 14 6B 14 6B 14 6B 14 6B 14 6B 14 6B 14 6B
E8 camera[2].Interpolation[16] 14 6B 14 6B 14 6B 14 6B
F0 camera[2].ViewingAngle 0000002D
F4 camera[2].Perspective 00
F5 vmd_light_count 00000000
F9 vmd_self_shadow_count 00000000
ちなみに、MV1GetAnimNum( int MHandle ) と言う関数があるのですが、これでも取得できるのは1と言う数字です。
単なるアニメーションの種類の数かもしれません。つまりカメラアニメーションがひとつ。
使えそうなのは、MV1GetAnimTotalTime()ぐらいですがトータル時間しかわかりません。
Re: VMDに保存したカメラアニメーションを反映
Posted: 2012年2月23日(木) 16:16
by smr_c
解析までしてくださったのですね!
ありがとうございます。
レベルが高すぎて「FlameNo 00000EC4かのカメラ位置からスタートしてる」あたりから
理解がとても危ういのですが、
問題がDXライブラリにありそうということは理解しました。
わざわざバイナリ解析までしてくださりありがとうございます。
本家掲示板での回答を待たせていただくことにします。
Re: VMDに保存したカメラアニメーションを反映
Posted: 2012年3月12日(月) 19:13
by smr_c
本家DXライブラリ質問掲示板より返答をいただきましたので報告し、
また、解決しましたのでこちらでも解決とさせていただきます。
管理人さんにDXライブラリのプログラムを改善していただき、
正常に動作するようになりました。
新しいバージョンは出ていないのでまだ適用されていないかと
思いますが、それまでは
こちらの掲示板にてアップしていただいた修正版を使うことで
動作が改善されると思います。