//----------------------------------------------------------------------------- // Name: Bound::Collide // Desc: collides this bound with a sphere //----------------------------------------------------------------------------- BOOL Bound::Collide( const Sphere& Sphere ) const { switch( m_Type ) { case Bound::Sphere_Bound: return IntersectSphereSphere( &GetSphere(), &Sphere ); case Bound::Frustum_Bound: return ( BOOL )IntersectSphereFrustum( &Sphere, &GetFrustum() ); case Bound::OBB_Bound: return IntersectSphereOrientedBox( &Sphere, &GetObb() ); case Bound::AABB_Bound: return IntersectSphereAxisAlignedBox( &Sphere, &GetAabb() ); case Bound::No_Bound: return TRUE; } return FALSE; }
BOOL cCollision::CollisionSphereSphere( cSphere& SphereA,D3DXVECTOR3& vecA,cSphere& SphereB,D3DXVECTOR3& vecB ) { //둘다 멈춰있는 구라면 float LengthSqA=D3DXVec3LengthSq(&vecA); float LengthSqB=D3DXVec3LengthSq(&vecB); if ((LengthSqA==0)&&(LengthSqB==0)) { // 그냥 겹침검사 return IntersectSphereSphere(SphereA,SphereB); } cLine LineA,LineB; // float CrossTA,CrossTB; if ((LengthSqA!=0.0f)&&(LengthSqB!=0.0f)) { LineA.Make(SphereA.GetCenterPos(),SphereA.GetCenterPos()+vecA); LineB.Make(SphereB.GetCenterPos(),SphereB.GetCenterPos()+vecB); LineA.GetDirection(); } else if (LengthSqA==0.0f) { LineB.Make(SphereB.GetCenterPos(),SphereB.GetCenterPos()+vecB); } else { LineA.Make(SphereA.GetCenterPos(),SphereA.GetCenterPos()+vecA); } // IntersectLineSphere() return TRUE; }