当たり判定とか -3D編-

 当たり判定方法といっても

・球-球

・矩形-矩形

・辺の法線の交差判定

・面の法線(レイ)の交差判定 + α

とかいろいろある*1わけですが、

今回は「球-球」で判定してみました。





 一応、採用した理由は、

(・(前提条件)気楽に使える判定は「球-球」「矩形-矩形」「辺の法線...」だったので、ここから選択)

・比較回数が少ない。

・大きさが「サイズ」のみでOK

・回転させても「矩形-矩形」より影響を受けない。

とかそのあたり。





で、実際に使っている比較式。


...
//// オブジェクト用基本構造体
typedef struct struct_PRIMARY_COL
{
float x, y, z; // 座標
float col_size; // サイズ
...
} PRIMARY_COL;
...

/*=====================================
接触判定
=====================================*/

int CollisionDetect( PRIMARY_COL *p1, PRIMARY_COL *p2 )
{
float dist_x = p2->x -p1->x, // 距離のx成分
dist_y = p2->y -p1->y, // 距離のy成分
dist_z = p2->z -p1->z; // 距離のz成分

// xz平面の距離の二乗
float dist_xz = (dist_x * dist_x) + (dist_z * dist_z),
// 接触判定用の距離
dist_limit = p1->col_size + p2->col_size;

// 三平方を使って、各成分から斜辺の長さを導出。
// 斜辺の長さは2オブジェクトのサイズ以下なら接触とする。
// (本来はsqrt()を使うが、二乗同士で判定すれば問題ないので省略)

if( dist_xz + (dist_y * dist_y) < dist_limit * dist_limit )
{
// 接触
return 1;
}
// 非接触
return 0;
}

 見てわかる通り、比較が一回しか入らないのが強み。

代わりに積算が大量に入るわけだけど、

多分比較に比べれば処理は軽い…はず。



 …浮動小数の積算になるし、

そもそも比較っていっても、比較演算子系がいわゆる「cmp」「test」あたりになるかの確認をそういえば取っていなかったので、

あんまり意味がないかもしれないけど…(汗)




*1:後、AABB法とかOBB法(だったっけ?)とかもあるけど割愛