我正在使用iOS核心运动框架来检测设备是否向前或向后倾斜。详情请看图:
使用俯仰值 a 可以检测到这种运动,但我无法区分向前和向后。
更多详情:
我尝试检测向前区域或向后区域是否有运动(向前和向后倾斜)(请参阅更新的草图)。
音高的问题是,如果设备处于直立位置,音高的起始值约为 1.6。当我向前或向后将其向水平部分倾斜时,该值会减少相同的值。同样的行为也适用于加速度计 y 值。
看起来我错过了整个核心运动中的一些东西。任何想法
谢谢基督徒
使用姿态俯仰,前倾和后倾是无法区分的。然而,使用四元数你可以计算音高,如果你将弧度转换为度数,
相反的半球旋转范围是0到-180。这是代码:
func radiansToDegrees(_ radians: Double) -> Double {
return radians * (180.0 / Double.pi)
}
let quat = motionData.attitude.quaternion
let qPitch = CGFloat(radiansToDegrees(atan2(2 * (quat.x * quat.w + quat.y * quat.z), 1 - 2 * quat.x * quat.x - 2 * quat.z * quat.z)))
试试这个:
// Create a CMMotionManager
CMMotionManager *mManager = [(AppDelegate *)[[UIApplication sharedApplication] delegate] sharedManager];
// Check whether the accelerometer is available
if ([mManager isAccelerometerAvailable] == YES) {
[mManager setAccelerometerUpdateInterval: .02];
[mManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
[self updateGravityWithAccelerometerX:accelerometerData.acceleration.x y:accelerometerData.acceleration.y z:accelerometerData.acceleration.z];
}];
}
这将每 0.02 秒调用一次 updateGravityWithAccelerometerData。您应该能够创建该方法并使用 NSLog 观察值的变化以破译您正在寻找的内容。我相信您正在寻找 Acceleration.y 值。
你是对的,考虑到 4 个典型象限 (http://en.wikipedia.org/wiki/Quadrant_(plane_geometry)) 和逆时针方向,音高就是这样工作的:
考虑到这看起来很明显,你无法区分手机向前倾斜或向后倾斜。
我最近在一个计算手机翻转次数的 iOS 应用程序中遇到了同样的问题。 Apple 拒绝了,所以我将其发布在 GitHub 上,可能对你有用:
您不想读取加速度计的倾斜度。加速度计用于检测运动差异。您需要陀螺仪才能确定绝对姿态(即偏航、俯仰和滚动)。就你而言,听起来你只是想滚动。
使用startDeviceMotionUpdatesToQueue,然后使用attitude.roll(前后)和attitude.pitch(左右)。这是我在 Swift 中所做的:
func motion(data: CMDeviceMotion){
let pitch = data.attitude.pitch
let roll = data.attitude.roll
let dampener:Float = -0.25 // the ball was rolling too fast
var forward_force = Float(1.6 - roll) * dampener //1.6 is vertical
var side_force = Float(pitch) * dampener // 0 is untilted when rotating cw/ccw
ballNode.physicsBody?.applyForce(SCNVector3Make(side_force, 0, forward_force), atPosition: SCNVector3Make(0, 0, 0), impulse: true)
}
通过这个,你可以根据滚动是否大于或等于1.6(近似垂直向上)来查看它是向前还是向后倾斜。
同时使用俯仰和横滚。如果滚动(从 -180 度到 180 度变化)小于 -90 度或大于 90 度,则面朝下。当设备的俯仰超过顶部(达到 90 度,然后继续减小)时,滚动切换表示相当于 180 度翻转。在两者之间,即使方向锁已启用,您也可以确定设备面向的方向。