Я не думаю, что это проблема 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, но ничто не останавливает мерцание.