Горизонтальна стабилизация тележки

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Горизонтальна стабилизация тележки

Сообщение Винт 11 июл 2017, 22:58

Уважаемые форумчане, прошу помощи. Задача простая но нигде не смог найти даже намёка на решение.
Есть тележка. Можно даже представить её в виде примитива - брусок с коллайдером. Таскаем его волоком за риджит бади. Задача в том чтобы запретить ему наклоняться по горизонтали более определённого угла, в моём случае пока 25 градусов, в любом направлении. Так чтобы даже спрыгивая с высоты он падал колёсами вниз и не кувыркался, и вааще не переворачивался. Я в кодировании на шарпе новичок единственно до чего смог до думаться такой код но это лажа. Помогите пожалуйста.
Синтаксис:
Используется csharp
Rigidbody rb;
    public Transform sample; // Образец для подражания всегда в горизонтальном положении
    public Transform _baseOfColumn; // Платформа с риджит бади
    public float _angle; // Угол между образцом и платформой
    // Use this for initialization
    void Start()
    {
        rb = _baseOfColumn.GetComponent<Rigidbody>     ( );
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        Quaternion _base = _baseOfColumn.rotation;
        Quaternion _smpl = _sample.rotation;
        _angle = Quaternion.Angle(_base, _smpl);
        if (_angle > 40)
        {
            // Этот вариант ведёт себя очень странно
            transform.rotation = Quaternion.Slerp(_base, _smpl, 0.5f);

            // В этом прыгает всё время хотя и не падает
            _baseOfColumn.rotation = Quaternion.Slerp(_base, _smpl, 0.5f);

            // И в этом тоже прыгает всё время и тоже не падает
            rb.rotation = Quaternion.LerpUnclamped(_base, _smpl, 1f);

            // И в этом тоже прыгает всё время и тоже не падает
            rb.MoveRotation(Quaternion.LerpUnclamped(_base, _smpl, 1f));
            //

        }

    }
 
Винт
UNец
 
Сообщения: 2
Зарегистрирован: 11 июл 2017, 16:10

Re: Горизонтальна стабилизация тележки

Сообщение Винт 21 июл 2017, 09:28

Всем привет. Задачу решил сам немного поработав и подумав на тренировочной площадке, вот видео если кому будет интересно.
Всё оказалось достаточно просто, хотя у кого то может возникнуть идеи по поводу кода?
Вот непосредственно сам код
Синтаксис:
Используется csharp
    Transform TransformTestCube;
    float rotateAxisZ;
    float rotateAxisX;
    public Text infoText;
    string str = "";
    public Transform AxisOfRotation;
    public float speedR = 10f;
    public bool stabilizationIsEnabled;
    public float limitAngle = 30f;
    private Vector3 eulerAng;

    // Use this for initialization
    void Start()
    {
        TransformTestCube = transform;
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        if (Input.GetKeyUp(KeyCode.C))// Включение / выключение стабилизатора
            stabilizationIsEnabled = !stabilizationIsEnabled;
        // Вывод данных о наклоне на дисплей
        str = "Поворот по оси Z: ";
                // Получаем величину наклона объекта по оси Z
        rotateAxisZ = TransformTestCube.eulerAngles.z;
        str += rotateAxisZ.ToString();
                // Получаем величину наклона объекта по оси X
        rotateAxisX = TransformTestCube.eulerAngles.x;
        str += "\n" + "Поворот по оси X: " + rotateAxisX.ToString();
        infoText.text = str;
        // Собственно сам стабилизатор
        if (stabilizationIsEnabled)
        {
            eulerAng = TransformTestCube.eulerAngles;
            // Проверяем угол наклона по оси Z
            // если наклон до 180 градусов значит объект наклоняется влево
            if (rotateAxisZ >= limitAngle && rotateAxisZ < 180)// И одновременно проверяем достиг наклон лимита
            {
                // если достиг или превысил лимит наклона присваиваем величину лимита углу z переменной eulerAng
                eulerAng.z = limitAngle;
                // И поворачиваем трансформ на угол eulerAng
                TransformTestCube.eulerAngles = eulerAng;
            }
            // Проверяем угол наклона по оси X
            // если наклон до 180 градусов значит объект наклоняется вперёд
            if (rotateAxisX >= limitAngle && rotateAxisX < 180)
            {
                eulerAng.x = limitAngle;
                TransformTestCube.eulerAngles = eulerAng;
            }
            // Проверяем угол наклона по оси Z
            // если наклон больше 180 градусов значит объект наклоняется вправо
            if (rotateAxisZ <= (360 - limitAngle) && rotateAxisZ > 180)//При наклоне вправо вычисляем нужный угол (360 - limitAngle)
            {
                eulerAng.z = 360 - limitAngle;
                TransformTestCube.eulerAngles = eulerAng;
            }
            // Проверяем угол наклона по оси X
            // если наклон больше 180 градусов значит объект наклоняется назад
            if (rotateAxisX <= (360 - limitAngle) && rotateAxisX > 180)
            {
                eulerAng.x = 360 - limitAngle;
                TransformTestCube.eulerAngles = eulerAng;
            }

            // Индикация работы стабилизатора
            AxisOfRotation.rotation *= Quaternion.AngleAxis(speedR * Time.deltaTime, Vector3.up);
        }
    }

Спасибо за интерес к этой теме. :)
Винт
UNец
 
Сообщения: 2
Зарегистрирован: 11 июл 2017, 16:10

Re: Горизонтальна стабилизация тележки

Сообщение samana 21 июл 2017, 09:54

Честно говоря, я вообще ничего не понял по видео. Что именно там стабилизируется и где тележка? А то только кубик спрыгивает с какой-то платформы и скачет, скачет, скачет, скачет.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Горизонтальна стабилизация тележки

Сообщение ru66ssb 21 июл 2017, 10:38

ну..насколько я понял - у него там публичная булевая переменная stabilizationIsEnabled - если она включено то кубик на видео не наклоняется более указанного угла влево/вправо. просто на видео (я без звука смотрел) сначало показано как ведет себя куб при stabilizationIsEnabled = false - потом если true
Аватара пользователя
ru66ssb
UNIт
 
Сообщения: 107
Зарегистрирован: 27 июн 2015, 07:01

Re: Горизонтальна стабилизация тележки

Сообщение samana 21 июл 2017, 13:38

ru66ssb писал(а):ну..насколько я понял - у него там публичная булевая переменная stabilizationIsEnabled - если она включено то кубик на видео не наклоняется более указанного угла влево/вправо. просто на видео (я без звука смотрел) сначало показано как ведет себя куб при stabilizationIsEnabled = false - потом если true

Ага, спасибо, стало более ясно.
ps. видео и так без звука.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 19