ARSCNView 的根节点 "heading" 与设备标题不匹配

ARSCNView's root node's "heading" doesn't match the device heading

我想要添加到场景中的节点指向北方。我从 Core Location 获取航向数据,这代表设备在我的场景创建时当前所面对的方向(因此我的根节点所面对的方向),然后我将航向添加到我的新 sceneNode's eulerAngles.y,旋转它使其面向北方。

func renderer(_ renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: TimeInterval) {
    if sceneNode == nil,
        let heading = self.locationManager.heading {
        sceneNode = SCNNode()
        sceneNode.eulerAngles.y += Float(heading).degreesToRadians
        sceneView.scene.rootNode.addChildNode(sceneNode)
    }
}

航向信息是正确的,因此将它旋转那么多确实旋转了所需的量,假设航向与我的根节点所面对的方向相同。但是我发现我的根节点的方向并不等同于设备的航向,有时可能会偏离方向。所以这意味着标题与场景节点的 "heading" 相同的假设是不正确的,我需要能够知道它离标题有多远,这样我就可以在我的 sceneNode.

将会话配置的 worldAlignment 更改为 .gravityAndHeading

使用默认 .gravity 对齐方式,AR 世界坐标系的 x 轴和 z 轴指向的位置没有绝对参考 - 它们的方向基于会话开始时设备的初始方向。

使用 .gravityAndHeading 选项,x 轴和 z 轴与罗盘方向对齐,因此您可以相对于罗盘方向安全地定位内容。