看起来这应该很简单,但我没有运气。
我想要做的是使用核心动作来跟踪手机的相机指向的位置(对于某种增强现实应用)。用户将手机指向参考点(就像拍摄照片一样)并按下按钮以“对齐”手机的位置与对象。现在,当用户将手机的相机对准其他物体时,我需要确定更换手机的高度(-90º到+90º)和方位角(0º到360º)。
CMAttitude给出的欧拉角似乎不是我需要的。我已经尝试缓存当用户点击“对齐”时获得的CMAttitude。然后当用户移动手机时,我得到一个新的CMAttitude并使用multiplyByInverseOfAttitude来确定与参考态度的差异。
- (void)checkForMotion {
CMMotionManager *motionMgr = appDelegate.motionMgr;
CMDeviceMotion *deviceMotion = motionMgr.deviceMotion;
CMAttitude *attitude = deviceMotion.attitude;
if (referenceAttitude != nil)
{
[attitude multiplyByInverseOfAttitude: referenceAttitude];
double deltaAlt = attitude.pitch;
double deltaAzm = attitude.roll;
// Do something with deltaAlt and deltaAz
}
else
{
NSLog(@"Getting new referenceAttitude");
self.referenceAttitude = attitude;
}
}
但这并没有产生正确的结果。如果手机垂直握持(长轴向上),那么deltaAlt工作正常。只要手机指向地平线(alt = 0),deltaAzm也是正确的。但是,如果手机指向(比方说)45º到天空,那么当我在方位角上移动手机时,高度分量也会改变。这两者以我无法理解的方式交织在一起。
我需要一些简单的数学来挑逗这些吗?同样,我认为这是增强现实应用程序的必要需求,但我一直无法找到任何这样做的例子。
答案 0 :(得分:1)
总的来说,你的方法对我来说听起来很合理。我认为它与Teapot演示应用程序中使用的一样。也许最简单的方法是查看它并查看它:
CMMotionManager and the Gyroscope on iPhone 4
如果您计划将来处理更复杂的动作,我建议使用艰难的方式,即四元数。是的,不是那么容易,但如果你曾经得到它,那就非常方便了。