Dynamics/Vector3Dynamics.cs
using System;

namespace Andicraft.SecondOrderDynamics;

public class Vector3Dynamics : SecondOrderDynamics<Vector3>
{
	/// <inheritdoc/>
	public Vector3Dynamics(Vector3 startingValue) : base(startingValue)
	{
	}

	/// <inheritdoc/>
	public Vector3Dynamics(Vector3 parameters, Vector3 startingValue) : base(parameters, startingValue)
	{
	}

	/// <inheritdoc/>
	public Vector3Dynamics(float frequency, float damping, float response, Vector3 startingValue) : base(frequency, damping, response, startingValue)
	{
	}

	/// <inheritdoc/>
	public override void Reset(Vector3 value)
	{
		_previousValue = value;
		_currentValue = value;
		_velocity = Vector3.Zero;
	}
	
	/// <inheritdoc/>
	public override Vector3 Update(float deltaTime, Vector3 target, bool setVelocity = false, Vector3 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;
	}
}