@Ezekiel4
Охотник на пиратов и сборщик монолитов

Как реализовать поведение игрушечной машинки на беговой дорожке?

Собственно, суть задачи в заголовке - есть беговая дорожка известного размера, на которой спавнится несколько разных игрушечных машинок. Исходя из моих скромных познаний физики, суть того, почему машинки сразу не сносит в том, что подвижные колёса крутятся в обратную сторону и уравновешивают машинку настолько, что она может быть неподвижна или даже двигаться против движения беговой дорожки.

Референс: 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;
}


Но симуляция даже на первый взгляд выглядит странно. Где ошибка или может есть другой способ это реализовать?
  • Вопрос задан
  • 94 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы