Если подумать об этом, значения акселерометров являются компонентами вектора, который я искал ... Вам нужно только выразить кратчайшую дугу между опорным вектором и этим вектором как кватернион. 1003 *
Например, если accel
- это (нормализованный) вектор, содержащий значения акселерометра:
reference = Vector3(0, 0, 1)
axis = crossp(accel, reference)
angle = acos(dotp(accel, reference))
q = Quaternion::from_xyzr(axis, angle)
rotation_matrix = q.matrix()
Я выбрал {0, 0, 1} в качестве опорного вектора, потому что значения акселерометров в «положении покоя» (Wiimote на столе, указывая на вас).
Это дает те же движения, что и преобразование высоты / крена акселерометров X / Z, но без блокировки карданного подвеса в вертикальных положениях.
Единственная проблема в том, что вы не получаете информацию о поворотах, сделанных на оси гравитации Земли ... Я думаю, для этого и создан MotionPlus.