2016-08-03 4 views
0

Я работаю над приложением, которое использует жест движения наклонной стороны. У меня есть работа с использованием данных CMDeviceMotion через значения CMQuaternion, чтобы получить «roll» через Using quaternion instead of roll, pitch and yaw to track device motion, но у меня есть одна странная битка поведения, когда выход будет работать отлично, а другие нет.CMDeviceMotion в альбомной ориентации

Приложение заблокировано для ориентации на пейзаж (в обоих направлениях), но я заметил, что если я запустил приложение, находящееся в портретной ориентации, мой кодовый код отлично работает с модификатором pi/2. Если я открою приложение с устройством, находящимся в ландшафте, он будет работать на шаге без модификатора.

Проблема в том, что у меня нет способа узнать, что использовать! Есть ли способ обнаружения или переустановки системы координат?

UPDATE:

Я солгать, если я начинаю в альбомной ориентации, кажется, просто выбрать случайную ось :(Я предполагаю, что это опять вещь шарнирного замка, но до сих пор применяется оригинальный вопрос - как сделать получить это, чтобы быть последовательным, когда я запустить устройство в альбомной ориентации

UPDATE 2:

Некоторые лексема код (прибывающий из NSNotification) для людей, которые не умеют читать и чувствовать необходимость downvote без.

CMDeviceMotion *data = [[note userInfo] valueForKey:@"data"]; 
CMQuaternion quat = data.attitude.quaternion; 
CGFloat roll = atan2(2*(quat.y*quat.w - quat.x*quat.z), 1 - 2*quat.y*quat.y - 2*quat.z*quat.z); 

CGFloat pitch = atan2(2*(quat.x*quat.w + quat.y*quat.z), 1 - 2*quat.x*quat.x - 2*quat.z*quat.z); 
CGFloat yaw = 2*(quat.x*quat.y + quat.w*quat.z); 


NSLog(@" - - "); 
NSLog(@"raw roll: %f",roll); 
NSLog(@"raw pitch: %f",pitch); 
NSLog(@"raw yaw: %f",yaw); 

NSLog(@"q.x: %f",quat.x); 
NSLog(@"q.y: %f",quat.y); 
NSLog(@"q.z: %f",quat.z); 
NSLog(@"q.w: %f",quat.w); 

Запуск с startDeviceMotionUpdatesToQueue в AppDelegate.

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

Это аналогичный вопрос без удовлетворительного ответа (или любой код в вопросе: |) CMDeviceMotion yaw values unstable when iPhone is vertical

+0

Если у вас есть код, который не работает так, как вы ожидаете, _show_ ваш код. Ваш вопрос говорит только о самых неопределенных общностях; кто знает, что вы делаете, или даже в чем проблема? – matt

+0

Код не там, где проблема. Я сделал расчет с использованием CMQuaternions, как я сказал, но выход устройства отличается и нестабилен на основе ориентации на запуск - как это связано с моим кодом? – Martin

+0

«Как это связано с моим кодом?» Потому что единственный способ узнать, что такое «выход устройства», - это ваш код. – matt

ответ

0

мой рулет код работает отлично

Ваш «рулет код» не работает в совершенстве. У вас не должно быть никакого «кода прокрутки». В ситуации, когда вы можете получить карданный замок, не используйте углы Эйлера. Вы не можете «уменьшить» до углов Эйлера, таких как roll. Вместо этого используйте кватернионы или (проще) rotationMatrix и пребывания в этом мире. You не может «рассчитать» ваш выход из проблемы, начав с кватерниона и конвертировать в угол Эйлера. И это именно то, что вы пытаетесь сделать. Если вы считаете, что это возможно, вы не поняли, что такое карданный замок (или как работает atan).

+0

Я использую кватернионы для вычисления по этой причине. Если я прослежу все числа, я получаю разные наборы, которые реагируют на опрокидывание в сторону, если я начну в ландшафте, но один последовательный набор действий, если я начну с портрета. – Martin