Определение покоящегося контакта между сферой и плоскостью при использовании внешних сил

В этом вопросе есть один главный вопрос и один второстепенный вопрос. Я считаю, что я прав в любом вопросе из моего исследования, но не в обоих.

Для моего цикла физики первое, что я делаю, это применяю гравитационную силу к моей TotalForceдля объекта с твердым телом. Затем я проверяю столкновения, используя TotalForceи Velocity. Мой TotalForceсбрасывается на (0, 0, 0)после каждого физического цикла, хотя я сохраняю скорость.

Я знаком с проверкой столкновений между движущейся сферой и неподвижной плоскостью при использовании только скорости. Однако что, если у меня есть другие силы помимо скорости, такие как гравитация? Остальные силы я вложил в TotalForces(сейчас у меня есть только гравитация). Чтобы компенсировать это, когда я определяю, что сфера в настоящее время не перекрывает плоскость, я делаю

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

. Я думал, что контакт в состоянии покоя вычисляется по формуле

denom * dist == 0.0f

, где distравно

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

(для справки, очевидное denom * dist > 0.0fозначает, что сфера удаляется от плоскости)

Однако это никогда не может быть правдой. Даже когда кажется, что есть «отдыхающий контакт».Это происходит из-за того, что мой расчет силвыше всегда имеет по крайней мере y равное -9,8 (моя гравитация). При движении к плоскости с нормалью (0, 1, 0) значение y будет равно denomравному -9,8.

Мой вопрос:

1) Правильно ли я вычисляю контакт в состоянии покоя, как я упомянул в своих первых двух фрагментах кода?

Если да,

2) Как следует использовать мои "другие силы", такие как гравитация? Является ли мое использование TotalForcesнеправильным?

Для справки, мой временной шаг:

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

РЕДАКТИРОВАТЬ

Поскольку кажется, что некоторые предлагаемые изменения изменят мой код столкновения, вот как я определяю свои состояния столкновения

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;
    }
}
9
задан mmurphy 4 May 2012 в 01:23
поделиться