我目前正在编程一个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
答案 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)
}
}