创建一个相对于设备定位并面向真实世界标题的SCNNode

时间:2018-02-12 14:12:16

标签: ios swift arkit scnnode

我正在创建一个导航应用程序,该应用程序将使用增强现实来帮助用户导航到指定位置。

我希望在设备前面放置一个SCNNode(箭头,在这种情况下为箭头),略低于y轴。箭头将朝向用户导航到的位置。当用户四处走动时,箭头将围绕y轴旋转以保持指向导航位置。

为了让我的箭头朝向真实世界的位置,我必须设置ARWorldTrackingConfiguration.worldAlignment = .gravityAndHeading,但通过这样做,我再也无法将SCNNode相对于设备放置了&#39}。相机。

有没有办法让我的SCNNode始终在我的相机前,而且还面向真实世界的位置?

我目前的代码:

let arrowScene = SCNScene(named: "art.scnassets/arrow.dae")!
let arrowNode = arrowScene.rootNode.childNode(withName: "arrow", recursively: true)!

let loc = locationManager.location?.coordinate
let bearing = loc?.calculateBearing(to: CLLocationCoordinate2D(latitude: 36.971542, longitude: -82.558492))

arrowNode.position = SCNVector3(0.0, -1.0, 1.5)

arrowNode.transform = SCNMatrix4Mult(arrowNode.transform, SCNMatrix4MakeRotation(Float(bearing!), 0.0, 1.0, 0.0))

sceneView.scene = arrowScene

enter image description here

1 个答案:

答案 0 :(得分:1)

这对我有用:

首先,获取相机的旋转矩阵:

let rotate = simd_float4x4(SCNMatrix4MakeRotation(sceneView.session.currentFrame!.camera.eulerAngles.y, 0, 1, 0))

然后,结合矩阵:

let rotateTransform = simd_mul(r.worldTransform, arrowRotationTransform)

最后,将转换应用于您的节点,转换为SCNMatrix4:

node.transform = SCNMatrix4(rotateTransform)

希望有所帮助!!