Остановить мерцание видео при рендеринге в ARKit - PullRequest
0 голосов
/ 17 июня 2020

Я не думаю, что это проблема Z-файтинга. Если это так, и вы можете решить эту проблему, я был бы очень благодарен. Видео очень плохо мерцает, как будто ARSCN и видео конкурируют.

extension ARSixController: ARSCNViewDelegate{

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

         if let imageAnchor = anchor as? ARImageAnchor {
            updateQueue.async {
                self.handleFoundImage(imageAnchor, node)
            }

         }

    }

    private func handleFoundImage(_ imageAnchor: ARImageAnchor, _ node: SCNNode) {
      let name = imageAnchor.referenceImage.name!
      print("you found a \(name) image")
      let size = imageAnchor.referenceImage.physicalSize
        updateQueue.async {
            if let videoNode = self.makeEndVideo(size: size) {
                node.addChildNode(videoNode)
                node.opacity = 0
                node.renderingOrder = -1
                node.runAction(.sequence([
                    //.wait(duration: 0),
                    //.fadeOpacity(to: 1, duration: 0.8),
                    .fadeIn(duration: 0.1)
                ])
                )
            }
        }


    }

    private func makeEndVideo(size: CGSize) -> SCNNode? {
      // 1
      guard let videoURL = Bundle.main.url(forResource: "end",
                                           withExtension: "mp4") else {
                                            return nil
      }

      // 2
      let avPlayerItem = AVPlayerItem(url: videoURL)
      let avPlayer = AVPlayer(playerItem: avPlayerItem)

        avPlayer.play()


      // 3
      NotificationCenter.default.addObserver(
        forName: .AVPlayerItemDidPlayToEndTime,
        object: nil,
        queue: nil) { notification in
          avPlayer.seek(to: .zero)
          avPlayer.play()
      }

      // 4
      let avMaterial = SCNMaterial()
      avMaterial.diffuse.contents = avPlayer

      // 5
      let videoPlane = SCNPlane(width: size.width, height: size.height)
      videoPlane.materials = [avMaterial]

      // 6
      let videoNode = SCNNode(geometry: videoPlane)
        videoNode.position.z = 0.00001
        videoNode.renderingOrder = -1
        videoNode.eulerAngles.x = -.pi / 2
      return videoNode
    }

}

Мне нужно отображать видео поверх обнаруженного изображения с точным размером изображения без какого-либо мерцания. Я не могу заставить это работать, я пробовал позиционирование по Z и рендерингOrder, но ничто не останавливает мерцание.

...