- bool Ball::SphereCollision(Ball *pBall,float time,CVector3 *norm)
- {
- // pos = Mittelpunkt von B
- CVector3 pos = pBall->GetPos();
- // rad = erhöhter Radius von B
- float rad = m_fRadius + pBall->GetRadius();
- float r2 = rad * rad;
- // dir = normalisierter Richtungsvektor des Strahls
- CVector3 dir = m_vVelocity;
- float length = dir.GetLength();
- dir.Normalize();
- CVector3 vL = pos - m_vPos;
- float l2 = vL * vL;
- if(l2 <= r2)
- {
- norm->Set(vL);
- return true;
- }
- float tca = dir * vL;
- if(tca < 0.0f)
- return false;
- float d2 = l2 - tca * tca;
- if(d2 > r2)
- return false;
- // t = Kollisionszeitpunkt
- float t = tca - sqrt(r2 - d2);
- if(t > length * time)
- return false;
- // gibt den Vektor vom Kollisionspunkt zum Mittelpunkt von P zurück
- norm->Set(pos - (m_vPos + dir * t));
- return true;
- }