さて、そんなわけで今日は六角大王のモデルデータを動かしてみるという話。
コードは昨日のを流用するとして、どこかからP3D形式(HumanMDLで作られたモーションデータ)のファイルをゲットしてこなきゃなりません。
が。
いつもどおりCypherS TufTさんにはこの条件に合致するデータが存在するので、今日もそCypherS TufTさんのお世話になります。
(いずれ、きちんとお礼をせねば。。。)
はてさて、こうしてデータが準備出来たら、一応HumanMDLでどんなモーションがあって、どんな動きをするのか確認しておいた方がいいでしょう。
この先読んでいただければわかりますけど、今回はモーション番号2番、全部で4フレーム時間あるアニメーションをさせるつもりでいます。
インデックスは0から始まるわけですから、HumanMDLで確認できるモーション、ジャンプ2と同じ動作をすれば、うまくいったと言えるわけですな。
そんなわけでさっそくコーディング。
まずはuses節にP3DLoaderユニットを追加して、TP3D, TP3DFigureオブジェクトを準備しますよ。
uses
...ROKLoader, P3DLoader;
.
.
.
ROKMesh: TSXMeshList;
P3DData: TP3D;
Motion: TP3DFigure;
.
.
こんな感じで。
んで、TP3Dオブジェクトを作成して、P3Dデータを読み込みマウス。
P3DData := TP3D.Create;
P3DData.LoadFromFile( 'jump.p3d' );
したらば、先に読み込んでおいた六角大王データと組み合わせて、P3DFigureオブジェクトを作ってもらいます。
Motion := P3DData.Spawn( ROKMesh, MeshFrame );
Spawnの引数は、六角大王のデータと、親になるフレームですよ。そこんとこお間違いなく。
当然、こうやってメッシュデータを取り出せるわけだから、昨日やったfor文による小手先のテクニックは不要になるわけだ。
あとは、Scene.Render( Root );する前に、
Motion.Move( 2, AnimationCounter );
とかすれば動き出してくれる。
ここでAnimationCounterはSingle型の変数で、表示するべき時間を表す変数。
Application.Idleが、50FPSだとだいたい20回/sぐらいの回数呼び出されるはずだから、極端に小さいとめちゃめちゃスローなアニメーションになる(当然、動きもなめらかになる)し、かといって大きいとやたらと素早く動く(すごく気持ち悪い)アニメーションになる。(さらには、動きがカクカクになる。)
増分の数値はお好みで。
まぁ、AnimationCounter := AnimationCounter + 0.01;ぐらいが丁度いいんじゃなかろうか?
あ、アニメーションは4フレームまでしかないと考えているから、
if AnimationCounter > 4.0 then
AnimationCounter := 0.0;
とかして、増分後にリセットしとくのを忘れずに。
忘れずにといえば、オブジェクトの解放もForm.CloseQueryあたりでこなしとくといいと思うよ。
さ、だんだんおもしろくなってきたぞ。
画像は静止してるけど、実際には画面内を回転しながらぴょこぴょこ動いてます(笑)
回転じゃなく、キーボードの指示に合わせて画面内を移動するとかさせたら、もう3次元空間を歩き回るアプリケーションは出来上がりになるわけか。
つくづくQuadrupleDの強力さには驚かされるね。
0 件のコメント:
コメントを投稿