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émvelocitycomo 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>

questionAnswers(6)

yourAnswerToTheQuestion