Я хочу применить некоторое реальное преобразование (из акселерометра/гироскопа/компаса) к моей матрице представления модели. Сюда:
modelViewMatrix = GLKMatrix4MakeLookAt(cam.x, cam.y, cam.z,
0.f, 0.f, 0.f,
0.f, 1.f, 0.f);
GLKVector3 v = GLKVector3Normalize(x, y, z); // accelerometer + gyro
float roll = asinf(-v.x);
float pitch = atan2f(v.y, -v.z);
float yaw = GLKMathDegreesToRadians(heading); // compass
GLKMatrix4 m = GLKMatrix4Identity;
m = GLKMatrix4RotateX(m, pitch);
m = GLKMatrix4RotateY(m, roll);
m = GLKMatrix4RotateZ(m, yaw);
modelViewMatrix = GLKMatrix4Multiply(m, m_modelViewMatrix);
Оно работает. Но есть проблема. Когда телефон находится в «камерной» (горизонтальной) ориентации, так что «Проведите для разблокировки» точно вертикально, y и z оба очень близки к нулю, часто меняясь их признаки. Итак, atan2() возвращает какие-то "случайные" значения, а сцена движется в горизонтальной плоскости...
Должен быть способ упростить переход, создав единую матрицу из x
, y
, z
и heading
без потери точности...
UPD: Нашел проблему! Кто-нибудь может объяснить, как подать заявку решение моей матрицы?