gpt4 book ai didi

ios - 核心运动 : how to tell which way is "up"?

转载 作者:行者123 更新时间:2023-11-29 10:37:03 26 4
gpt4 key购买 nike

我正在尝试复制 Compass 应用程序中的功能 - 但我卡在了一个特定的位置:我如何确定界面中的“向上”方向?

我在屏幕上有一个标签,并且我有以下代码可以在设备四处移动时使其保持水平:

self.motionManager = CMMotionManager()
self.motionManager?.gyroUpdateInterval = 1/100
self.motionManager?.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue(), withHandler: { (deviceMotion, error) -> Void in
let roll = -deviceMotion.attitude.roll
self.tiltLabel?.transform = CGAffineTransformRotate(CGAffineTransformIdentity, CGFloat(roll))
})

这个效果非常好,但有几个状态是错误的 - 例如,当 iPhone 的闪电接口(interface)朝上时,标签会不规则地翻转。

我如何使用 CoreMotion 始终如一地判断哪个方向向上?

更新:显然,roll/pitch/yaw 是 Euler angles ,患有gimbal lock - 所以我认为正确的解决方案可能涉及使用 quaternions ,它不会遇到这个问题,或者 CMAttitude 上的 rotationMatrix 可能会有所帮助:https://developer.apple.com/library/ios/documentation/CoreMotion/Reference/CMAttitude_Class/index.html

最佳答案

对于 2D 情况,它不需要那么复杂。 “向上”的意思是“反重力”,所以:

motionManager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue()) { (motion, error) in
// Gravity as a counterclockwise angle from the horizontal.
let gravityAngle = atan2(Double(motion.gravity.y), Double(motion.gravity.x))

// Negate and subtract π/2, because we want -π/2 ↦ 0 (home button down) and 0 ↦ -π/2 (home button left).
self.tiltLabel.transform = CGAffineTransformMakeRotation(CGFloat(-gravityAngle - M_PI_2))
}

但是,如果您尝试在所有 3 个维度上执行此操作,那么简单的“反重力”意义不大:重力方向不会告诉您任何有关手机围绕重力矢量的角度的信息(如果您的手机正面朝上,则为偏航角)。要在三个维度上进行校正,我们可以改用滚动、俯仰和偏航测量:

// Add some perspective so the label looks (roughly) the same,
// no matter what angle the device is held at.
var t = self.view.layer.sublayerTransform
t.m34 = 1/300
self.view.layer.sublayerTransform = t

motionManager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue()) { (motion, error) in
let a = motion.attitude
self.tiltLabel.layer.transform =
CATransform3DRotate(
CATransform3DRotate(
CATransform3DRotate(
CATransform3DMakeRotation(CGFloat(a.roll), 0, -1, 0),
CGFloat(a.pitch), 1, 0, 0),
CGFloat(a.yaw), 0, 0, 1),
CGFloat(-M_PI_2), 1, 0, 0) // Extra pitch to make the label point "up" away from gravity
}

关于ios - 核心运动 : how to tell which way is "up"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26353336/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com