如何使SCNNode面对当前摄像机位置?

时间:2019-06-15 17:24:02

标签: swift scenekit arkit

我目前正在编程一个AR-App,该应用程序首先放置一个SCNNode(表)。首先,应用程序搜索水平面,每当找到一个表面时,都会显示该对象,但尚未放置该对象。虽然未放置它,但我希望物体始终面对相机,但是我很难找到相机的当前位置,而且每帧都要更新物体。

当前,该对象面向世界坐标。因此,当我启动该应用程序并找到一个水平面时,该对象就会出现并面向世界坐标的起点(无论我在哪里启动该应用程序)

有人可以帮助我,如何从摄像机位置获取矢量并让对象每帧更新其方向?

var tableNode : SCNNode!  // Node of the actual table

var trackingPosition = SCNVector3Make(0.0, 0.0, 0.0)

let trans = SCNMatrix4(hitTest.worldTransform)

self.trackingPosition = SCNVector3Make(trans.m41, trans.m42, trans.m43)

self.tableNode.position = self.trackingPosition

2 个答案:

答案 0 :(得分:0)

您要实现的功能称为广告牌。要实现此效果,您需要使用场景的SCNLookAtConstraint作为目标来设置.pointOfView

您可以删除

self.trackingPosition = SCNVector3Make(trans.m41, trans.m42, trans.m43)
self.tableNode.position = self.trackingPosition

并使用:

// set constraint to force the node to always face camera
let constraint = SCNLookAtConstraint(target:sceneView.pointOfView)
constraint.isGimbalLockEnabled = true
self.tableNode.constraints = [constraint] // constraint can cause node appear flipped over X axis

答案 1 :(得分:0)

您应该实现ARSCNViewDelegate并使用渲染器方法renderer(_:updateAtTime:),使每一帧都从sceneView.pointOfView获取摄像机位置。这样,您便可以使用SCNNode方法look(at:)将节点的坐标系转换为相机。

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
        if let camera = sceneView.pointOfView {
           tableNode.look(at: camera.worldPosition)
        }
}