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>