Какое изображение используется в качестве ссылки в ARSceneView? - PullRequest
0 голосов
/ 03 мая 2019

Я сейчас создаю приложение 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

    }


1 Ответ

0 голосов
/ 03 мая 2019

ARReferenceImage имеет свойство name, которое можно использовать для определения того, какой ReferenceImage был обнаружен, а именно:

Описательное имя для изображения

Таким образом, когда вы помещаете свой ARReferenceImages в свой пакет ресурсов, вы можете и (вероятно, уже) дали ему имя, например:

enter image description here

Вы можете использовать эти имена в следующем обратном вызове делегата для удовлетворения ваших требований.

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

Итак, давайте предположим, что у нас есть два ARReferenceImages, называемых Брауном и Чоко. Используя эти имена, мы можем создать логику для отображения различного контента, например:

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

  }

Надеюсь, это поможет ...

...