swift - 如何使 UILabel 在未跟踪图像时出现在屏幕上,并在跟踪图像时消失

标签 swift uilabel augmented-reality arkit image-recognition

我正在使用 ARKit 制作一个图像识别应用程序,用户将相机指向空间中的几个不同图像,视频将在这些图像上播放。我创建了带有消息的 UILabel 以便向用户提供说明。当用户第一次打开应用程序时,我想向他们显示一条消息,告诉他们将相机对准图像。每当相机跟踪图像时,我希望 UILabel 消失。

在我的代码中,我得到了它,当跟踪图像时,我可以使标签消失,但是一旦我不再跟踪图像,我就无法让它重新出现。

extension ViewController: ARSCNViewDelegate {
    func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: 
ARAnchor) -> SCNNode? {
        let node = SCNNode()

        //Show video overlayed to image
        if let imageAnchor = anchor as? ARImageAnchor{
            DispatchQueue.main.async { self.messageView?.isHidden = 
true }
            let plane = SCNPlane(width: 
imageAnchor.referenceImage.physicalSize.width, height: 
imageAnchor.referenceImage.physicalSize.height)

            //Create Plane
            switch imageAnchor.referenceImage.name!{
            case "slaveAuction":
                //Set AVPlayer as the planes texture and play
                plane.firstMaterial?.diffuse.contents = 
self.slaveAuction
                self.slaveAuction.play()
            case "columbus":
                plane.firstMaterial?.diffuse.contents = 
self.columbus
                self.columbus.play()
            case "isabellasCourt":
                plane.firstMaterial?.diffuse.contents = 
self.isabellasCourt
                self.isabellasCourt.play()
            case "hawksbell":
                plane.firstMaterial?.diffuse.contents = 
self.hawksbell
                self.hawksbell.play()
            default:
                print("Images not found")
            }

            let planeNode = SCNNode(geometry: plane)

            // Rotate the plane to match the anchor
            planeNode.eulerAngles.x = -.pi/2

            // Add plane node to parent
            node.addChildNode(planeNode)
        }

        return node
    }

}

我需要帮助,以便在不跟踪图像时显示消息 View 。

最佳答案

使你的planeNode类变量。并检查您的节点是否每帧都可见。

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
    if let pointOfView = sceneView.pointOfView, planeNode != nil {
        let isMaybeVisible = sceneView.isNode(planeNode, insideFrustumOf: pointOfView)
        DispatchQueue.main.async {
            if isMaybeVisible{
                self.messageView.isHidden = true
            }else{
                self.messageView.isHidden = false
            }
        }
    }
}

并参见 isNode(_:insideFrustumOf:)

关于swift - 如何使 UILabel 在未跟踪图像时出现在屏幕上,并在跟踪图像时消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54118381/

相关文章:

ios - UITextField 委托(delegate) "shouldChangeCharactersIn"未调用文本字段中的第一个条目

macos - 读取 RTF 文件并解析明文

ios - Swift:TableView,循环文本数组

ios - scrollView 中的多行标签仅显示在一行中并扩展到其全宽

java - 使用 Java API 的增强现实应用程序

Swift SceneKit - 如何对齐节点的 y 轴以与某些 SCNVector3 重合?

swift - 代码 9 : Cannot convert value of type '[String : Any]' to expected argument type '[NSAttributedStringKey : Any]?'

ios - UILabel编号情况

ios - SceneKit 物理在 ARKit 中不能正常工作

android - 华为 AR 引擎 .obj 文件无法正确渲染