10

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

4

4 回答 4

23

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

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

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

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

于 2017-06-14T15:28:38.090 回答
15

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

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

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

于 2017-08-23T12:21:15.607 回答
1

你需要接受 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)
于 2018-11-16T09:02:52.613 回答
1

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

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

    let x = position?.x
    let y = position?.y
    let z = position?.z
于 2018-03-09T10:53:16.343 回答