Глядя на ваш код и исходя из того, что вы сказали, я думаю, что вам нужно изменить свою логику, чтобы создать видео-узел, используя вместо этого свойство name
вашего ARReferenceImage
.
Когда вы создаете ARReferenceImage
либо статически (в пределах ARResourceBundle
), либо динамически, вы можете присвоить ему имя, например:
Затем вы можете использовать имена, чтобы добавить логику, чтобы назначить различное видео каждому обнаруженному referenceImage
.
И чтобы сохранить ваш код DRY
, вы можете создать функцию многократного использования для создания вашего видео узла.
Как простой пример может выглядеть примерно так:
//-------------------------
//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 else { return }
//2. Create A Video Player Node For Each Detected Target
node.addChildNode(createdVideoPlayerNodeFor(validAnchor.referenceImage))
}
/// Creates An SCNNode With An AVPlayer Rendered Onto An SCNPlane
///
/// - Parameter target: ARReferenceImage
/// - Returns: SCNNode
func createdVideoPlayerNodeFor(_ target: ARReferenceImage) -> SCNNode{
//1. Create An SCNNode To Hold Our VideoPlayer
let videoPlayerNode = SCNNode()
//2. Create An SCNPlane & An AVPlayer
let videoPlayerGeometry = SCNPlane(width: target.physicalSize.width, height: target.physicalSize.height)
var videoPlayer = AVPlayer()
//3. If We Have A Valid Name & A Valid Video URL The Instanciate The AVPlayer
if let targetName = target.name,
let validURL = Bundle.main.url(forResource: targetName, withExtension: "mp4", subdirectory: "/art.scnassets") {
videoPlayer = AVPlayer(url: validURL)
videoPlayer.play()
}
//4. Assign The AVPlayer & The Geometry To The Video Player
videoPlayerGeometry.firstMaterial?.diffuse.contents = videoPlayer
videoPlayerNode.geometry = videoPlayerGeometry
//5. Rotate It
videoPlayerNode.eulerAngles.x = -.pi / 2
return videoPlayerNode
}
}
Как вы можете видеть, я решил использовать AVPlayer
в качестве моего видеоконтента, хотя вы можете продолжать использовать вашу видеосцену, если пожелаете.
Надеюсь, это направит вас в правильном направлении ...