« 初期状態の変更 | メイン | 終端フレーム関係の問題 »

2004年12月25日

Teaspire 開発日誌:: ナビゲーションメッシュの導入

    

単純に、床のメッシュに対して、D3DXIntersectを使って、キャラクターの移動位置のY 1.0から Y -1.0へレイを飛ばして当り判定をすれば、移動範囲を制限できるかと思いきや、g_pMeshFloorがWriteOnlyを指定して生成時されていたため、D3DXIntersect が失敗を返していた。
そこで、ナビゲーションメッシュ専用のメッシュを作り、pMeshFloorと同じものをセット。
これでうまくいくと思ったけど、レイが当たらないと返ってくる。
なぜ?
g_pMeshFloorにテクスチャ座標を設定しているところでブレイクを張り、ポリゴンの座標を見ると、X-Y平面上にポリゴンが生成されていた。
これでは当たるはずがない。
でも、描画時はX-Z平面上に描かれている。
コードを追うと、どうやら描画前にトランスフォームされている様子。
そこで、ナビゲーションメッシュを生成時にトランスフォームすることにした。
トランスフォームは単純に、ポリゴンの各頂点座標をD3DXVec3TransformCoordで、g_pMeshFloorが描画される前に使われるマトリックスで変換するだけ。
でも、g_pMeshFloorが描画される前に使われるマトリックスはD3DXMATRIXA16とか言うやつで、D3DXMATRIXじゃないからだめと言われた。
D3DXMATRIXA16は、効率を上げるために16バイトでアライメントされたD3DXMATRIXだそうだ。 ( SSEとか用ですな。でも、これってDirectX9から追加されたのか? 前からあった? )
で、単純にD3DXMATRIXA16をD3DXMATRIXに代入して、それを渡すようにしたらコンパイルが通った。
レイの当り判定もうまくいった。
が、なぜかまったく移動できない。
IsOutOfBoundsを見ると、論理が逆だった。
関数名からしたら、領域外かどうかを判定するもののようだけど、気分的には領域内にあって移動できるかどうかを判定したいので、気づかなかった。
で、逆にするとうまくいった。
これで、とりあえず平面上は歩けるようになった。

次は、ちょっとg_pMeshFloorが描画される前に使われるマトリックス周りを追いたいところ。ナビゲーションメッシュを外部のファイルから読むためにも。
他にも、CTinyを少し汎用化したい。
徐々に汎用化していかないと。



投稿者 Takenori : 2004年12月25日 05:08




comments powered by Disqus
Total : Today : Yesterday : なかのひと