Кватернион к EulerXYZ, как различить отрицательный и положительный кватернион

Я пытался выяснить разницу между ними, и почему 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

1

Решение

Кватернионы -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 должен быть одинаковым в обоих случаях, как кажется.

2

Другие решения

Из того, что я помню, кватернион можно рассматривать как вращение вокруг произвольной оси.

И это может помочь понять интуитивно, почему всегда будет два кватерниона для представления данного вращения.

Поворот на 90 ° вокруг 0,0,1 будет таким же, как вращение на 270 ° вокруг 0,0, -1.

То есть Поворот на четверть против часовой стрелки около 0,0,1 идентичен повороту на четверть по часовой стрелке вокруг 0,0, -1.

Вы можете проверить это, используя большой палец в качестве оси вращения и сделать поворот на 90 ° в направлении, в котором ваши пальцы скручиваются.

0

По вопросам рекламы [email protected]