我正在尝试使用CoreMotion框架构建一个增强现实应用程序。我试图摆脱Apple的pARk示例代码项目,但它仅适用于纵向模式。我需要它在景观中工作。切换到横向模式时,叠加视图中的子视图以相反的方向和错误的速度移动(它们在屏幕上移动太快或太慢)
我阅读了其他提供两种解决方案的帖子:
-
创建一个参考态度,并将该态度的反面应用于当前态度,如 CoreMotion 茶壶示例中所示。
将 姿态的四元数表示旋转 90 度
我不认为第一个会起作用,因为我的增强现实应用程序要求它被引用到真北。
我也不明白做第二件事所需的数学。
关于如何解决这个复杂问题的任何建议,我都欢迎。
你现在在增强现实应用程序中走了多远?我认为从苹果的PARk开始是苛刻的。你需要有一些先进的数学理解。但如果你这样做,为什么不呢!
你可以看看这个存储库,这是一个在纵向和横向模式下工作的增强现实项目。以下是轮换的处理方式:
- (void)deviceOrientationDidChange:(NSNotification *)notification {
prevHeading = HEADING_NOT_SET;
[self currentDeviceOrientation];
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
// Later we may handle the Orientation of Faceup to show a Map. For now let's ignore it.
if (orientation != UIDeviceOrientationUnknown && orientation != UIDeviceOrientationFaceUp && orientation != UIDeviceOrientationFaceDown) {
CGAffineTransform transform = CGAffineTransformMakeRotation(degreesToRadian(0));
CGRect bounds = [[UIScreen mainScreen] bounds];
switch (orientation) {
case UIDeviceOrientationLandscapeLeft:
transform = CGAffineTransformMakeRotation(degreesToRadian(90));
bounds.size.width = [[UIScreen mainScreen] bounds].size.height;
bounds.size.height = [[UIScreen mainScreen] bounds].size.width;
break;
case UIDeviceOrientationLandscapeRight:
transform = CGAffineTransformMakeRotation(degreesToRadian(-90));
bounds.size.width = [[UIScreen mainScreen] bounds].size.height;
bounds.size.height = [[UIScreen mainScreen] bounds].size.width;
break;
case UIDeviceOrientationPortraitUpsideDown:
transform = CGAffineTransformMakeRotation(degreesToRadian(180));
break;
default:
break;
}
[displayView setTransform:CGAffineTransformIdentity];
[displayView setTransform: transform];
[displayView setBounds:bounds];
degreeRange = [self displayView].bounds.size.width / ADJUST_BY;
}
}
您必须旋转所有注释,然后在设备旋转后旋转叠加视图!
如果你真的陷入困境,并且愿意使用另一个工具包,请尝试iPhone-AR-Toolkit。它适用于纵向和横向。