球と三角形の衝突判定
Posted: 2006年10月21日(土) 01:19
こんにちは
球と三角形の衝突判定について質問させてください。C言語の質問というより数学の質問に近いかもしれませんが・・・。
DirectX8.0で球と三角形の衝突判定を行うプログラムを書いたのですがうまく動きません。
なぜか斜めに衝突した場合に衝突していても衝突していない判定が返ってしまいます。
衝突判定の方法ですが、まず平面と球の中心点の距離を求め、距離が半径より小さい場合は
平面上の点で円の中心に最も近い点を求め、最後にその点で三角形の内外判定を行います。
距離を出すところまでは問題ないようなので、それ以降の部分でおかしいところがあるのだと思うのですが、どうでしょうか。
一応、周辺のソースを書いておきます。
球と三角形の衝突判定について質問させてください。C言語の質問というより数学の質問に近いかもしれませんが・・・。
DirectX8.0で球と三角形の衝突判定を行うプログラムを書いたのですがうまく動きません。
なぜか斜めに衝突した場合に衝突していても衝突していない判定が返ってしまいます。
衝突判定の方法ですが、まず平面と球の中心点の距離を求め、距離が半径より小さい場合は
平面上の点で円の中心に最も近い点を求め、最後にその点で三角形の内外判定を行います。
距離を出すところまでは問題ないようなので、それ以降の部分でおかしいところがあるのだと思うのですが、どうでしょうか。
一応、周辺のソースを書いておきます。
bool ShpereTri (
D3DXVECTOR3& c, // 球の中心点
float r, // 球の半径
D3DXVECTOR3& t0, // 三角形の頂点1つ目
D3DXVECTOR3& t1, // 三角形の頂点2つ目
D3DXVECTOR3& t2, // 三角形の頂点3つ目
D3DXVECTOR3& p // 交点収納用
)
{
// 平面の法線ベクトルを求める
D3DXVECTOR3 n;
D3DXVECTOR3 v1 = t1 - t0;
D3DXVECTOR3 v2 = t2 - t0;
D3DXVec3Cross( &n, &v1, &v2 );
n /= D3DXVec3Length( &n );
// 平面と球の中心点の距離を求める
D3DXVECTOR3 vec = c - t0;
float ln = D3DXVec3Dot( &vec, &n );
// 距離が半径より大きい場合、衝突していない
if( fabsf( ln ) > r ) return false;
p = c - n * ln; // 平面上の、円の中心に最も近い点
bool point = true;
// 点から頂点へのベクトル
D3DXVECTOR3 v3 = t0 - p;
D3DXVECTOR3 v4 = t1 - p;
D3DXVECTOR3 v5 = t2 - p;
// 三角形の内外判定
D3DXVECTOR3 sm = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
D3DXVECTOR3 cp;
D3DXVec3Cross( &cp, &v3, &v4 );
if( D3DXVec3Dot( &sm, &cp ) < 0 ) point = false;
sm += cp;
D3DXVec3Cross( &cp, &v4, &v5 );
if( D3DXVec3Dot(&sm, &cp) < 0 ) point = false;
sm += cp;
D3DXVec3Cross( &cp, &v5, &v3 );
if(D3DXVec3Dot( &sm, &cp) < 0 ) point = false;
// 向きがすべて同じなので内側
if( point )return true;
return false;
}