Поскольку это сложный вопрос, который обычно приводит к большой путанице (я задавал варианты этого вопроса ранее, но никогда не задавал вопрос правильно и никогда не получал ответа), я постараюсь сделать это так же ясно, как возможный.
Факты:
Что я пытаюсь сделать:
Я пытаюсь воспроизвести анимацию на структуре гуманоидной кости и, используя крутящий момент (вращающую силу), толкаю физическую тряпичную куклу примерно в ту же позу, что и структура кости.
Эта проблема:
Я могу полностью работать в Quaternions вплоть до того момента, когда мне нужно приложить момент к жестким телам. AddTorque
Функция эффективно работает в углах Эйлера, что означает, что я не могу использовать кватернионы. Я могу легко извлечь углы Эйлера из кватернионов, но они ненадежны и приводят к тому, что тряпичная кукла сильно изнашивается.
Что мне нужно:
Мне нужно рассчитать надежные углы 3D Эйлера (например, те, которые не переворачиваются от + к — «случайным образом») из векторов вперед, вверх и вправо. Я понимаю, что это немного сложно, но вот почему я спрашиваю здесь: мне не хватает знаний и опыта, чтобы решить эту проблему самостоятельно.
Учитывая, что сами векторы надежны, я не вижу причин, по которым невозможно было бы получить из них надежные углы Эйлера. Кроме того, я не знаю, какой порядок поворота мне нужен или нужен для углов Эйлера, но я считаю, что это будет довольно легко изменить позже.
Любая помощь приветствуется!
Во-первых, я хотел бы сказать, что Я полностью решил свою проблему благодаря усилиям @ 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
нуждается в нормализации, не уверен. Я разберусь с этим 🙂
Я понятия не имел, что вы на самом деле можете использовать эту часть квота самостоятельно.
Во-первых, я думаю, что вам лучше повезет на форумах Unity для вопросов, специфичных для Unity (: Тем не менее, я думаю, что вы неправильно интерпретируете интерфейс AddTorque (), если этот — то, что вы используете: http://docs.unity3d.com/ScriptReference/Rigidbody.AddTorque.html
Вместо прохождения углов Эйлера вы передаете вектор функции, которая является осью вращения. Я не знаком с Unity, но я считаю, что длина вектора определяет, какой крутящий момент добавить. Углы Эйлера по своей сути являются плохим представлением для вращений, поэтому вы всегда должны предполагать (если не указано иное), что хорошо зарекомендовавшая себя работа API с кватернионами, парами ось / угол или матрицами, когда дело доходит до вращений. Углы Эйлера — более удобное представление для конечных пользователей.