我正在使用iOS核心动作框架来检测设备是向前还是向后倾斜。有关详细信息,请参阅图片:http://i.stack.imgur.com/2Ojw5.jpg
使用音高值a可以检测到这种运动,但我无法区分向前和向后。
更多详情:
我尝试检测前方区域或后方区域是否有移动(向前和向后倾斜)(参见更新的草图)。
音高的问题在于,如果设备处于直立位置,它的值约为1.6。当我向前或向后倾斜水平部分时,值会减小。相同的行为适用于加速度计y值。
看起来我错过了整个核心动作的东西。任何想法
感谢基督徒
答案 0 :(得分:4)
使用姿态音高,前倾和后倾是难以区分的。但是,使用四元数,您可以计算音高,如果将弧度转换为度数,
相反的旋转半球为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)))
答案 1 :(得分:0)
试试这个:
// 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值。
答案 2 :(得分:0)
你是对的,考虑到4个典型的象限(http://en.wikipedia.org/wiki/Quadrant_(plane_geometry))和逆时针方向,音调就是这样:
考虑到这一点看起来非常明显,你不能将手机向前或向后倾斜。
我最近遇到了一个iOS应用程序的同样问题,它计算了手机翻转次数。 Apple拒绝了它,所以我在GitHub上发布了它,可能对你有用:
答案 3 :(得分:0)
您不想读取加速度计的倾斜度。加速度计用于检测运动的差异。您需要陀螺仪,以便确定绝对姿态(即偏航,俯仰和滚转)。在你的情况下,听起来你只是想要滚动。
使用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,大致是直线向上。