94 lines
No EOL
3.4 KiB
C++
94 lines
No EOL
3.4 KiB
C++
#include "stdAfx.h"
|
|
#include "VelocityFunc.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
|
|
#endif
|
|
|
|
float CalcMovementToTargetTime( float &fCurSpeed, float fElapsedTime, float fTargetSpeed, float fAccel )
|
|
{
|
|
float fFinalSpeed, fMovement, fDiffTime;
|
|
|
|
fElapsedTime *= 1.f;
|
|
|
|
fFinalSpeed = fCurSpeed + fElapsedTime * fAccel;
|
|
if( ( fFinalSpeed > fTargetSpeed ) && ( fCurSpeed <= fTargetSpeed ) )
|
|
{
|
|
fDiffTime = ( fTargetSpeed - fCurSpeed ) / ( fFinalSpeed - fCurSpeed ) * fElapsedTime;
|
|
fMovement = fCurSpeed * fDiffTime + fAccel * fDiffTime * fDiffTime * 0.5f;
|
|
fCurSpeed = fTargetSpeed;
|
|
}
|
|
else if( ( fFinalSpeed < fTargetSpeed ) && ( fCurSpeed >= fTargetSpeed ) )
|
|
{
|
|
fDiffTime = ( fCurSpeed - fTargetSpeed ) / ( fCurSpeed - fFinalSpeed ) * fElapsedTime;
|
|
fMovement = fCurSpeed * fDiffTime + fAccel * fDiffTime * fDiffTime * 0.5f;
|
|
fCurSpeed = fTargetSpeed;
|
|
}
|
|
else
|
|
{
|
|
fMovement = fCurSpeed * fElapsedTime + fAccel * fElapsedTime * fElapsedTime * 0.5f;
|
|
fCurSpeed = fFinalSpeed;
|
|
}
|
|
|
|
return fMovement * 100.f;
|
|
}
|
|
|
|
float CalcMovement( float &fCurSpeed, float fElapsedTime, float fMaxSpeed, float fMinSpeed, float fAccel )
|
|
{
|
|
float fFinalSpeed, fMovement, fDiffTime;
|
|
|
|
fElapsedTime *= 1.f;
|
|
|
|
fFinalSpeed = fCurSpeed + fElapsedTime * fAccel;
|
|
if( ( fFinalSpeed > fMaxSpeed ) && ( fCurSpeed <= fMaxSpeed ) )
|
|
{
|
|
fDiffTime = ( fMaxSpeed - fCurSpeed ) / ( fFinalSpeed - fCurSpeed ) * fElapsedTime;
|
|
fMovement = fCurSpeed * fDiffTime + fAccel * fDiffTime * fDiffTime * 0.5f;
|
|
fMovement += fMaxSpeed * ( fElapsedTime - fDiffTime );
|
|
fCurSpeed = fMaxSpeed;
|
|
}
|
|
else if( ( fFinalSpeed < fMinSpeed ) && ( fCurSpeed >= fMinSpeed ) )
|
|
{
|
|
fDiffTime = ( fCurSpeed - fMinSpeed ) / ( fCurSpeed - fFinalSpeed ) * fElapsedTime;
|
|
fMovement = fCurSpeed * fDiffTime + fAccel * fDiffTime * fDiffTime * 0.5f;
|
|
fMovement += fMinSpeed * ( fElapsedTime - fDiffTime );
|
|
fCurSpeed = fMinSpeed;
|
|
}
|
|
else
|
|
{
|
|
fMovement = fCurSpeed * fElapsedTime + fAccel * fElapsedTime * fElapsedTime * 0.5f;
|
|
fCurSpeed = fFinalSpeed;
|
|
}
|
|
|
|
return fMovement * 100.f;
|
|
}
|
|
|
|
float CalcResistance( float fCurSpeed, float fElapsedTime, float fMaxSpeed, float fMinSpeed, float fElapsedDist )
|
|
{
|
|
float fResist, fFinalSpeed, fDiffTime, fDiffDist;
|
|
|
|
fResist = 2.0f * fElapsedDist / ( fElapsedTime * fElapsedTime ) - 2.0f * fCurSpeed / fElapsedTime;
|
|
fFinalSpeed = fCurSpeed + fElapsedTime * fResist;
|
|
if( ( fFinalSpeed > fMaxSpeed ) && ( fCurSpeed <= fMaxSpeed ) )
|
|
{
|
|
fDiffTime = ( fMaxSpeed - fCurSpeed ) / ( fFinalSpeed - fCurSpeed ) * fElapsedTime;
|
|
fDiffDist = fElapsedDist - fMaxSpeed * ( fElapsedTime - fDiffTime );
|
|
fResist = 2.0f * fDiffDist / ( fDiffTime * fDiffTime ) - 2.0f * fCurSpeed / fDiffTime;
|
|
}
|
|
else if( ( fFinalSpeed < fMinSpeed ) && ( fCurSpeed >= fMinSpeed ) )
|
|
{
|
|
fDiffTime = ( fCurSpeed - fMinSpeed ) / ( fCurSpeed - fFinalSpeed ) * fElapsedTime;
|
|
fDiffDist = fElapsedDist - fMinSpeed * ( fElapsedTime - fDiffTime );
|
|
fResist = 2.0f * fDiffDist / ( fDiffTime * fDiffTime ) - 2.0f * fCurSpeed / fDiffTime;
|
|
}
|
|
return fResist;
|
|
}
|
|
|
|
EtVector3 CalcHoming( DWORD dwTotalTime, DWORD dwElapsedTime, EtVector3 &vStartPos, EtVector3 &vTargetPos, EtVector3 &vViewVec )
|
|
{
|
|
EtVector3 vResult;
|
|
EtVector3 Accel = ( 2.f / ( (float)( dwTotalTime * dwTotalTime ) ) ) * ( vTargetPos - vStartPos - ( (float)dwTotalTime * vViewVec ) );
|
|
vResult = vStartPos + ( (float)dwElapsedTime * vViewVec ) + ( ( 0.5f * ( (float)( dwElapsedTime * dwElapsedTime ) ) ) * Accel );
|
|
return vResult;
|
|
|
|
} |