В чем разница между «единичным» кватернионом и «идентичным» кватернионом - PullRequest
0 голосов
/ 09 ноября 2019

Я использовал руководство по адресу www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/ для изучения OpenGL. В этом руководстве говорится, что ...

glm :: quat q;

... создает кватернион идентичности (без вращения).

Экспериментпоказывает, что q = [0, 0, 0, 0]. Использование этого в качестве родительской ориентации корневой кости приводит к тому, что ни одна из костей не вращается вообще. Они теряют все вращения.

В справочнике говорится, что ...

Кватернион - это набор из 4 чисел [xyzw], который представляет вращения следующим образом:

// RotationAngle в радианах

x = RotationAxis.x * sin (RotationAngle / 2)

y = RotationAxis.y * sin (RotationAngle / 2)

z = RotationAxis.z * sin (RotationAngle / 2)

w = cos (RotationAngle / 2)

... и ...

[0 0 0 1] (w = 1) означает, что угол = 2 * acos (1) = 0, так что это единичный кватернион, который вообще не вращается.

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

Если я использую кватернион «идентичность» в качестве «родительской» ориентации для корневой кости,тогда ни одна из костей не вращается вообще. Если я использую «единичное» вращение, все хорошо.

Когда я устанавливаю начальную ориентацию кости как кватернион «идентичность» или «единица», она отображается так, как я хочу. Однако когда я конвертирую введенные пользователем углы Эйлера в ориентацию, я получаю поворот на 180 градусов. Я сделал следующее преобразование:

        glm::vec3 eulers(glm::radians(pose.lng_rotate),
                         glm::radians(pose.lat_rotate),
                         glm::radians(pose.att_rotate));

        pose.orientation = glm::quat(eulers);

Примечание: я использую «lng», «lat» и «att» вращаться здесь, потому что к тому времени, когда кость унаследовала родительский поворот, ось «x»вероятно, больше не ось «х».

Последнее, что я заметил, было странное то, что я использовал glm::mat4_cast для каждого типа кватернионов, а затем умножил на тождество glm::vec4. Кватернион «идентичность» оставил вектор не повернутым, но кватернион «единица» заставил вектор инвертировать (умножить на -1) компоненты вектора x и y.

Я хочу лучше понять кватернионы, особенноотносительно их использования в коде.

Концептуально, как кватернион "единица" отличается от кватерниона "идентичность"?

Где я должен использовать«единичный» кватернион и где мне использовать «идентификационный» кватернион?

Меня просто смущает плохо написанное руководство?

1 Ответ

0 голосов
/ 12 ноября 2019

Единица и кватернионы идентичности - это одно и то же. Руководство плохо написано и запутанно.

glm::quat q; делает НЕ создание кватерниона идентичности. Это создает недопустимый кватернион. Лучший способ создать кватернион - это либо glm::quat q(glm::vec3(0.0, 0.0, 0.0));, либо glm::quat q(1.0, 0.0, 0.0, 0.0);. Первый генерирует кватернион на основе вектора всех нулевых вращений Эйлера. Второе явным образом инициализирует его как единичный кватернион.

Обратите внимание, что хотя кватернионы часто описываются как [x y z w], они сохраняются и инициализируются как (w, x, y, z).

...