Задача такая, я буду делать анимацию перемещения тележки в Unity, а колеса будут вращаться автоматически в зависимости от скорости перемещения тележки, направления и с разным радиусом колесами.
Смысл такой: длина окружности = 2PiR
В один фрейм тележка проезжает расстояние = разница между текущим положением и положением в прошлом кадре. Длина вектора является квадратным корнем из (x*x+y*y+z*z)
Угол поворота тележки в один фрейм = 360/ (длина окружности / перемещение тележки в один фрейм)
Умножаем кватернион тележки на угол поворота в секунду.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WheelsRotator : MonoBehaviour
{
public Transform Base;
public Transform BigWheels;
public float Radius1;
public Transform SmallWheels;
public float Radius2;
float Speedrotate_1;
float Speedrotate_2;
Vector3 oldPos;
float LWheel1;
float LWheel2;
float WheelDirection;
// Start is called before the first frame update
void Start()
{
oldPos = Base.transform.position;
LWheel1 = 2 * Mathf.PI * Radius1;
LWheel2 = 2 * Mathf.PI * Radius2;
}
// Update is called once per frame
void FixedUpdate()
{
// Вычисляем скорость перемещения по горизонтали тачанки во фрейме
Vector3 distanceVector = Base.transform.position - oldPos;
distanceVector.y = 0;
float distanceThisFrame = distanceVector.magnitude;
oldPos = Base.transform.position;
//Вычисляем скорость колеса
float Speedrotate_1 = 360 / (LWheel1 / distanceThisFrame);
float Speedrotate_2 = 360 / (LWheel2 / distanceThisFrame);
//Задаем направление и вращение колеса
if (Vector3.Dot(Base.forward, distanceVector) > 0)
{
WheelDirection = 1;
}
else
{
WheelDirection = -1;
}
//Вращаем колеса с помощью кватерниона
Quaternion rotationX = Quaternion.AngleAxis((Speedrotate_1 * WheelDirection), new Vector3(1, 0, 0));
BigWheels.transform.rotation *= rotationX;
Quaternion rotationX2 = Quaternion.AngleAxis((Speedrotate_2 * WheelDirection), new Vector3(1, 0, 0));
SmallWheels.transform.rotation *= rotationX2;
}
}
Комментариев нет:
Отправить комментарий