Завъртане на матрица с накланяне/наклон/въртене

Искам да приложа трансформация от реалния свят (от акселерометър/жироскоп/компас) към моята матрица за изглед на модел. Насам:

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