9.02.2008

結論:標準で提供されているのを使うのが楽。

昨晩考えたことについては、表題のような結論に達しました(笑)

さて、そんなわけで今日は六角大王のモデルデータを動かしてみるという話。

コードは昨日のを流用するとして、どこかから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 件のコメント: