前回から大分時間が経ちましたがまたDirectXなプログラミングネタです。とりあえず、以下のような機能ができあがりました。
- 世界が広がった。
- 人が降り立った。
前回の舞台は100×100ポリゴン(実際にポリゴンは三角形なので、1×1の中には2枚のポリゴンが居ます)でしたが、今回は1000×1000ポリゴンです。
…と簡単に書きましたが、ここでいろいろやっています。まず、1000×1000のフィールドデータを一つ一つ作るのは面倒なので、お絵かきツールで地図を描いてそれを読み込むっていうのをまずやりました。まぁ、そこは難しくないけどね。
さらに、地平線の彼方にメモリを食われるのは勿体ないので、それを分割して、ある程度移動する毎に必要なデータを読み込むという処理をしています。簡単に書いたけど、案外計算が面倒です。
なので、データさえ作れば1000×1000以上も余裕で可能。さらに、フィールドデータの無いエリアを越えるとどうなるかというと、永遠と海が続きます。見えない壁にぶつかるのは虚しいですからね。
あとは、読み込む時に一瞬止まるので、データ読み込みとかを別スレッドで動かせればなぁと考えつつ、まだやってません。
「人」は、身動きしないモデルデータを読み込むのは簡単だけど、アニメーションするモデル(歩いたり走ったり)を処理するのはちょっと大変でした。次はたとえば剣を持ったら剣を表示とか、そういうオブジェクトの合成を考えないと…って感じ。
その辺まで出来れば、木とか建物とかのオブジェクトを管理するモジュールを作って、仮想世界の中にばらまけばソレっぽくなるかな。
ちなみに、この仮想世界の中でカメラを動かせますが、そこにもいくつか問題があります。たとえば、マウスをクリックするとそこに移動とか。
3Dモデルは、適当に3次元のベクトル座標を食わせれば、内部で擬似的に3D空間を作りつつ、カメラの位置にあわせで2Dに変換して画面へ表現するってことをほぼ自動でやってくれます。
しかし、2D空間でクリックした場合、それを3次元空間に変換して、クリックされたのは目の前のオブジェクトか、先のオブジェクトか〜なんて判定をしてやらないとなりません。…これってどうやるんだろう?(^^;
あと、キャラクターの移動は単純に考えています。マビノギや、リネージュ、FFXIのようにスムーズにどこでも移動とは考えていません。仮想空間の中に擬似的に50cm四方の「マス」が存在していて、そこに移動します。つまり、ラグナロクオンラインみたいに、移動先は四角いマスの中になります。しかも、8方向の移動しか考えてません。
リアリティには欠けるけど、その先にある、人と人、人と物の衝突判定は、その50cm四方だけを考えればいいので、処理的には全然楽になります。
いろいろ書いたけど、まぁまだまだやることはいっぱいあるって感じ。



Leave a Reply