Code/Dynamics/Vector4Dynamics.cs
using System;
namespace Andicraft.SecondOrderDynamics;
public class Vector4Dynamics : SecondOrderDynamics<Vector4>
{
/// <inheritdoc/>
public Vector4Dynamics(Vector4 startingValue) : base(startingValue)
{
}
/// <inheritdoc/>
public Vector4Dynamics(Vector3 parameters, Vector4 startingValue) : base(parameters, startingValue)
{
}
/// <inheritdoc/>
public Vector4Dynamics(float frequency, float damping, float response, Vector4 startingValue) : base(frequency, damping, response, startingValue)
{
}
/// <inheritdoc/>
public override void Reset(Vector4 value)
{
_previousValue = value;
_currentValue = value;
_velocity = Vector4.Zero;
}
/// <inheritdoc/>
public override Vector4 Update(float deltaTime, Vector4 target, bool setVelocity = false, Vector4 velocity = default)
{
if (setVelocity == false)
{
velocity = (target - _previousValue) / deltaTime;
_previousValue = target;
}
var k2Stable = MathF.Max(k2, MathF.Max(deltaTime * deltaTime / 2 + deltaTime * k1 / 2, deltaTime * k1));
_currentValue += deltaTime * _velocity;
_velocity += deltaTime * (target + k3 * velocity - _currentValue - k1 * _velocity) / k2Stable;
return _currentValue;
}
}