Как добавить узел метки и изображение пользователя в SCNNode с помощью действия жеста в ARKit? - PullRequest
0 голосов
/ 05 июля 2018

На самом деле я работаю с обнаружением изображения визитной карточки, чтобы показать там свой бизнес-профиль. Я уже добился обнаружения изображений, плоской анимации. Вот мой вопрос, когда изображение, обнаруженное вместе с плоскостью, должно показывать метку имени пользователя, профиль и веб-сайт. Я пытаюсь показать метку имени пользователя, но я сделал в SCNText. Как я могу сделать, используя SCNNode метку пользователя IAMGE.

Вот код, который я попробовал:

guard let imageAnchor = anchor as? ARImageAnchor else {return}
if let imageName  = imageAnchor.referenceImage.name {

    print(imageName)

    if imageName == "card" {

   //                let planeGeometry = SCNPlane(width: 25, height: 25)
   //                planeGeometry.firstMaterial?.isDoubleSided = true
  //                planeGeometry.firstMaterial?.diffuse.contents = UIColor.blue.withAlphaComponent(0.5)
         //--
        let plane = SCNPlane(width: 4,
                                 height: 10)
        plane.firstMaterial?.diffuse.contents = UIColor.init(red: 0, green: 189, blue: 255, alpha: 0.88)
        plane.cornerRadius = 0.25

        let planeNode = SCNNode(geometry: plane)
        planeNode.opacity = 0.25
        planeNode.eulerAngles.x = -.pi / 2
   //                planeNode.position = SCNVector3(x:0, y:0, z:2)
        planeNode.runAction(SCNAction.moveBy(x: 0, y: 0, z: 5, duration: 0.5))


        let nameText = SCNText()
        nameText.firstMaterial?.diffuse.contents = "Gowdhaman"
        nameText.font = UIFont(name: "Avenir-medium", size: 16)
        nameText.firstMaterial?.diffuse.contents = UIColor.red
        nameText.firstMaterial?.diffuse.contents = SCNVector3.init(0, 0, 0)
     //            nameText.firstMaterial?.diffuse.contents =

     //                nameText.firstMaterial?.diffuse.contents = SCNAction.moveBy(x: 0, y: 0, z: 5, duration: 1)

        let nameLabelNode = SCNNode(geometry: nameText)
        let eulerAngles = 
    self.sceneView.session.currentFrame?.camera.eulerAngles

        nameLabelNode.eulerAngles = SCNVector3((eulerAngles?.x)!, 
   (eulerAngles?.y)!, (eulerAngles?.z)! - .pi/6)

        planeNode.addChildNode(nameLabelNode)
        node.addChildNode(planeNode)

        self.sceneView.scene.rootNode.addChildNode(node)



    }

}

1 Ответ

0 голосов
/ 14 августа 2018

Я сейчас работаю над очень похожим проектом! Одна вещь, которую я попробовал, это создать SCNPlane, а затем установить его содержимое на изображение внутри функции рендерера

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {

        let node = SCNNode()

        ......

        // create a plane to contain the image
        let profilePlane = SCNPlane(width: 0.035, height: 0.035)

        // Add the profile picture file in your assets folder to the contents of your plane
        profilePlane.firstMaterial?.diffuse.contents = "ProfilePictureName"

        let profilePlaneNode = SCNNode(geometry: profilePlane) 

        node.addChildNode(profilePlaneNode)

}

С этим кодом будет появляться квадрат в центре imageAnchor, поэтому вам нужно будет отрегулировать несколько вещей после

...