Как рассчитать углы Эйлера по векторам вперед, вверх и справа?

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

Факты:

  • Я использую Unity.
  • Я могу легко получить векторы вперед, вверх и вправо из любого вращения кватерниона.
  • Я не могу просто записать свои собственные углы Эйлера, изменить их и применить вращение через новый кватернион, потому что объект управляется физикой.
  • Я не очень хорошо понимаю математику, если она не написана в коде (или псевдокоде), так что это было бы для меня наиболее полезным.
  • Мне легче понять ответ в стиле C ++, но я могу разработать практически любой код.
  • Я НЕ пытаюсь заставить кого-то написать код для меня! Я только спрашиваю ответ в коде или псевдокоде, потому что я никогда не учился читать обычные математические загадки; Я программист, а не математик.
  • Unity использует левостороннюю систему координат. X = вправо, Y = вверх, Z = вперед.

Что я пытаюсь сделать:

Я пытаюсь воспроизвести анимацию на структуре гуманоидной кости и, используя крутящий момент (вращающую силу), толкаю физическую тряпичную куклу примерно в ту же позу, что и структура кости.

Эта проблема:

Я могу полностью работать в Quaternions вплоть до того момента, когда мне нужно приложить момент к жестким телам. AddTorque Функция эффективно работает в углах Эйлера, что означает, что я не могу использовать кватернионы. Я могу легко извлечь углы Эйлера из кватернионов, но они ненадежны и приводят к тому, что тряпичная кукла сильно изнашивается.

Что мне нужно:

Мне нужно рассчитать надежные углы 3D Эйлера (например, те, которые не переворачиваются от + к — «случайным образом») из векторов вперед, вверх и вправо. Я понимаю, что это немного сложно, но вот почему я спрашиваю здесь: мне не хватает знаний и опыта, чтобы решить эту проблему самостоятельно.

Учитывая, что сами векторы надежны, я не вижу причин, по которым невозможно было бы получить из них надежные углы Эйлера. Кроме того, я не знаю, какой порядок поворота мне нужен или нужен для углов Эйлера, но я считаю, что это будет довольно легко изменить позже.

Любая помощь приветствуется!

2

Решение

Во-первых, я хотел бы сказать, что Я полностью решил свою проблему благодаря усилиям @ Tobias. Большое большое спасибо! Все это время я подходил к проблеме не с того конца. Я предположил, что мне нужно использовать AddTorque определенным образом (с углами Эйлера) и работал оттуда, но @Tobias (и @JarkkoL чуть позже) указали, что мне нужно использовать AddTorque по-другому.

Вот что я сделал в UnityScript (фактически JavaScript):

var quat0:Quaternion;
var quat1:Quaternion;
var quat10:Quaternion;
quat0=transform.rotation;
quat1=target.transform.rotation;
quat10=quat1*Quaternion.Inverse(quat0);
rigidbody.AddTorque(quat10.x,quat10.y,quat10.z,ForceMode.Force);

И, вопреки всем ожиданиям, это работает !! Это просто … работает! Конечно, куб жестких тел занимает много времени, но это потому, что мне нужен ПИД-регулятор. Или, может быть quat10 нуждается в нормализации, не уверен. Я разберусь с этим 🙂

Я понятия не имел, что вы на самом деле можете использовать эту часть квота самостоятельно.

3

Другие решения

Во-первых, я думаю, что вам лучше повезет на форумах Unity для вопросов, специфичных для Unity (: Тем не менее, я думаю, что вы неправильно интерпретируете интерфейс AddTorque (), если этот — то, что вы используете: http://docs.unity3d.com/ScriptReference/Rigidbody.AddTorque.html

Вместо прохождения углов Эйлера вы передаете вектор функции, которая является осью вращения. Я не знаком с Unity, но я считаю, что длина вектора определяет, какой крутящий момент добавить. Углы Эйлера по своей сути являются плохим представлением для вращений, поэтому вы всегда должны предполагать (если не указано иное), что хорошо зарекомендовавшая себя работа API с кватернионами, парами ось / угол или матрицами, когда дело доходит до вращений. Углы Эйлера — более удобное представление для конечных пользователей.

1