저는 CMMotionManager를 사용하여 장치 태도를 얻었으며 처음 시작할 때 완벽하게 작동하는 특이한 문제에 부딪 혔습니다. 그러나 멈추고 시작한 후 yaw에 대해 두 배의 숫자가 나타납니다.중지하고 다시 시작한 후 CMMotionManager가 잘못된 요를보고하는 이유는 무엇입니까?
startDeviceMotionUpdates(using: .xTrueNorthZVertical)
을 사용하여 시작하고 SceneKit 장면의 렌더링 루프에서 요 값을 확인하십시오. 전화기를 테이블 위에 놓고 90 ° 회전 시키면 편주에 90 °의 변화가 나타납니다. 완전한.
stopDeviceMotionUpdates()
을 사용하여 멈 추면 다시 시작하고 동일한 90 ° 회전을 수행하면 90 ° 동일한 변경이 일어날 것으로 예상됩니다. 하지만 대신 180 °의 회전을 보여줍니다!
이것은 처음에만 (using:)
구문으로 시작할 때 발생하는 것으로 보입니다. xCode 8.0을 사용하여 iOS 10.0.2를 사용하는 iPhone 5에서 테스트하고 있습니다.
import UIKit
import SceneKit
import CoreMotion
class GameViewController: UIViewController, SCNSceneRendererDelegate {
static let motionManager = CMMotionManager()
var scnView: SCNView!
var scnScene: SCNScene!
override func viewDidLoad() {
super.viewDidLoad()
scnView = self.view as! SCNView
scnView.delegate = self
scnScene = SCNScene()
scnView.scene = scnScene
scnView.isPlaying = true
GameViewController.motionManager.startDeviceMotionUpdates(using: .xTrueNorthZVertical)
// stop and start it again to cause doubling
GameViewController.motionManager.stopDeviceMotionUpdates()
GameViewController.motionManager.startDeviceMotionUpdates(using: .xTrueNorthZVertical)
}
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
if let motion = GameViewController.motionManager.deviceMotion {
print(Int(motion.attitude.yaw * 180/M_PI))
}
}
}
이 코드는 CMMotionManger 시작 후 즉시 중지하고 다시 시작합니다. 휴대 전화를 90 ° 회전하면 180 °의 편주를 볼 수 있습니다. 분명히 이것은 실용적인 예가 아니며 문제를 보여주는 간단한 버전 일뿐입니다. 실제로 사용하는 경우, CMMotionManager를 사용하고있는 SceneKit 뷰가 닫히면 CMMotionManager가 중지되고 다른 SceneKit 뷰가 열릴 때 CMMotionManager가 다시 시작됩니다.
제 해결 방법은 CMMotionManager를 시작한 후에는 절대로 중지하지 않는 것입니다. 작동하지만 앱에서 더 이상 기기 모션 업데이트를 처리하지 않으려면 stopDeviceMotionUpdates()를 호출해야한다고 명시된 설명서에 나와 있습니다. 따라서 위대한 해결책이 아닌 것 같습니다.
왜 멈춤과 시작 후에 CMMotionManager가 잘못된 값을 주는가? 그것을 고칠 수있는 방법은 무엇입니까?
내 실제 사용 사례에서, 내가 사용하고있는 SceneKit 뷰가 닫힐 때 CMMotionManager를 중지하고 다른 SceneKit 뷰가 열리면 다시 시작합니다. 내 질문에 예를 들어 문제를 보여주는 최소한의 예입니다. – Robert