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