Пятница, 29 Марта 2024, 14:53

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Детская коляска (Всё время падает, вопрос стабилизации положения)
Детская коляска
Kot-MatroskinДата: Воскресенье, 09 Июля 2017, 17:51 | Сообщение # 1
был не раз
Сейчас нет на сайте
Есть такой юнит (надеюсь все представляют как выглядит и ездит оная) надо сделать что бы она НЕ наклонялась Более чем на 30 градусов в любом направлении и тем более НЕ переворачивалась. Сломал голову но не придумал как реализовать такое. Перерыл интернет но так и не нашёл ничего про это.
Есть несколько объяснений.
Первое - это настолько элементарно что ни кто даже не упоминают о решении такой задачи.
Второе - это не возможно решить в принципе, хотя в танках они почему то ни разу не переворачиваются. Может на Юнити нет способа
Третье - это сверх секретная и ОЧЕНЬ дорогая фича, и все кто знает как, ждут покупателя.
Ну и....
и всё же кто сможет помочь? Модель примитивная брусок с коллайдером таскается волоком посредством РиджитБади.
Код

                Vector3 r;
                // ----- Поворот
                r = Navigator.transform.eulerAngles - orientationBot.eulerAngles;
                r.x = 0;
                r.z = 0;
                transform.Rotate(r);

                // ---- Движение
                Vector3 p = Navigator.transform.position;
                p.y = transform.position.y;
                botRigidbody.MovePosition(p);
crazy
seamanДата: Воскресенье, 09 Июля 2017, 18:21 | Сообщение # 2
старожил
Сейчас нет на сайте
Constraints https://docs.unity3d.com/Manual/class-Rigidbody.html
Kot-MatroskinДата: Воскресенье, 09 Июля 2017, 19:31 | Сообщение # 3
был не раз
Сейчас нет на сайте
К чему это? Мануал по Rigidbody я читал, и как он мне поможет ограничить наклон коляски до определённого угла? Надо к примеру чтоб до 35 градусов она наклонялась нормально, а если угол наклона превышает 35 то скрипт должен останавливать наклон. И это должно быть по кругу. Да Rigidbody может заморозить наклон но как будет выглядеть коляска стоящая горизонтально на наклонном пандусе blink

Добавлено (09 июля 2017, 19:31)
---------------------------------------------
С того же пандуса коляска резво скатывается при этом её трясёт и подпрыгивает, и заметьте ВСЕГДА падает или даже переворачивается в момент выезда на ровную поверхность.
А иногда и раньше. нужно чтобы сохраняла положение даже при прыжке с высоты


Сообщение отредактировал Kot-Matroskin - Воскресенье, 09 Июля 2017, 19:35
EchoITДата: Воскресенье, 09 Июля 2017, 19:48 | Сообщение # 4
старожил
Сейчас нет на сайте
Kot-Matroskin, видео сделайте.

Долгожданный анонсик: State of War
Kot-MatroskinДата: Воскресенье, 09 Июля 2017, 20:18 | Сообщение # 5
был не раз
Сейчас нет на сайте
Видео как брусок (съезжая) СПРЫГИВАЯ с края обрыва кувыркается в полёте и падает как попало?

Добавлено (09 июля 2017, 20:14)
---------------------------------------------
Надо чтобы он упал на колёса (как кошка на лапы) да и не кувыркался, только свободный наклон до 30 градусов (сколько задаш в общем)

Добавлено (09 июля 2017, 20:18)
---------------------------------------------
Я давно пытаюсь найти, но так и не смог. Там я так понимаю надо как то с кватернионами оперировать свободно уметь. :( увы мат аппарат на уровне 2 + 2


Сообщение отредактировал Kot-Matroskin - Понедельник, 10 Июля 2017, 09:56
_@NEMO@_Дата: Воскресенье, 09 Июля 2017, 21:39 | Сообщение # 6
почетный гость
Сейчас нет на сайте
центр массы сделай в три раза ниже поверхности (как жираф перевернутый)

Музыкант аранжировщик.

https://vk.com/ge_ne_tick
Мой паблик ВКонтакте.
Kot-MatroskinДата: Воскресенье, 09 Июля 2017, 23:02 | Сообщение # 7
был не раз
Сейчас нет на сайте
Это уже опробовано, лажа выходит, нельзя сильно низко делать, качается как качели не остановишь, да и когда сильно низко не едет. да и не решение
flatingoДата: Понедельник, 10 Июля 2017, 07:56 | Сообщение # 8
участник
Сейчас нет на сайте
ТС, есть элементарный способ (если я правильно понял задачу). Подключи компонент Hinge Joint, выстави просто границы наклона (центр еще не забудь) и все. По крайней мере в 2D это работает хорошо.

когда-то я уйду в web3
Kot-MatroskinДата: Пятница, 21 Июля 2017, 09:39 | Сообщение # 9
был не раз
Сейчас нет на сайте
Нет, не в тему, там два риджитбади объекта связываются посредством шарнирного соединения, и к свободному вращению тела в падении не имеют отношения. Ну я уже писал (очень давно)
Есть такая игрушка неваляшка мне надо почти такое.

Добавлено (10 июля 2017, 13:55)
---------------------------------------------
ПС. Простой физикой не выйдет однозначно, надо скриптами контролировать

Добавлено (10 июля 2017, 16:18)
---------------------------------------------
Сколько не пытался придумать, дальше этого не пошло

Код
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));
            //

        }

    }

Добавлено (21 июля 2017, 09:39)
---------------------------------------------
Всем спасибо за участие, пришлось самому помудрить и почитать, и вот что в итоге получилось, если кому будет интересно вот видео
Видео
а вот и сам код

Код
    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);
        }
    }

Ещё раз спасибо, если кто найдёт способ оптимизировать код или что то поправить буду благодарен.
URGINSANДата: Воскресенье, 23 Июля 2017, 17:41 | Сообщение # 10
почти ветеран
Сейчас нет на сайте
Kot-Matroskin, возможно, еще выручила бы функция Math.Clamp.

Я на драйве
Kot-MatroskinДата: Понедельник, 24 Июля 2017, 22:33 | Сообщение # 11
был не раз
Сейчас нет на сайте
Точно!! И сравнений меньше
up
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Детская коляска (Всё время падает, вопрос стабилизации положения)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг