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

℡╲_俬逩灬. 提交于 2019-12-06 12:03:54

问题


I am working on creating annotations using overlaySKScene something similar to this(https://sketchfab.com/models/1144d7be20434e8387a2f0e311eca9b1#). I followed https://github.com/halmueller/ImmersiveInterfaces/tree/master/Tracking%20Overlay to create the overlay.

But in the provided example, they are creating only one annotation and it is static. I want to create multiple annotations dynamically based on the number of child nodes we have and also should be able to position annotation on top of respective child node. How to achieve this?

I am adding overlay like below,

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

where InformationOverlayScene is the SKScene in which i have added two childnodes to create one annotation.


回答1:


Create an array with the annotation sprites that is mapped to the childnodes array, and then do something like the following:

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))
    }
}

Before every frame is rendered this updates the position of an SKSprite (in healthBars) for each SCNNode in inBattleChars. The key part is where projectPoint is used to get the SK overlay scene's 2D position based on the SCNNode in the 3D scene.

To prevent the annotations of non-visible nodes from showing up (such as childnodes on the back side of the parent object) use the SCNRenderer’s nodesInsideFrustum(of:) method.




回答2:


You can add a SKScene or a CALayer as a material property.

You could create a SCNPlane with a specific width and height and add a SpriteKit scene as the material. You can find an example here.

Then you just position the plane where you want it to be and create and delete the annotations as you need them.



来源:https://stackoverflow.com/questions/46298338/how-to-dynamically-create-annotations-for-3d-object-using-scenekit-arkit-in-io

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!