Ваш код имеет ряд проблем.Итак, я собираюсь пройтись по ним, в дополнение к ответу на ваш настоящий вопрос.Во-первых,
D3DXVECTOR3 forceAndVelocity = mTotalForces + m_vVelocity;
неверно, поскольку сила и скорость концептуально очень разные.Это воплощено в их разных единицах, поэтому их нельзя добавить.Со следующей строки,
float fVelocityMagnitude = sqrt((forceAndVelocity.x * forceAndVelocity.x) + ...
Я полагаю, вы хотите, чтобы forceAndVelocity
была строго скоростной.
Я бы переделал первый оператор if
следующим образом:
float fFrictionCoefficient = 0.0f;
if(fVelocityMagnitude == 0.0f)
{
float fFrictionCoefficient = m_fStaticFrictionCoefficient;
}
else if(fVelocityMagnitude > 0.0f)
{
float fFrictionCoefficient = m_fKineticFrictionCoefficient;
}
Я отбросил векторные вычисления, поскольку они были параллельны нормали, а не перпендикулярны.
Величина трения - это коэффициент трения, умноженный на величину нормальной силы, поэтому
float fFrictionForceMagnitude = fFrictionCoefficient
* sqrt(D3DXVec3Dot(&vSurfaceNormal, &vSurfaceNormal));
Во втором выражении if
вы снова сравниваете силу и скорость и то, что вы пытаетесьсделать, это определить, когда статическое трение может быть преодолено.По сути, вам необходимо определить, все ли силы превышают трение, поэтому вам нужно сравнить величину суммарных сил без трения с величиной силы трения.Итак, я бы повторил блок if
как
float fForceMagnitude = sqrt(D3DXVec3Dot(&mTotalForces, &mTotalForces));
if(fFrictionForceMagnitude > fForceMagnitude)
{
float m_vVelocity = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
}
else
{
float mTotalForces -= fFrictionForceMagnitude * m_vVelocity / fVelocityMagnitude;
}
, где последняя строка является ответом на ваш вопрос.Сила трения противостоит скорости, поэтому она противоположна вашей скорости, где m_vVelocity / fVelocityMagnitude
- нормализованная скорость.Обратите внимание, что это напрямую не влияет на скорость, вместо этого ваша скорость равна
D3DXVECTOR3 m_vVelocity = mTotalForces * time / mass;
, где mass
- масса объекта;