Я создал два объекта в Unity3D, представляющие плечо (родительское) и предплечье (дочернее), соединенные суставом персонажа. Вращение этих объектов управляется двумя кватернионами, которые я собираю из IMU, расположенных на плече и предплечье. Я калибрую оба кватерниона. Моя цель — визуализировать сгибание/разгибание локтя.
Q в названии указывает, что это кватернион. QImu указывает, что это кватернион из IMU. Qstart указывает, что это начальная начальная ориентация IMU.
// upperarm script attached to upperarm object
if (Input.GetKeyDown(KeyCode.Space))
{
QstartUpperArm = QimuUpperArm;
}
transform.localRotation = QstartUpperArm * Quaternion.Inverse(QimuUpperArm);
// lowerarm script attached to lowerarm object
if (Input.GetKeyDown(KeyCode.Space))
{
QstartLowerArm = QimuLowerArm;
}
QimuLowerArm = QstartLowerArm * Quaternion.Inverse(QimuLowerArm);
transform.localrotation = Quaternion.Inverse(Qstart2 * Quaternion.Inverse(Qimu2)) * Qimu1new;
Объект Upperarm вращается точно так, как ожидалось. Однако у объекта предплечья одна ось Y перевернута. Все остальные оси в порядке. Как я могу изменить знак этой одной оси с помощью кватерниона?
Quaternion reversedY = Quaternion.Inverse(Qstart2 * Quaternion.Inverse(Qimu2)) * Qimu1new;
transform.localrotation = Quaternion.Euler(Vector3.Scale(reversedY, new Vector3(1f, -1f, 1f) ) );
- person Ruzihm   schedule 15.07.2019Vector3 myEulerAngles = QimuLowerArm.eulerAngles; Quaternion invertedRotation = Quaternion.Euler(myEulerAngles.x, -myEulerAngles.y, myEulerAngles.z); transform.localRotation = invertedRotation;
Итак, я думаю, что ваше решение похоже. - person pvand   schedule 16.07.2019