Я пытался выяснить разницу между ними, и почему ToEulerXYZ не получает правильное вращение.
Используя MathGeoLib:
axisX:
x 0.80878228 float
y -0.58810818 float
z 0.00000000 float
axisY:
x 0.58811820 float
y 0.80877501 float
z 0.00000000 float
axisZ:
x 0.00000000 float
y 0.00000000 float
z 1.0000000 float
Код:
Quat aQ = Quat::RotateAxisAngle(axisX, DegToRad(30)) * Quat::RotateAxisAngle(axisY, DegToRad(60)) * Quat::RotateAxisAngle(axisZ, DegToRad(40));
float3 eulerAnglesA = aQ.ToEulerXYZ();
Quat bQ = Quat::RotateAxisAngle(axisX, DegToRad(-150)) * Quat::RotateAxisAngle(axisY, DegToRad(120)) * Quat::RotateAxisAngle(axisZ, DegToRad(-140));
float3 eulerAnglesB = bQ.ToEulerXYZ();
Оба к ToEulerXYZ получают {x = 58.675510 y = 33.600880 z = 38.327244 …} (при преобразовании в градусы).
Единственное отличие, которое я вижу, состоит в том, что кватернионы идентичны, но один является отрицательным. ToEulerXYZ неверен, так как каждый должен быть отрицательным ({x = -58.675510 y = -33.600880 z = -38.327244 …}) (bQ)
AQ это:
x 0.52576530 float
y 0.084034257 float
z 0.40772036 float
w 0.74180400 float
Пока БК это:
x -0.52576530 float
y -0.084034257 float
z -0.40772036 float
w -0.74180400 float
Это просто ошибка с MathGeoLib, или какой-то странный нюанс, или, может быть, кто-то может объяснить мне, что происходит логически.
Есть дополнительные сценарии, которые даже не являются отрицательными
axisX:
-0.71492511 y=-0.69920099 z=0.00000000
axisY:
0.69920099 y=-0.71492511 z=0.00000000
axisZ:
x=0.00000000 y=0.00000000 z=1.0000000
Код:
Quat aQ = Quat::RotateAxisAngle(axisX, DegToRad(0)) * Quat::RotateAxisAngle(axisY, DegToRad(0)) * Quat::RotateAxisAngle(axisZ, DegToRad(-90));
float3 eulerAnglesA = aQ.ToEulerXYZ();
Quat bQ = Quat::RotateAxisAngle(axisX, DegToRad(-180)) * Quat::RotateAxisAngle(axisY, DegToRad(180)) * Quat::RotateAxisAngle(axisZ, DegToRad(90));
float3 eulerAnglesB = bQ.ToEulerXYZ();
Оба они дают одинаковый кватернион!
x 0.00000000 float
y 0.00000000 float
z -0.70710677 float
w 0.70710677 float
Кватернионы -q и q различны; однако вращения, представленные двумя кватернионами, идентичны. Это явление обычно описывается словами: кватернионы обеспечивают двойная крышка группы вращений SO (3). Алгебра увидеть это очень просто: учитывая вектор, представленный кватернионом p, и вращение, представленное кватернионом q, вращение qpq^{-1}
, С другой стороны, -qp(-q)^{-1} = -1qp(q)^{-1}(-1) = q(-1)p(-1)q^{-1} = qp(-1)^2q^{-1} = qpq^{-1}
, то же вращение. Кватернионы обычно не коммутируют, поэтому pq != qp
для общих кватернионов, но такие скаляры, как -1, коммутируют с кватернионами.
Я считаю, что ToEulerXYZ должен быть одинаковым в обоих случаях, как кажется.
Из того, что я помню, кватернион можно рассматривать как вращение вокруг произвольной оси.
И это может помочь понять интуитивно, почему всегда будет два кватерниона для представления данного вращения.
Поворот на 90 ° вокруг 0,0,1 будет таким же, как вращение на 270 ° вокруг 0,0, -1.
То есть Поворот на четверть против часовой стрелки около 0,0,1 идентичен повороту на четверть по часовой стрелке вокруг 0,0, -1.
Вы можете проверить это, используя большой палец в качестве оси вращения и сделать поворот на 90 ° в направлении, в котором ваши пальцы скручиваются.