Я использовал руководство по адресу 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.
Я хочу лучше понять кватернионы, особенноотносительно их использования в коде.
Концептуально, как кватернион "единица" отличается от кватерниона "идентичность"?
Где я должен использовать«единичный» кватернион и где мне использовать «идентификационный» кватернион?
Меня просто смущает плохо написанное руководство?