Повороты в пространстве, quat.setAxes

19 января 2017 13:12
Добрый день.

Долгое время мучаюсь с поворотами с помощью кватернионов, не могу понять где ошибка.
Задача следующая.
Есть объект, и есть три взаимно перпендикулярных вектора, до которых нужно довернуть объект из исходной ориентации.
Пробовал разными способами:
- перемножением двух поворотов rotationTo, нормализацию векторов делал;
- создавая матрицу вручную и из неё кватернион с помощью fromMat3;
- с помощью setAxes;
Но во всех случаях в итоге то, что требуется не получалось, объект поворачивается как попало.

Например, с помощью SetAxes, вроде бы совсем элементарно.
Вот этот код не приводит к повороту объекта (на выходе кватернион [0,0,0,1]), из чего делаю вывод по направлению базовых осей (view - ось Y, right - ось X, up - ось -Z):
      m_quat.setAxes([0,1,0],  [1,0,0],  [0,0,-1],  quat_rez); // (view, right, up, rez)
      m_tr.set_rotation_rel_v(obj, quat_rez);

Теперь хочу повернуть объект так, чтобы взгляд вперёд был по оси X, направо - ось -Y, направление на верх не меняем.
      m_quat.setAxes([1,0,0],  [0,-1,0],  [0,0,-1],  quat_rez);
      m_tr.set_rotation_rel_v(obj, quat_rez);

Но объект поворачивается неправильно, ось Z начинает смотреть на -Y.

Может у кого есть простейший пример кода для решения этой задачи (довернуть объект до трёх заданных взаимно перпендикулярных векторов).
22 января 2017 20:14
Проблему решил, всё тривиально, сам наошибался.
Для поворота объекта в сответствии с тремя заданными взаимоперпендикулярными осями использую этот код:
m_tr2.set_rotation_v(object, m_quat.fromMat3(matr3, m_quat.create()));

matr3 - матрица 3x3, строки соответствуют нормализованным векторам x, y, z.
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.