如何使用ARKit Swift将物体附加到相机位置?

时间:2017-06-13 21:35:21

标签: swift xcode augmented-reality arkit

我有移动的物体,我希望能够与玩家碰撞。我有能力通过获取我当前的位置/方向来启动我的物体,但我不明白如何将物体附加到我身上,这将随时跟随我的位置。

4 个答案:

答案 0 :(得分:18)

在SceneKit中,场景中可以有位置的所有内容都是(附加到)节点。这不仅包括可见物体,还包括光源和照相机。当您使用ARSCNView时,仍然是SceneKit相机,但ARKit控制其位置/方向。

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

即使在您不自己创建相机的场景中 - 例如当SceneKit和ARKit为您管理相机时 - 您也可以使用视图{{3}获取包含当前相机的节点属性。 (注意:SCNView是{{1}}的子类,其大多数有用的API都是由pointOfView协议定义的。)

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

答案 1 :(得分:9)

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

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

节点将随时随地关注您的相机。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

您需要接受Jimi的回答,并为球赋予颜色或纹理才能看到它:

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)