如何使用 ARKit Swift 将对象附加到相机位置?

How do you attach an object to your camera position with ARKit Swift?

我有移动的物体,我希望它能够与我的玩家发生碰撞。我当时有能力通过获取当前 position/direction 从我身上发射物体,但我不明白如何将一个物体附加到我身上,它会一直跟随我的定位。

在 SceneKit 中,所有可以在场景中有位置的东西都是(附加到)一个节点。这不仅包括可见物体,还包括光源和相机。当你使用 ARSCNView 时,仍然有一个 SceneKit 相机,但 ARKit 控制它的 position/orientation。

SceneKit 节点创建层次结构:每个节点的位置(和方向等)都相对于其父节点。如果父节点在场景中移动,其子节点也会随之移动,以便它们保持相同的父节点相对位置。因此,如果您希望某些内容始终保持相对于相机的相同位置,则应将该内容设为相机节点的子节点。

即使在您不自己创建相机的场景中——例如当 SceneKit 和 ARKit 为您管理相机时——您也可以使用视图的 pointOfView property. (Note: ARSCNView is a subclass of SCNView, most of whose useful API is defined by the SCNSceneRenderer 协议获取包含当前相机的节点。)

您可能需要等到会话开始 运行 才能访问 ARKit 管理的相机节点。

ARSCNView 有一个 属性 'pointOfView'。您可以将子节点附加到它。

let ball = SCNSphere(radius: 0.02)
ballNode = SCNNode(geometry: ball)
ballNode?.position = SCNVector3Make(0, 0, -0.2)
sceneView.pointOfView?.addChildNode(ballNode!)

无论您走到哪里,节点都会跟随您的相机。

下面的代码可以帮我获取相机的当前位置(x、y、z 坐标)。

    let pov = sceneView.pointOfView
    let position = pov?.position

    let x = position?.x
    let y = position?.y
    let z = position?.z

你需要采纳吉米的答案,给球一个颜色或纹理才能看到:

let ball = SCNSphere(radius: 0.02)
ball.firstMaterial?.diffuse.contents = UIColor.red
let ballNode = SCNNode(geometry: ball)
ballNode.position = SCNVector3Make(0, 0, -0.2)
self.sceneView.pointOfView?.addChildNode(ballNode)