如何在 iOS11 中使用 scenekit - ARKit 为 3D 对象动态创建注释?

How to dynamically create annotations for 3D object using scenekit - ARKit in iOS 11?

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

但在提供的示例中,他们只创建了一个注释,而且它是静态的。我想根据我们拥有的子节点的数量动态创建多个注释,并且还应该能够将注释定位在各个子节点的顶部。如何做到这一点?

我正在添加如下叠加层,

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

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

您可以添加 SKSceneCALayer 作为 material property

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

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

使用映射到子节点数组的注释精灵创建一个数组,然后执行如下操作:

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:) 方法。