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 轴与罗盘方向对齐,因此您可以相对于罗盘方向安全地定位内容。
我想要添加到场景中的节点指向北方。我从 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 轴与罗盘方向对齐,因此您可以相对于罗盘方向安全地定位内容。