スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

"アニメーション"まであと少しかもしれない

今、DirectXのサンプルが理解できなかったので、
「自前で メッシュを読み込み、
  アニメーションをするクラスを作ってしまえ!」

という作戦に出ているわけですが、

結構、作業が進んできました。
(サンプルが理解できないというより、
    いっそ自分で作ったほうが効率が良いんじゃないかと感じた。)


とりあえず 今のところ、
---------------------------------------------------------
【1】Frameの階層構造を読み込む
【2】自己参照型構造体で、階層構造を動的に実現
【3】それぞれのMeshデータ、座標変換行列を格納。
【4】座標変換行列に従って、画面に表示   ←New!

---------------------------------------------------------
ここまで行きました。

↓描画に成功した画像はこちら

【実行画面】
座標変換行列で表示

そして、読み込んだXファイルの大まかな構造。
-----------------------------------------------------------
Frame Cylinder   //円柱
{

FrameTransformMatrix { 単位行列 }
Mesh { 頂点座標などの情報 }
Frame Box //立方体
{

FrameTransformMatrix { x座標に2、y座標に2移動する行列 }
Mesh { 頂点座標などの情報 }
Frame Cone //円錐
{

FrameTransformMatrix { x座標に-2移動する行列 }
Mesh { 頂点座標などの情報 }
}
}
}

-----------------------------------------------------------

最後に、描画する部分のコードはこんな感じ。
-----------------------------------------------------------------------

void Mesh::DrawMesh(NODE* p)
{
if(p->Index != NULL){
Device->SetTransform( D3DTS_WORLD, &p->mat );
Device->SetFVF(MY_FVF_VERTEX3);
for(int i = 0, count = p->IndexNum; i < count; i++){
Device->SetMaterial(&p->m.material[p->m.mIndex[i]]);
Device->SetTexture(0, p->m.Texture[p->m.mIndex[i]]);
Device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,p->Index[i].TriangleNum,p->Index[i].v3,sizeof(MY_VERTEX3));
}
}
if(p->Brother != NULL){
DrawMesh(p->Brother);
}
if(p->Child != NULL){
DrawMesh(p->Child);
}
}
-----------------------------------------------------------------------
※見て分かるとおり、まだマテリアルごとにソートしておりません。
(今は、インデックスの順番どおりに描画してます。)

あとで修正しようかな。



まぁ、ともかく、それぞれのFrameが持っている座標変換行列をもとに表示させる
という事は出来ました。

で、これからの課題
「アニメーションをするにはどうすればいいのか?」というのは、簡単。
座標変換行列を更新すればよいのです。

例えば、下記の様に行列を書き換えていけば、
------------------------------------------------
【1】x座標がの場所に移動する行列
【2】x座標がの場所に移動する行列
【3】x座標がの場所に移動する行列

------------------------------------------------
3Dモデルが左に動いて見えます。

まぁ、考え方(やり方)は簡単に分かりますが、
それを実装するのがまた面倒な感じがする。


アニメーションの情報は、以前書いたようにこんな感じで定義されています。
---------------------------------------------------------
AnimationSet AnimationSet1
{
Animation Animation1
{
{Box}
AnimationKey
{
2; // Position
3;
0;3; 0.000000,0.000000,0.000000;;,
120;3; 0.500000,0.000000,0.000000;;,
240;3; 0.000000,0.000000,0.000000;;,
}
}
}

---------------------------------------------------------
この情報を元に、
適宜 指定された時間に行列を更新するシステム
を作らねばならない。

まぁ、アニメーションまでもう少し、と言う段階まで来ているような気がするので、
頑張りたいと思います。(`・ω・´;)
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

No title

そちらの現状はあまり理解していないのですが、回転行列はまだ使わないのでしょうか?

No title

あっ回転行列やスケール変換も 問題なく実行できましたよv-290
(座標のオフセットが一番分かりやすい&やりやすいので、
                オフセットのみを例として取り上げました)

回転の方は、
例えば、Y座標を軸として約45度 回転させる行列

下記の様に定義して描画したところ、問題なく表示されました。
------------------------------------------------
0.707106, 0.0, -0.707106, 0.0,
0.0,1.0, 0.0, 0.0,
0.707106, 0.0, 0.707106, 0.0,
0.0, 0.0, 0.0, 1.0
------------------------------------------------
(回転行列は 手計算が多少面倒です

【追記】
回転行列を生成するプログラムをデバッグ実行して、
値を見れば良いことに気付きました。
(手計算しなくて良い)

あとAnimationを定義しているほうは、
どうやら四元数を使っているみたいなので、
回転行列ではなく、
キーフレームの前と後のクォータニオンを生成して、
D3DXQuaternionSlerp関数で補間出来ないかな、と思ってます。
(どの道、最終的には行列に直すのですが)

No title

 そうそう、回転行列を使うと物体をXYZ軸に対して回転するのはいいのですが、カメラから見たY軸とかに回転させようとするとどの様に計算すればいいのか、まったく見当がつかないので困っていました。

 クォータニオンについて詳しく解説している、よさげなサイトとか知りませんか?

No title

アニメーションは物体の角度や位置を予め決めておいてそれを順番に表示していく仕組みだったのですね。

No title

自分も、クォータニオンの解説をしているサイトを
探した事はあるのですが、なかなか「コレはわかりやすい!」というのは
見当たらないですね。
(そもそも四元数自体が 複雑なものですし)

一応、前に検索して参考にしたサイトを載せてみますv-290

http://staff.aist.go.jp/toru-nakata/quaternion.html
http://www.arakin.dyndns.org/gl_torusquat.php
http://msdn.microsoft.com/ja-jp/academic/cc998621.aspx
http://marupeke296.com/DXG_No10_Quaternion.html

あと書籍だと、 「ゲーム3D数学」というのが根底となる理論や証明の方法など
細かく解説していると思います。
(行列 → 四元数、オイラー角→行列、の変換方法なども色々と載ってたり)

最後に、カメラの角度に対応した回転は
D3DXQuaternionRotationAxis関数が使えるのではないでしょうか?
回転軸の方向ベクトル と 回転角度 を指定すれば、
任意軸周りに回転するクォータニオンが生成されます。

【1】カメラの方向ベクトルを求めて、D3DXVECTOR3型の変数に入れる
【2】D3DXQuaternionRotationAxis関数でクォータニオン生成
【3】D3DXMatrixRotationQuaternion関数で、クォータニオンから行列生成

試してはいないのですが、多分コレでいけるんじゃないかなーとv-293

No title

URLありがとうございます参考にしてみます。
言語はActionScript3.0を使ってました・
DirectXは使う予定が今のところ無いですし、わからないです、ごめんなさい。

No title

おぉそうでしたかe-451
ActionScriptは使ったことが無いので、自分も分からないですねv-293

それにしても、3Dとかになると物凄く複雑になるなぁと実感します。
コメントの投稿
管理者にだけ表示を許可する



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。