У меня есть 3D-точка и повороты x, y, z (qInitial
) для этой точки.Я хочу повернуть эту точку больше (на несколько градусов, которая может быть от 0 до 360) вокруг оси y (qYextra
). Как вычислить окончательное вращение Эйлера (qResult.eulerAngles
) , которое является комбинацией этих 4 вращений (xyzy) ?
Я пытался вычислить начальный кватернионвращение и дополнительное вращение, которое будет применено.А затем умножьте эти два кватерниона.Однако я получаю странные результаты (вероятно, блокировка карданного подвеса) .
Код в C #.Unity.
1. Quaternion qX = Quaternion.AngleAxis(rotationFromBvh.x,Vector3.right);
2. Quaternion qY = Quaternion.AngleAxis(rotationFromBvh.y,Vector3.up);
3. Quaternion qZ = Quaternion.AngleAxis(rotationFromBvh.z,Vector3.forward);
4. Quaternion qYextra = Quaternion.AngleAxis(angle,Vector3.up);
Quaternion qInitial = qY * qX * qZ; // Yes. This is the correct order.
qY*qX*qZ
имеет точно такие же результаты Эйлера x, y, z как Quaternion.Euler(rotationFromBvh)
Quaternion qResult = qInitial * qYextra;
return qResult.eulerAngles;
Я могу подтвердить , что код работает нормально (без блокировки карданного подвеса), когда 4-й поворот - 0 градусов (qYextra = identity
).Это означает, что qInitial
правильно.Таким образом, ошибка может быть вызвана комбинацией этих двух вращений (qInitial
и qYextra
) ИЛИ из-за преобразования из кватерниона в Эйлера .
ПРИМЕР: (qYextra
угол составляет 120 градусов)
РЕЗУЛЬТАТЫ:
qInitial.eulerAngles
дает эти результаты: apply_qInitial_rotation
qResult.eulerAngles
дает следующие результаты: apply_qResult_rotation
ОЖИДАЕМЫЕ РЕЗУЛЬТАТЫ:
ожидаемые результаты должны быть как qInitial
, но повернуты на 120 градусов вокруг y.
Есть предложения?Я еще не нашел решение, и, вероятно, я не буду.