My Daily Programming Life...

DirectX

昨日、たまたま久しぶりにJuggleMasterを見た。Webページのリンクたどっていったら、DOS版のやつがあって、ソースも一緒にあった。

んで、ソースを読んでいてなとなく頭の中に出てきたのが、たしかナランハでもこんなソフト売ってたよなぁ、3Dのやつ → そういえば3Dの物体が動くようなプログラムは作ったことがないなぁ → DirectXか・・・

ということで、さっそくDirectX SDKをダウンロード。COMの知識もそれほどないけど、使うだけなら簡単。それっぽいメソッドを呼び出せば勝手にオブジェクトは作られる。

とはいってもDirectXはまったくの初めて。最初は画面に何か表示することすらできず・・・

そしていろいろ悩みながら、途中グローバル変数だと思ってアクセスしていた変数がローカル変数だったなんていうやってはいけないようなミスをしながら、2時間ほどでまずは画面表示ができた。できた画面がこれw

DX1.gif
普通のウィンドウじゃん!・・・全くその通り。でもこの色が重要。この色はDirectXで書いたものなのです!正確にはバックグラウンドを設定したということ。プログラミングやってるとこの瞬間が楽しい。

ここまででDirectX初期化の基本的なやり方は理解。んじゃ、次は3Dボールを描こう・・・と思った僕が間違ってました。ボールなんてきっとAPIにボールみたいなオブジェクトがあって、それ作って貼り付ければ・・・って思ったのに全然違った。

メッシュってなにさ?頂点バッファって・・・テクスチャを貼り付ける・・・どうやるの?まあ、そこまで一足飛びにやろうとして、意味の分からないことだらけ。ということでドキュメントを読んで基本から。

3D座標系には右手系と左手系があるだの、3Dプリミティブだの、頂点法線ベクトルだのいろいろ言葉を学びながらやっていった。3Dオブジェクトを いきなり描くのは大変そうだったので、とりあえず3次元上にある2Dオブジェクトを描画することに。頂点の座標を3つ(全部XY平面上でZは0)を頂点 バッファなるものに入れて、それを描画させる。三角形ができるはず。いろいろ試行錯誤しながらできた。

んじゃ次はこれを動かそう。座標変換を行って、それを元に回転やら移動やらをさせる・・・わけですが、その前に座標についてかなり分け分からなくなった。

頂点を表現するのには、未座標変換済みと、座標変換済みとがあるらしい。さっき描いた三角形は座標変換済みを使った。だから直接画面の座標をそのま ま入れればよかったらしい。でも今度は違うらしい。動かすために座標変換を行うから、座標変換済みではいけないらしい。なんかここら辺はよく分からない。 座標にRHWっていう値を持たせると座標変換済みになるらしい。同次座標ベクトルベクトルってのが関係してるらしいんだけど、RHWとか・・・意味分かん ない。

とりあえず、そこは飛ばして、サンプルを見ながらなんとなく作成。少しずつ分かってきた。とりあえず今はRHWとかは無視してよさそう。

他にもポリゴンの表面と裏面の両方を描くようにするためのカリングモードの変更だとか、ライトのOn Off(今回はOffで色は自分で付ける。)だとか、サンプルをいろいろいじりながらやっていった。

とにかく3Dオブジェクト一つ描くにもそうとういろんなことやらなくてはいけなくて大変。今日は3次元空間に平面の3角形を書いて、それをY軸を中心にぐるぐる回し、それを斜め45度に視点を回転して眺めるというところまでやった。

DX2.gif
画像だから止まっているけど、本物のウィンドウでは斜め方向にこの3角形が回転している。

次はもう少し3Dオブジェクトっぽいものを作って、ライトを使うようにしよう。そうすれば少しは3Dグラフィックっぽくなるはずだ。

とりあえず最終的な目標はボールを作って、それを弾ませるアニメーションを作るところまで。

0 コメント:

Post a Comment

feedSubscribe to my feed