ゲームプログラム制作日記 ~レイ(光線)でのあたり判定~ | また-りプログラム日記

また-りプログラム日記

DirectXでの3Dゲームプログラムを中心に記事書いていきます~
言語は C++

Androidのプログラムも今後書く予定!?

こんにちは~(^◇^)

夏休みシーズンということで、自分も夏休み中にゲームを作ろうと思っております。

さっそく今週からいろいろプログラムを書き始めて

その中でもあたり判定にまず注目してみました。

あたり判定にもいろいろ種類があるのですが、

DirectXの関数群で用意されている D3DXIntersect関数 を使用した
レイ(光線)でのあたり判定について気づいたことなど書いていきたいと思います。



※解説ではないので説明を省いている部分もあります。

まず、D3DXIntersect関数 とは、レイがメッシュに当たるかどうかを判定する。(MSDN参考)

とのことです。。

文字だけじゃなかなか難しいですね。

私のイメージはこんな感じだと思いました。(あくまで私のイメージです
レイ衝突図1

この D3DXIntersect関数 を使用し今回のゲームでは

キャラクター と 地面 との あたり判定 を行い、地面 に キャラクター をきれいに立たせる!

という処理を行いたいと思います!

実装としてはこんなイメージです。 (あくまで私のイメージです



とりあえずプログラム書いてみました。



D3DXIntersect関数の詳しい引数に関してはMSDNで確認できます。

これでD3DXIntersect関数は使えているの思うのですが、
ちゃんとキャラクターが地面の上にきれいに乗っているのかが問題ですね。

ちなみに、D3DXIntersect関数 の実装処理を書かずにプログラムをするとこんな感じです。

キャラクターが見事に浮いてますね。。

実装してみるとどうなるでしょうか?

お!?

少し位置が変わってる!? 地面に乗っていそうな感じだ!

実際に数値も見てみると


pHit に 1 これはあたっているかどうかの有無を教えてくれます。1なのであたっています!

distance に 5.0・・・ これはレイを飛ばした位置からメッシュにあたった距離を教えてくれます

今回レイを飛ばした位置とキャラクターの位置を一緒にしています。

そんでもって今回のキャラクターと地面などの位置は・・


となっているので、distanceが5だったのでちゃんとメッシュとのあたり判定ができていますね~

あとは、プレイヤーの位置からdistanceの数値を引き、キャラクターの半径を足したら

やった~!これでキャラクターがちゃんと地面にのるぜ~!

ってことで見事実装できました!!


が!


最後に1つ!気になった点を!

D3DXIntersect関数 ではあくまでレイとメッシュとのあたり判定になります。

メッシュとのあたり判定になるのでプログラム上でモデル(今回だと地面)の位置を変えようが
意味がないみたいです。

私自身も引っかかっていたみたいで丸1日実装にかかったんです。。



これもイメージであらわすと・・・ (あくまで私のイメ・・・ry


わかりづらいですが、、

実際やってみるとわかると思います。

メッシュということでモデルデータを作る際の座標、大きさ(スケール値)、回転 などの情報がD3DXIntersect関数でのあたり判定行われると思うので、モデルデータ作成の時にあたり判定のことも考えながら作るといいですね!

ということでまたの更新を!アデュー(^-^)/