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