DragonNest/Common/EngineUtil/VelocityFunc.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

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;
}