значения помещаются в блок кватернион like so:
sensors_event_t.data[0] = rot_axis.x*sin(theta/2);
sensors_event_t.data[1] = rot_axis.y*sin(theta/2);
sensors_event_t.data[2] = rot_axis.z*sin(theta/2);
sensors_event_t.data[3] = cos(theta/2)
Так обратна просто:
double theta = Math.acos(vals[3])*2;
double sinv = Math.sin(theta/2);
double xa = vals[0]/sinv;
double ya = vals[1]/sinv;
double za = vals[2]/sinv;
Но ха, ху, и XZ не являются углы, они являются координатами оси, как описано в документации. Я не уверен, что вы хотите с этим, вам, скорее всего, будет лучше пытаться достичь своей неустановленной цели с помощью элемента quaternion напрямую.
Причина использования unit quaternion заключается в том, чтобы избежать gimble lock, в основном вы не можете описать каждое возможное вращение в терминах трех углов, рулона/высоты/рыскания, например, при определенном шаге и углу рыскания вы можете потерять способность к рулону ,
Так один способ использовать это, чтобы преобразовать в матрицу вращения:
Source
if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
// convert the rotation-vector to a 4x4 matrix. the matrix
// is interpreted by Open GL as the inverse of the
// rotation-vector, which is what we want.
SensorManager.getRotationMatrixFromVector(
mRotationMatrix , event.values);
}
Это выглядит нормально кроме к.т. вещей, что это? – weston
То есть для преобразования радиуса в углы. Если я поверну свой телефон на 180 градусов, я изменил только с -40 до 40. Это должно быть от -90 до 90. Не уверен, что что-то не так с моим кодом. – mind1n
xa, xy и xz не являются углами, они являются координатами оси, читайте ссылку в моем ответе. – weston