如何使用iOS 11中的Scenekit -Arkit动态创建3D对象的注释



我正在努力使用与此相似的 overlaySKScene创建注释(https://sketchfab.com/models/1144d7be20434e8387a2f0e311eca9b1#)。我遵循https://github.com/halmueller/immersiveinterfaces/tree/master/tracking overlay创建覆盖。

但是在提供的示例中,它们仅创建一个注释,这是静态的。我想根据我们拥有的子节点的数量动态创建多个注释,并且应该能够将注释放在各个子节点之上。如何实现这一目标?

我正在添加如下所示的覆盖层,

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

在其中添加了两个childnodes以创建一个注释的情况下,InformationOverLayscene是SKScene

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

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场景作为材料。您可以在这里找到一个例子。

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

相关内容

  • 没有找到相关文章

最新更新