Объедините более 3 вращений (кватернионов) - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть 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.

Есть предложения?Я еще не нашел решение, и, вероятно, я не буду.

1 Ответ

0 голосов
/ 15 февраля 2019

В вашем вопросе вы пишете:

Как рассчитать окончательное вращение Эйлера, которое является комбинацией этих 4 вращений (xyzy)?

Однако,в своем коде вы пишете

Quaternion qInitial = qY * qX * qZ; // Multiply them in the correct order.

Я не знаю единицы, но я бы ожидал, что вы бы хотели, чтобы порядок вращений соответствовал x, y, z, а не y, x,z.

Вы заявили, что это работает, когда у-вращение равно 0, и в этом случае место у-поворота в заказе становится неактуальным.

Получаете ли вы правильный результат, еслиВы вместо этого пишете код ниже?

Quaternion qInitial = qX * qY * qZ; // Multiply them in the correct order.
...