我一直在研究如何施加摩擦力,但我遇到了一个难题,就是如何将摩擦力应用于速度(如果我正确计算了摩擦力的话)。
当我把球放在一个法线为(0,1,0)、当前速度为(2,0,0)的表面上时,我会将我的摩擦力计算为(0,-0.3,0)。然而,我不明白如何正确地将其应用于我的速度。如果我简单地减去它,那么我的速度将变为(2,-0.3,0),但是,难道不应该是使x分量更小吗?
这是我的当前代码,如果有人能看一下,我将非常感激。我知道还有一些优化需要做。
当我把球放在一个法线为(0,1,0)、当前速度为(2,0,0)的表面上时,我会将我的摩擦力计算为(0,-0.3,0)。然而,我不明白如何正确地将其应用于我的速度。如果我简单地减去它,那么我的速度将变为(2,-0.3,0),但是,难道不应该是使x分量更小吗?
这是我的当前代码,如果有人能看一下,我将非常感激。我知道还有一些优化需要做。
mTotalForces = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 vSurfaceNormalized;
D3DXVec3Normalize(&vSurfaceNormalized, &vSurfaceNormal);
D3DXVECTOR3 vFrictionForce(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 forceAndVelocity = mTotalForces + m_vVelocity;
float fVelocityMagnitude = sqrt((forceAndVelocity.x * forceAndVelocity.x) + (forceAndVelocity.y * forceAndVelocity.y) + forceAndVelocity.z * (forceAndVelocity.z));
float fFrictionForceMagnitude = 0.0f;
float fFrictionForce = 0.0f;
if(fVelocityMagnitude == 0.0f)
{
fFrictionForce = m_fStaticFrictionCoefficient;
D3DXVECTOR3 vStaticFriction = -m_fStaticFrictionCoefficient * vSurfaceNormalized;
vFrictionForce = vStaticFriction;
}
else if(fVelocityMagnitude > 0.0f)
{
fFrictionForce = m_fKineticFrictionCoefficient;
D3DXVECTOR3 vKineticFriction = -m_fKineticFrictionCoefficient * vSurfaceNormalized;
vFrictionForce = vKineticFriction;
}
{
float fFrictionForceMagnitude = abs(fFrictionForce * D3DXVec3Dot(&vSurfaceNormalized, &forceAndVelocity));
if(fFrictionForceMagnitude > fVelocityMagnitude)
{
fFrictionForceMagnitude = 0.0f;
m_vVelocity = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
}
else
{
m_vVelocity -= vFrictionForce;
}
}
在这个摩擦函数的开始处,我将总力归零,因为如果有摩擦,前面的力(重力)就不应该影响后面的速度。(是吧?)