如何使用scenekit动态创建3D对象的注释 – 在iOS 11中使用ARKit?

我正在使用overlaySKScene创建一个与此类似的注释( https://sketchfab.com/models/1144d7be20434e8387a2f0e311eca9b1# )。 我按照https://github.com/halmueller/ImmersiveInterfaces/tree/master/Tracking%20Overlay创建了叠加层。

但是在提供的示例中,它们只创建一个注释,它是静态的。 我想基于我们拥有的子节点的数量动态创建多个注释,并且还应该能够将注释定位在相应子节点的顶部。 怎么做到这一点?

我正在添加如下的叠加层,

  sceneView.overlaySKScene = InformationOverlayScene(size: sceneView.frame.size) 

其中InformationOverlayScene是SKScene ,我在其中添加了两个子childnodes来创建一个注释。

使用映射到childnodes数组的注释sprite创建一个数组,然后执行以下操作:

 func renderer(_ aRenderer: SCNSceneRenderer, updateAtTime time: TimeInterval) { let scnView = self.view as! SCNView //for each character for var i in 0...inBattleChars.count-1 { let healthbarpos = scnView.projectPoint(inBattleChars[i].position) battleSKO.healthbars[i].position = CGPoint(x: CGFloat(healthbarpos.x), y: (scnView.bounds.size.height-10)-CGFloat(healthbarpos.y)) } } 

在渲染每个帧之前,这将更新inBattleChars中每个SCNNode的SKSprite(在healthBars中)的位置。 关键部分是使用projectPoint根据3D场景中的SCNNode获取SK叠加场景的2D位置。

为了防止显示非可见节点的注释(例如父对象背面的子节点),请使用SCNRenderer的nodesInsideFrustum(of :)方法。

您可以添加SKSceneCALayer作为材料属性 。

您可以创建具有特定宽度和高度的SCNPlane,并添加SpriteKit场景作为材质。 你可以在这里找到一个例子。

然后,您只需将平面定位在您想要的位置,然后根据需要创建和删除注释。