Jump to content

[SOLVED] Соответствие углов node в методах GetWorldRotation() и SetWorldRotation()


photo

Recommended Posts

Добрый день!

В своей игре реализую систему сохранения/загрузки из файла.  Положение ноды сохраняется/загружается без проблем, а вот с поворотом возникли сложности.  

Сначала, при Serialize() я беру текущий поворот ноды методом GetWorldRotation() и получаю его в значениях до 1. 

Затем, при  Deserialize() я назначаю ноде новой поворот из сохранённого ранее, методом SetWorldRotation()

Но для того что бы повернуть в методе SetWorldRotation() нам надо использовать градусы, а у меня значения все до 1. Поэтому нода поворачивается крайне незначительно.

Теперь вопрос уважаемым гуру: как мне преобразовать значения поворотов взятых из метода GetWorldRotation() и привести к градусам в методе SetWorldRotation()?

Я, правда, нашел вот такую конструкцию преобразования: 

node.GetWorldRotation().GetAngle(vec3.FORWARD); 
node.GetWorldRotation().GetAngle(vec3.RIGHT);
node.GetWorldRotation().GetAngle(vec3.UP);

но, всё равно получаю ошибочный результат при Deserialize()

Или, есть способ Set для поворота, где бы использовались значения Get до 1?

Спасибо!

Link to comment

Добрый день!

Метод SetWorldRotation() принимает не углы в градусах, а кватернион, поэтому, если передать ему такой же кватернион как тот, что ранее вернул метод GetWorldRotation(), поворот ноды будет идентичным.

В коде ниже приведена компонента, которая по нажатию клавишь Q и E обнуляет вращение ноды и возвращает его в начальное состояние соответственно:

public class NodeRotation : Component
{
    private quat rot;

    private void Init()
    {
        rot = node.GetWorldRotation();
    }

    private void Update()
    {
        // обнуляем вращение
        if (Input.IsKeyDown(Input.KEY.Q))
            node.SetWorldRotation(quat.ZERO);

        // возвращаем первоначальное вращение
        if (Input.IsKeyDown(Input.KEY.E))
            node.SetWorldRotation(rot);
    }
}

В каком виде Вы сохраняете полученный от GetWorldRotation() кватернион? Тут важно заметить, что первые три значения кватерниона сами по себе не являются углами вращения по осям xyz, чтобы сохранить правильное вращение нужны все 4 значения.

  • Like 2
Link to comment

К сожалению квантернион не поддерживается стандартной сериализацией C#. При попытке его сохранить в файл,

quat rot = node.GetWorldRotation();
formatter.Serialize(fs, rot);

приложение закрывается. 

Есть ли другой способ сохранять / загружать quat данные стандартными методами C#? Может, есть возможность преобразовать quat в, например, float или double, сохранить, а после загрузки вновь вернуть в quat? 

Спасибо!

Link to comment

Каждый элемент quat уже является float, к ним можно обращаться следующим образом: rot.x, rot.y, rot.z, rot.w.

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

// с помощью vec4
rot1 = new quat(new vec4(x, y, z, w));

// либо с помощью массива float
rot1 = new quat(new float[] {x, y, z, w});

Здесь x, y, z, w - Ваши элементы quat типа float.

  • Like 1
Link to comment

moody_pooch 

Отлично! 2 дня исканий, наконец, привели к желаемому результату! Вот эта грандиозная строчка, из-за которой было столько мучений!

_car_uaz.SetWorldRotation(new quat( new float[] {_car_rot.Car_uaz_rot_x, _car_rot.Car_uaz_rot_y, _car_rot.Car_uaz_rot_z, _car_rot.Car_uaz_rot_w}));

Огромное спасибо!!!

  • Like 1
Link to comment
  • silent changed the title to [SOLVED] Соответствие углов node в методах GetWorldRotation() и SetWorldRotation()
×
×
  • Create New...