Вращение матрицы по крену/тангажу/рысканию

Я хочу применить некоторое реальное преобразование (из акселерометра/гироскопа/компаса) к моей матрице представления модели. Сюда:

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: Нашел проблему! Кто-нибудь может объяснить, как подать заявку решение моей матрицы?


person Dmitry Isaev    schedule 02.02.2013    source источник


Ответы (1)


это должно прояснить, что вам нужно сделать: http://tutorialrandom.blogspot.com/2012/08/how-to-rotate-in-3d-using-opengl-proper.html это решит ваши проблемы с блокировкой стабилизатора.

что касается случайных значений при вертикальном удерживании телефона, я не уверен. возможно, преобразовать вектор ориентации так, чтобы его значения всегда были положительными или что-то в этом роде.

person Fonix    schedule 04.02.2013