Determinando o contato de repouso entre esfera e plano ao usar forças externas
Esta questão tem uma questão importante e uma questão menor. Acredito que estou certo em qualquer pergunta da minha pesquisa, mas não em ambos.
Para o meu ciclo de física, a primeira coisa que faço é aplicar uma força gravitacional ao meuTotalForce
para um objeto de corpo rígido. Eu então procuro por colisões usando meuTotalForce
e meuVelocity
. MinhasTotalForce
é redefinido para(0, 0, 0)
depois de cada loop de física, embora eu vou manter o meuvelocity
.
Estou familiarizado com a realização de uma verificação de colisão entre uma esfera móvel e um plano estático ao usar apenas velocidade. No entanto, e se eu tiver outras forças alémvelocity
como a gravidade? Eu coloquei as outras forças emTotalForces
(agora eu só tenho gravidade). Para compensar isso, quando eu determinar que a esfera não está sobrepondo o plano, eu faço
<code> Vector3 forces = (sphereTotalForces + sphereVelocity); Vector3 forcesDT = forces * fElapsedTime; float denom = Vec3Dot(&plane->GetNormal(), &forces); </code>
No entanto, isso pode ser problemático para como eu pensava que deveria estar em contato de repouso. Eu pensei que o contato de repouso fosse computado por
<code>denom * dist == 0.0f </code>
Ondedist
é
<code>float dist = Vec3Dot(&plane->GetNormal(), &spherePosition) - plane->d; </code>
(Para referência, o óbviodenom * dist > 0.0f
significando que a esfera está se afastando do plano)
No entanto, isso nunca pode ser verdade. Mesmo quando parece haver "contato em repouso". Isso é devido ao meuforces
cálculo acima sempre tendo pelo menos um .y de -9.8 (minha gravidade). Quando ao mover-se em direção a um avião com uma normal de (0, 1, 0) produzirá um y dedenom
de -9,8.
Minha pergunta é
1) Estou calculando corretamente o contato de repouso com a maneira como mencionei com meus dois primeiros trechos de código?
Se então,
2) Como minhas "outras forças", como a gravidade, deveriam ser usadas? Meu uso deTotalForces
incorreta?
Para referência, meu timestep é
<code> mAcceleration = mTotalForces / mMass; mVelocity += mAcceleration * fElapsedTime; Vector3 translation = (mVelocity * fElapsedTime); </code>
EDITAR
Como parece que algumas mudanças sugeridas vão mudar o meu código de colisão, aqui está como eu detecto meus estados de colisão
<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>