В этом вопросе есть один главный вопрос и один второстепенный вопрос. Я считаю, что я прав в любом вопросе из моего исследования, но не в обоих.
Для моего цикла физики первое, что я делаю, это применяю гравитационную силу к моей 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;
}
}