среда, 3 июня 2020 г.

Вращение колес в зависимости от перемещения транспорта

Первый мой скрипт на C# :) WhellsRotator
Задача такая, я буду делать анимацию перемещения тележки в 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;

    }
}

Комментариев нет:

Отправить комментарий

Контакты: gmail mnexuss@gmail.com | ICQ 201882385 | Add me to Skype