哪个图像被用作 ARSceneView 中的参考?

Which image is being used as reference in ARSceneView?

我目前正在制作一个使用图像跟踪的 AR 应用程序。 我希望它在参考图像文件夹中有 2 张图像(图像 A:~670x210,图像 B:~1123x794)。

如何查看摄像头检测到的是哪张图片? 例如,如果相机看到的是图像 A - 我想制作一个两倍于物理对象大小的平面,如果它看到的是图像 B - 我想制作一个与物理对象大小相同的平面。

如果需要,这是我的代码片段:


    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        // Create a session configuration
        let configuration = ARImageTrackingConfiguration()

        if let trackedImage = ARReferenceImage.referenceImages(inGroupNamed: "ARpaperImage", bundle: Bundle.main) {

            configuration.trackingImages = trackedImage
            configuration.maximumNumberOfTrackedImages = 1

        }

        // Run the view's session
        sceneView.session.run(configuration)
    }


    // MARK: - ARSCNViewDelegate

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

        let node = SCNNode()

        if let imageAnchor = anchor as? ARImageAnchor {


            let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)
            plane.firstMaterial?.diffuse.contents = UIColor(white: 1.0, alpha: 0,5)

            let planeNode = SCNNode(geometry: plane)

            planeNode.eulerAngles.x = -.pi / 2

            node.addChildNode(planeNode)

        }

        return node

    }


ARReferenceImage 有一个 name 属性,您可以使用它来确定检测到哪个 ReferenceImage,这很简单:

A descriptive name for the image

因此,当您将 ARReferenceImages 放入您的资源包时,您可以并且(可能已经)给它们命名,例如:

您可以在以下委托回调中使用这些名称来处理您的要求。

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) 

因此让我们假设我们有两个 ARReferenceImages 叫做 Brown 和 Choco。使用这些名称,我们可以创建逻辑来显示不同的内容,例如:

  //-------------------------
  //MARK: - ARSCNViewDelegate
  //-------------------------

  extension ViewController: ARSCNViewDelegate{

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

      //1. Check We Have Detected An ARImageAnchor
      guard let validAnchor = anchor as? ARImageAnchor, let referenceImageName = validAnchor.referenceImage.name else { return }

      //2. Get The Physical Size Of The Reference Image (This Is Specificed When You Create Your Target In The ARResource Bundle)
      let physicalSizeOfReferenceImage = CGSize(width: validAnchor.referenceImage.physicalSize.width, height: validAnchor.referenceImage.physicalSize.height)

      ///3. Log The Data For Debugging Purposes
      print("""
        Detected ARAnchorID = \(validAnchor.identifier)
        Detected Reference Image Name = \(referenceImageName)
        Detected Reference Image Physical Size = (width) \(physicalSizeOfReferenceImage.width),
        Detected Reference Image Physical Size = (height) \(physicalSizeOfReferenceImage.height)
        """)


      //4. Perform Instanciation & Other Login Based On The Reference Image Detected
      if referenceImageName == "Brown"{

        node.addChildNode(planeNodeOfSize(CGSize(width: physicalSizeOfReferenceImage.width * 2, height: physicalSizeOfReferenceImage.height * 2)))

      }else if referenceImageName == "Choco"{

        node.addChildNode(planeNodeOfSize(CGSize(width: physicalSizeOfReferenceImage.width, height: physicalSizeOfReferenceImage.height)))

      }
    }

    /// Generates An SCNNode With An SCNPlaneGeometry Of A Specified Width & Height
    ///
    /// - Parameter size: CGSize
    /// - Returns: SCNNode
    func planeNodeOfSize(_ size: CGSize) -> SCNNode{

      //1. Create An SCNPlane Of Our Chosen Size
      let planeNode = SCNNode()
      let planeGeometry = SCNPlane(width: size.width, height: size.height )
      planeGeometry.firstMaterial?.diffuse.contents = UIColor.white
      planeNode.opacity = 0.25
      planeNode.geometry = planeGeometry

      //2. Rotate The PlaneNode To Horizontal
      planeNode.eulerAngles.x = -.pi/2

      //3. Return Our Node
      return planeNode
    }

  }

希望对您有所帮助...