使用 swift 3 在 IOS 10 coremotion 中选择姿态参考系

Posted

技术标签:

【中文标题】使用 swift 3 在 IOS 10 coremotion 中选择姿态参考系【英文标题】:selecting attitude reference frame in IOS 10 coremotion using swift 3 【发布时间】:2016-10-14 15:30:17 【问题描述】:

我正在尝试使用 CMMotionManager 来更新 scenekit 中摄像机视点的姿态。我可以使用默认的工作引用获得以下代码。

manager.deviceMotionUpdateInterval = 0.01
manager.startDeviceMotionUpdates(to: motionQueue, withHandler: deviceManager, error in
                if (deviceManager?.attitude) != nil 
                    let rotation = deviceManager?.attitude.quaternion

                    OperationQueue.main.addOperation 
                        self.cameraNode.rotation = SCNVector4(rotation!.x,rotation!.y,rotation!.z,rotation!.w)
                    
                

        )

但是我无法让 startDeviceMotionUpdates 与选定的参考框架一起工作,如下所示:

manager.deviceMotionUpdateInterval = 0.01
manager.startDeviceMotionUpdates(using: CMAttitudeReferenceFrameXMagneticNorthZVertical, to: motionQueue, withHandler: deviceManager, error in
            if (deviceManager?.attitude) != nil 
                let rotation = deviceManager?.attitude.quaternion

                OperationQueue.main.addOperation 
                    self.cameraNode.rotation = SCNVector4(rotation!.x,rotation!.y,rotation!.z,rotation!.w)
                
            

        )

我收到的错误是:

Use of unresolved identifier 'CMAttitudeReferenceFrameXMagneticNorthZVertical'

我也收到其他参考帧的类似错误消息。任何人都可以阐明 startDeviceMotionUpdates 函数的“使用:”参数的使用吗?我发现的所有示例都是针对旧版本的 swift 或 Objective c,因此很可能这只是不理解 Swift 3 语法的问题。

【问题讨论】:

【参考方案1】:

经过一些额外的摆弄后,我发现 using 参数需要新的 CMAttitudeReferenceFrame 结构的成员。即它应该被传递为:

manager.deviceMotionUpdateInterval = 0.01
manager.startDeviceMotionUpdates(using: CMAttitudeReferenceFrame.xMagneticNorthZVertical
            ,to: motionQueue, withHandler:
            deviceManager, error in
            if (deviceManager?.attitude) != nil 
                let rotation = deviceManager?.attitude.quaternion

                OperationQueue.main.addOperation 
                    self.cameraNode.rotation = SCNVector4(rotation!.x,rotation!.y,rotation!.z,rotation!.w)
                
            

        )

这是对早期版本的更改,允许直接使用常量,例如“CMAttitudeReferenceFrameXMagneticNorthZVertical”

【讨论】:

以上是关于使用 swift 3 在 IOS 10 coremotion 中选择姿态参考系的主要内容,如果未能解决你的问题,请参考以下文章

UITableView indexPathForCell:在iOS10中使用Xcode8(Swift2.3)返回nil

如何在 iOS 10 Swift 3 中初始化 NSFetchedResultsController

在通知标题中显示函数结果(Swift 3,iOS10)[关闭]

如何在 Xcode 8 和 iOS 10 中使用 AFNetworking 类和 Swift 3 上传图像

在 Swift 3 中检测 iOS9 和 iOS10 上的屏幕锁定或主页按钮按下

我如何通过 swift 2.3 项目支持 iOS 版本 10.3