Swift - 使用 motionManager 加速度计、陀螺仪和磁力计来移动 SceneKit 节点,就像 iPhone 的移动一样

标签 swift scenekit

我有一个 SceneKit SCNBox 立方体,它应该跟随我的 iphone 的所有 Action 。因此,如果我的 iPhone 横向旋转 90 或 360 度,立方体应该也旋转 90 或 360 度,如果我向前旋转我的手机,立方体应该像手机一样旋转。

我已经尝试使用 startDeviceMotionUpdatesUsingReferenceFrame,但它与我手机的移动不匹配 :(

motionManager.deviceMotionUpdateInterval = 1.0 / 60.0
        motionManager.startDeviceMotionUpdatesUsingReferenceFrame(
            CMAttitudeReferenceFrame.XArbitraryZVertical,
            toQueue: NSOperationQueue.mainQueue(),
            withHandler: { (motion: CMDeviceMotion!, error: NSError!) -> Void in

                let currentAttitude = motion.attitude
                let roll = Float(currentAttitude.roll)
                let pitch = Float(currentAttitude.pitch)
                let yaw = Float(currentAttitude.yaw)

                self.arrRoll.append(roll)
                self.arrPitch.append(pitch)
                self.arrYaw.append(yaw)

                cubeNode.eulerAngles = SCNVector3Make(roll, 0.0, 0.0)
                cubeNode.eulerAngles = SCNVector3Make(0.0, 0.0, pitch)
                cubeNode.eulerAngles = SCNVector3Make(0.0, yaw, 0.0)

        })

最佳答案

您的代码片段有点断章取义,但让我震惊的是您(很可能是无意中)覆盖了节点的 eulerAngles 属性。

为什么你有 3 个单独的分配(只有最后一个会产生影响),而不是:

cubeNode.eulerAngles = SCNVector3Make(roll, yaw, pitch)

?

关于Swift - 使用 motionManager 加速度计、陀螺仪和磁力计来移动 SceneKit 节点,就像 iPhone 的移动一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31162286/

相关文章:

objective-c - SceneKit——在两点之间画一条线

ios - 将 SceneKit 节点从 DAE 文件转换为物理体

ios - 在 ARKit 中缩放 SCNNode

ios - 如何通过 SceneKit 和模型 I/O 在 .OBJ 3d 模型上应用 .MTL 文件

swift - 发布到 Firebase 时单元格重复多次

swift - 在 swift 中覆盖受限扩展方法的推荐方法,避免消息 "Ambiguous use of ' xxx'"

swift - 使用 AVAudioEngine 的实时音频

ios - Swift Metal Shader 命令缓冲区的执行由于在执行期间将数字添加到数组值时出错而中止

swift - 谷歌驱动器与 iOS 中服务帐户的 Swift 集成

swift - SceneKit-SCNText居中错误