get pitch, yaw, roll desde una CMRotationMatrix

Tengo una rotura de CMRotationMatrix * y me gustaría get el tono, el guiñada, el rollo de la matriz. ¿Alguna idea de cómo podría hacer eso?

Gracias

Es mejor usar el Quaternion que los angularjs de Euler … Los valores de roll, pitch y yaw pueden derivarse de quaternion usando estas fórmulas:

roll = atan2(2*y*w - 2*x*z, 1 - 2*y*y - 2*z*z) pitch = atan2(2*x*w - 2*y*z, 1 - 2*x*x - 2*z*z) yaw = asin(2*x*y + 2*z*w) 

Se puede implementar como:

 CMQuaternion quat = self.motionManager.deviceMotion.attitude.quaternion; myRoll = radiansToDegrees(atan2(2*(quat.y*quat.w - quat.x*quat.z), 1 - 2*quat.y*quat.y - 2*quat.z*quat.z)) ; myPitch = radiansToDegrees(atan2(2*(quat.x*quat.w + quat.y*quat.z), 1 - 2*quat.x*quat.x - 2*quat.z*quat.z)); myYaw = radiansToDegrees(asin(2*quat.x*quat.y + 2*quat.w*quat.z)); 

donde radianstoDegrees es una directiva de preprocesador implementada como:

 #define radiansToDegrees(x) (180/M_PI)*x 

Esto se hace para convertir los valores radianes dados por las fórmulas, a grados.

Puede encontrar más información sobre la conversión aquí: tinkerforge y aquí: Conversión entre cuaterniones y angularjs de Euler .

pitch, yaw, roll desde la matriz. ¿Alguna idea de cómo podría hacer eso?

En que order Pitch, yaw and roll, comúnmente llamados angularjs de Euler, no representan rotaciones sin ambigüedad. Dependiendo del order en que realice las subrotaciones individuales, termina con matrices de rotation completamente diferentes.

Mi recomendación personal: no uses angularjs de Euler en absoluto, solo requieren problemas (numéricos). Usa una matriz (ya lo haces) o un cuaternión.

Lo descubrí yo mismo:

 CMAttitude *currentAttitude = motionManager.deviceMotion.attitude; if (currentAttitude == nil) { NSLog(@"Could not get device orientation."); return; } else { float PI = 3.14159265; float yaw = currentAttitude.yaw * 180/PI; float pitch = currentAttitude.pitch * 180/PI; float roll = currentAttitude.roll * 180/PI; }