Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何规范CMDeviceMotion/CMGyroData?_Ios_User Controls_Gyroscope_Core Motion - Fatal编程技术网

Ios 如何规范CMDeviceMotion/CMGyroData?

Ios 如何规范CMDeviceMotion/CMGyroData?,ios,user-controls,gyroscope,core-motion,Ios,User Controls,Gyroscope,Core Motion,我想对设备运动进行规范化,以便用户以45度倾斜的角度手持设备时被视为中立位置(0,0,0) 这里的想法是为了在屏幕上移动精灵,获得更平滑、更自然的感觉运动 如果不进行规范化,则会出现相对运动累积的情况,在短时间后,用户必须以奇怪的方式移动/握住设备,以将精灵放回屏幕中央。成功地将精灵返回到屏幕中间,重新排序它一段时间,所以我确信所有陀螺仪旋转都与当前设备的方向有关(DOCS似乎也在这么说)。p> 我玩了一下重力,想看看是否有办法用它来猜测设备是如何定位的,并将其用作校正。我真的不确定这会有什么结

我想对设备运动进行规范化,以便用户以45度倾斜的角度手持设备时被视为中立位置(0,0,0)

这里的想法是为了在屏幕上移动精灵,获得更平滑、更自然的感觉运动

如果不进行规范化,则会出现相对运动累积的情况,在短时间后,用户必须以奇怪的方式移动/握住设备,以将精灵放回屏幕中央。成功地将精灵返回到屏幕中间,重新排序它一段时间,所以我确信所有陀螺仪旋转都与当前设备的方向有关(DOCS似乎也在这么说)。p> 我玩了一下重力,想看看是否有办法用它来猜测设备是如何定位的,并将其用作校正。我真的不确定这会有什么结果

总之,我希望定义的方向始终代表中间和所有相对于该姿态/方向应用的旋转

希望这足够清楚

这是我的班级

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))
    }
  }
}

更新:我想我有几条线索可以回答我的问题。