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

问题描述:

我有移动的物体,我想能够与我碰撞玩家。我有能力通过在当时获得我当前的位置/方向从我发射物体,但我不知道如何将一个物体附加到我身上,随时都会遵循我的定位。如何用ARKit Swift将对象附加到相机位置?

+2

您在ARKit中使用哪种显示技术? SceneKit? SpriteKit?统一?等... – rickster

+1

我使用SceneKit作为我的显示技术。 – JoshKopen

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

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

即使在您自己不创建相机的场景中(例如,当SceneKit和ARKit为您管理相机时),您也可以通过视图的pointOfView属性获取包含当前相机的节点。 (注:ARSCNViewSCNView一个子类,其大部分有用的API由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!) 

节点将跟随你的相机,你去任何地方。

+0

如果您想将对象添加到相机的节点层次结构中,但是如果想将其添加到标准sceneView的节点层次结构中,那么这非常有用,那么我推荐这种方法使SCNNode始终位于相机的前面:https:/ /*.com/questions/42029347/position-a-scenekit-object-in-front-of-scncameras-current-orientation/42030679#42030679 – edenwaith

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

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

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