Określanie kontaktu spoczynkowego między kulą a płaszczyzną przy użyciu sił zewnętrznych

To pytanie ma jedno główne pytanie i jedno drobne pytanie. Wierzę, że mam rację w każdym pytaniu z moich badań, ale nie w obu.

W mojej pętli fizyki pierwszą rzeczą, jaką robię, jest zastosowanie siły grawitacyjnej na mojejTotalForce dla sztywnego obiektu ciała. Następnie sprawdzam kolizje za pomocą mojegoTotalForce i mójVelocity. MójTotalForce jest resetowany do(0, 0, 0) po każdej pętli fizyki, chociaż zachowam mojąvelocity.

Znam sprawdzenie kolizji między poruszającą się kulą a statyczną płaszczyzną, gdy używamy tylko prędkości. Jednak co, jeśli oprócz tego mam inne siłyvelocity, takie jak grawitacja? Wkładam inne siłyTotalForces (w tej chwili mam tylko grawitację). Aby to zrekompensować, stwierdzam, że sfera nie pokrywa się obecnie z samolotem

<code>    Vector3 forces = (sphereTotalForces + sphereVelocity);
    Vector3 forcesDT = forces * fElapsedTime;
    float denom = Vec3Dot(&plane->GetNormal(), &forces);
</code>

Jednak może to być problematyczne z punktu widzenia tego, jak przypuszczałem, że powinien to być kontakt spoczynkowy. Myślałem, że kontakt spoczynkowy został obliczony przez

<code>denom * dist == 0.0f
</code>

Gdziedist jest

<code>float dist = Vec3Dot(&plane->GetNormal(), &spherePosition) - plane->d;
</code>

(Dla odniesienia, oczywistedenom * dist > 0.0f co oznacza, że ​​kula oddala się od samolotu)

Jednak to nigdy nie może być prawdą. Nawet gdy wydaje się, że jest „kontakt spoczynkowy”. To z powodu mojegoforces obliczenia powyżej zawsze mające przynajmniej .y -9.8 (moja grawitacja). Kiedy podczas przesuwania w kierunku płaszczyzny o normalnej wartości (0, 1, 0) pojawi się ydenom -9.8.

Moje pytanie brzmi

1) Czy prawidłowo obliczam kontakt spoczynkowy z tym, o czym wspomniałem w moich pierwszych dwóch fragmentach kodu?

W takim razie,

2) W jaki sposób należy wykorzystywać moje „inne siły”, takie jak grawitacja? Czy moje wykorzystanieTotalForces błędny?

Dla odniesienia mój czas jest

<code>  mAcceleration = mTotalForces / mMass;
  mVelocity += mAcceleration * fElapsedTime;
  Vector3 translation = (mVelocity * fElapsedTime);
</code>

EDYTOWAĆ

Ponieważ wydaje się, że niektóre sugerowane zmiany zmienią mój kod kolizji, oto, w jaki sposób wykrywam stany kolizji

<code>if(fabs(dist) <= sphereRadius)
{ // There already is a collision }
else
{
    Vector3 forces = (sphereTotalForces + sphereVelocity);
    float denom = Vec3Dot(&plane->GetNormal(), &forces);

    // Resting contact
    if(dist == 0) { }
    // Sphere is moving away from plane
    else if(denom * dist > 0.0f) { }
    // There will eventually be a collision
    else
    {
        float fIntersectionTime = (sphereRadius - dist) / denom;
        float r;
        if(dist > 0.0f)
            r = sphereRadius;
        else
            r = -sphereRadius;

        Vector3 collisionPosition = spherePosition + fIntersectionTime * sphereVelocity - r * planeNormal;
    }
}
</code>

questionAnswers(6)

yourAnswerToTheQuestion