C言語で3Dを勉強 -14 | 2010.03.06 17:43 |
▲ 開始時に明らかに何かを間違えたブリーフィング画面を付けました。
上と下の文に、XOPSの独特フォントをひそかに使ってます。
(下記の本文とは関係なし)
2月下旬、DirectXの当たり判定の基礎根本を勉強するべく資料を探していた所、
以下のようなサイトを発見。
「泥巣」 http://claybird.sakura.ne.jp/
>FPSつくるよ! http://claybird.sakura.ne.jp/making/fps/
早速、運営元のClaybirdさんに問い合わせ、DirectXの当たり判定について
相談に乗って頂けないか聞いたところ、あっさりOKしてくれました。
幸いにもClaybirdさんもXOPSをご存知だったので、話やすかったのはもちろんですが、
わざわざXOPSの当たり判定とブロックデータの概念について、研究してくださいました。
本当にありがとうございます。
とりあえず、分かった(教えて頂いた)事を出来るだけ多くここに記しておきます。
A、nine-twoさんが「ブロックデータ」の概念を取り入れた理由
1、当たり判定の単純化と高速化
当たり判定を行う際、マップ上の全オブジェクトと判定を行うと非効率なため、
詳細な判定の前に、各オブジェクトを包む境界ボックスを生成し、荒い判定を行う。
オブジェクトが小さく分割されていると、基本的に荒い判定で除外される部分が
増え、詳細な判定の回数を減らせる。
普通のXファイルのメッシュを使っていると、この「荒い判定」で除外できる部分が
少ないが、XOPSのブロックはそれぞれが独立したオブジェクトなので、
「荒い判定」の効率が良く、速度を稼げている。
2、表示が速い。
3、データの読み込みが速い。
(私は2・3については全く知りませんでした)
結論として、表現出来る形状を制限する代わりに処理速度を稼ぐといった
観点から、ブロックデータを採用した可能性が高い。
B、人とマップとの当たり判定の計算方法
ブロックは六面体で各面は平面だと仮定する。
(よって、面が少しでも歪めば計算から除外する)
マップとの判定は、全部レイ(見えない光線)を使って判定する。
ここからは、教えて頂いた事を参考に自分なりに考えた方法を解説。
障害物/斜面を処理した後、重力計算で地面を求める。地面か壁かを実質区別する。
リアルタイムではなく、移動時にのみ計算する。
プレイヤーの前後左右の4方向に対してそれぞれレイを生成し、
接触時、物理のボールの跳ね返り(=反射)を応用して、壁に斜めに侵入した時の
横滑りを手動算出する。
以下のサイトの「3.座標軸に平行でないものに衝突した場合」を参考に3Dに応用。
http://www5f.biglobe.ne.jp/~kenmo/program/buturi5/buturi5.html
壁の計算を行ったあとに、重力を計算し地面を求めて移動する。
・・・(自分の文が)日本語でおkな上に、Claybirdさんの方法とは全く異なる方法で計算です。
わざわざ教えて頂いたのに申し訳ないです。
C、人と人との当たり判定の計算方法
単純に垂直な円柱。
人とマップとの当たり判定の計算方法については、やっと自分で満足のできる
「仮」物が完成しました。
後日高速化・最適化に取り組みます。
最後に、Claybirdさんに感謝いたします。ありがとうございました。
A、nine-twoさんが「ブロックデータ」の概念を取り入れた理由
1、当たり判定の単純化と高速化
当たり判定を行う際、マップ上の全オブジェクトと判定を行うと非効率なため、
詳細な判定の前に、各オブジェクトを包む境界ボックスを生成し、荒い判定を行う。
オブジェクトが小さく分割されていると、基本的に荒い判定で除外される部分が
増え、詳細な判定の回数を減らせる。
普通のXファイルのメッシュを使っていると、この「荒い判定」で除外できる部分が
少ないが、XOPSのブロックはそれぞれが独立したオブジェクトなので、
「荒い判定」の効率が良く、速度を稼げている。
2、表示が速い。
3、データの読み込みが速い。
(私は2・3については全く知りませんでした)
結論として、表現出来る形状を制限する代わりに処理速度を稼ぐといった
観点から、ブロックデータを採用した可能性が高い。
B、人とマップとの当たり判定の計算方法
ブロックは六面体で各面は平面だと仮定する。
(よって、面が少しでも歪めば計算から除外する)
マップとの判定は、全部レイ(見えない光線)を使って判定する。
ここからは、教えて頂いた事を参考に自分なりに考えた方法を解説。
障害物/斜面を処理した後、重力計算で地面を求める。地面か壁かを実質区別する。
リアルタイムではなく、移動時にのみ計算する。
プレイヤーの前後左右の4方向に対してそれぞれレイを生成し、
接触時、物理のボールの跳ね返り(=反射)を応用して、壁に斜めに侵入した時の
横滑りを手動算出する。
以下のサイトの「3.座標軸に平行でないものに衝突した場合」を参考に3Dに応用。
http://www5f.biglobe.ne.jp/~kenmo/program/buturi5/buturi5.html
壁の計算を行ったあとに、重力を計算し地面を求めて移動する。
・・・(自分の文が)日本語でおkな上に、Claybirdさんの方法とは全く異なる方法で計算です。
わざわざ教えて頂いたのに申し訳ないです。
C、人と人との当たり判定の計算方法
単純に垂直な円柱。
人とマップとの当たり判定の計算方法については、やっと自分で満足のできる
「仮」物が完成しました。
後日高速化・最適化に取り組みます。
最後に、Claybirdさんに感謝いたします。ありがとうございました。
category : ソフト・ツール開発 | comment [1] trackback [] |