如何规范化CMDeviceMotion / CMGyroData?

时间:2014-07-03 17:34:19

标签: ios user-controls gyroscope core-motion

我想对设备运动进行标准化,以便将设备以45度倾斜度横向固定在中间位置(0,0,0)。

这里的想法是让在屏幕上移动精灵的动作变得更加平滑和自然。

没有标准化会发生的事情是相对运动累积的方式是在短时间之后用户必须以奇怪的方式移动/保持设备以将精灵放回屏幕的中心。成功地将精灵放回屏幕中间,重新排列"重置"它有一段时间了,所以我相当肯定所有的陀螺旋转都与设备当前的定位有关(文档似乎也是这样说的)。

我在重力方面玩了一下,看看是否有办法用它来猜测设备的方向并将其用作修正。不确定这会导致什么。

因此,总而言之,我希望定义的方向始终表示相对于此姿态/方向应用的中间和所有旋转。

希望这很清楚。

这是我的班级

import CoreMotion
import SpriteKit

let MotionManagerSharedInstance = MotionManager()

class MotionManager:CMMotionManager {
    class var sharedInstance:MotionManager {
        return MotionManagerSharedInstance
    }

   func startMotionManager() {
      if !self.deviceMotionActive {
             self.startDeviceMotionUpdatesUsingReferenceFrame(CMAttitudeReferenceFrameXArbitraryCorrectedZVertical, toQueue: NSOperationQueue.currentQueue(), withHandler: {
                deviceManager, error in

        })
    }

}

func stopMotionManager() {
    if self.deviceMotionActive {
        self.stopDeviceMotionUpdates()
    }
}

func radiansToDegrees(#radians:CGFloat, correction:CGFloat) -> CGFloat {
    return (CGFloat(radians) * CGFloat(180.0 / M_PI) / correction)
}

func updatePosition(node: SKNode) {
    if let data = self.deviceMotion {

        let rollCorrection:CGFloat = 8.0
        let pitchCorrection:CGFloat = 8.0

        let forceX = self.radiansToDegrees(radians: CGFloat(-data.rotationRate.x), correction: rollCorrection)
        let forceY = self.radiansToDegrees(radians: CGFloat(-data.rotationRate.y), correction: pitchCorrection)

        node.physicsBody.applyImpulse(CGVectorMake(forceX, forceY))
    }
  }
}

0 个答案:

没有答案