当たり判定とか -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法(だったっけ?)とかもあるけど割愛