Искам да приложа трансформация от реалния свят (от акселерометър/жироскоп/компас) към моята матрица за изглед на модел. Насам:
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: Открих проблема! Някой може ли да обясни как се кандидатства решението на моята матрица?