Пятница, 15 Ноября 2024, 13:24

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Изменение поворота объекта при извлечении из группы
KUPRUMДата: Четверг, 08 Августа 2019, 12:21 | Сообщение # 1
уже был
Сейчас нет на сайте
Доброго времени суток, на 3D сцене есть ряд объектов, которые активно перемещаются, при этом одни могут стать дочерними по отношению к другим. Столкнулся с проблемой связанной с применением Quaternion. Объект, переставая быть дочерним изменяет свою ориентацию в пространстве(полагаю это происходит из-за изменения системы координат с локальных на глобальные и наоборот). Тоже самое происходит при включении его обратно в группу. Вращение объектов происходит через Quaternion.Euler. Кто-то сталкивался с подобным?

Изменение transform.localRotation на transform.rotation не подходит так как родительский объект также активно перемещается в пространстве.

Код упрощен C#

Код

void Update()
{
       float y += (Input.GetAxisRaw("Mouse X"));
       transform.localRotation = Quaternion.Euler(0, y, 0);
}

void OnTriggerStay(Collider other)
{
       GameObject vr = other.gameObject;
       if (transform.parent==false)
           if (vr.GetComponent<OnTrigger>())
                transform.parent = vr .transform;
}

void OnTriggerExit(Collider other)
{
        GameObject vr = other.gameObject;
        if (vr.GetComponent<OnTrigger>())
            transform.parent = null;
}
drcrackДата: Четверг, 08 Августа 2019, 12:31 | Сообщение # 2
старожил
Сейчас нет на сайте
ну проблема понятна — у тебя в Update
Код
transform.localRotation = Quaternion.Euler(0, y, 0);

т.е. ты задаешь вращение относительно родителя, а он постоянно меняется
если ты хочешь сохранять вращение после вытаскивания из группы и далее крутить его по Y относительно того что было, тебе нужно сделать как-то так:

Код

Quaternion rotation;

void Update()
{
      float y += (Input.GetAxisRaw("Mouse X"));
    
   if(transform.parent) {    
    transform.localRotation = Quaternion.Euler(0, y, 0);
   } else {
    transform.rotation = rotation * Quaternion.Euler(0, y, 0);
   }
}

void OnTriggerStay(Collider other)
{
       GameObject vr = other.gameObject;
       if (transform.parent==false)
           if (vr.GetComponent<OnTrigger>())
                transform.parent = vr .transform;
}

void OnTriggerExit(Collider other)
{
        GameObject vr = other.gameObject;
        if (vr.GetComponent<OnTrigger>()) {
      rotation = transform.parent.rotation;
            transform.parent = null;
    }
}
KUPRUMДата: Четверг, 08 Августа 2019, 12:44 | Сообщение # 3
уже был
Сейчас нет на сайте
Хах как всегда самый простой вариант просмотрел, спасибо!)

Добавлено (05 Апреля 2020, 08:43)
---------------------------------------------
Предположим у меня лодка по которой можно ходить и на ней же плавать. При выходе с лодки работает код указанный выше, а при входе на нее это не помогает. Персонж резко меняет направление когда становится дочерним. Есть ли какие то решения этой проблемы?

Добавлено (05 Апреля 2020, 09:39)
---------------------------------------------
Похоже частично можно решить проблему так:

Код

    Quaternion rotation;
    float y;

    void Update()
    {
        y += Input.GetAxisRaw("Mouse X");

        if (transform.parent)
        {
            transform.localRotation = Quaternion.Euler(0, y, 0) * rotation;
        }
        else
        {
            transform.rotation = Quaternion.Euler(0, y, 0);
        }
    }

    void OnTriggerEnter(Collider other)
    {
        GameObject vr = other.gameObject;
        if (transform.parent == false)
            if (vr.GetComponent<OnTrigger>())
            {
                transform.parent = vr.transform;
                rotation = Quaternion.Inverse(transform.parent.rotation);
            }
    }

    void OnTriggerExit(Collider other)
    {
        GameObject vr = other.gameObject;
        if (vr.GetComponent<OnTrigger>())
        {
            transform.parent = null;
        }
    }
  • Страница 1 из 1
  • 1
Поиск:

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