Собственно, суть задачи в заголовке - есть беговая дорожка известного размера, на которой спавнится несколько разных игрушечных машинок. Исходя из моих скромных познаний физики, суть того, почему машинки сразу не сносит в том, что подвижные колёса крутятся в обратную сторону и уравновешивают машинку настолько, что она может быть неподвижна или даже двигаться против движения беговой дорожки.
Референс:
https://www.youtube.com/shorts/LnRqbcfIWTI
Моя идея заключалась в создании двух векторов - "вектора сноса", представляющего собой то, как беговая дорожка утягивает машину назад и "вектора удержания", в свою очередь препятствующего первому и двигающему машинку вперёд. На данном этапе я абстрагировался от центра масс, геометрии колёс, силы сцепления и эффективности передачи энергии.
Таким образом получилась следующая картина:
Transform _localTransform;
Rigidbody _rigidbody;
Vector3 _velocity;
[SerializeField] float maxEfficiency = 1.3f;
[SerializeField] float minEfficiency = 1;
[HideInInspector] public float speed;
private void Awake() {
_localTransform = GetComponent<Transform>();
_rigidbody = GetComponent<Rigidbody>();
}
private void FixedUpdate() {
var stayVelocity = _localTransform.forward * GetSpeedFactor() * speed * 100;
var fallVelocity = Vector3.forward * speed;
forwardSpeed = stayVelocity.magnitude;
backSpeed = fallVelocity.magnitude;
_velocity += (stayVelocity - fallVelocity) * Time.fixedDeltaTime;
_rigidbody.velocity = _velocity + Vector3.up * _rigidbody.velocity.y;
}
private float GetSpeedFactor() {
var currentAngle = Mathf.Abs(Vector3.Angle(_localTransform.forward, Vector3.forward));
if (currentAngle < 90)
return currentAngle / 90 * maxEfficiency;
else
return -(currentAngle - 90) / 90 * minEfficiency;
}
Но симуляция даже на первый взгляд выглядит странно. Где ошибка или может есть другой способ это реализовать?