SceneKit 中视频纹理对象的布局坐标 Swift

Layout coordinates for a video-texture object in SceneKit with Swift

我正在创建一个 SCNNode 实例,它包含一个 SCNPlane 类型的几何图形,并在节点表面播放视频。这是我目前所拥有的:

    let plane = SCNPlane(width: 5, height: 5)
    node = SCNNode(geometry: plane)
    GlobalScene.shared.rootNode.addChildNode(node!)

    let urlStr = Bundle.main.path(forResource: "test", ofType: "mov")
    videoURL = NSURL(fileURLWithPath: urlStr!)
    player = AVPlayer(playerItem: AVPlayerItem(url: videoURL! as URL))
    let videoNode = SKVideoNode(avPlayer: player!)
    player?.actionAtItemEnd = .none

    let spritescene = SKScene(size: CGSize(width: 122, height: 431))
    videoNode.size.width=spritescene.size.width
    videoNode.size.height=spritescene.size.height
    spritescene.addChild(videoNode)

    plane.firstMaterial?.diffuse.contents = spritescene

目前的整体功能非常好!我想弄清楚的是,如何让 node 的整个表面由视频组成?到目前为止,我只让它出现在如下所示的单个角中:

编辑:看起来问题是我只设置了平面节点的第一个material(而不是所有的...)这就是为什么我看到其他 3 "quadrants" 为空白。

EDIT2:第一个结论可能不正确 - 如果我设置:

    plane.firstMaterial?.diffuse.contents = NSColor.green

我得到以下结果:

所以...为什么在应用 SpriteKit 场景的内容时不起作用?

在这个 gist 的帮助下,我能够解决我的问题;最终涉及正确缩放视频节点以及正确设置位置。我的工作代码如下:

    GlobalScene.shared.rootNode.addChildNode(node!)

    let urlStr = Bundle.main.path(forResource: "test", ofType: "mov")
    videoURL = NSURL(fileURLWithPath: urlStr!)
    player = AVPlayer(playerItem: AVPlayerItem(url: videoURL! as URL))
    videoSpriteKitNode = SKVideoNode(avPlayer: player!)
    player?.actionAtItemEnd = .none
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(self.playerItemDidReachEnd),
        name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
        object: player?.currentItem)


    let spriteKitScene = SKScene(size: CGSize(width: 1276.0 / 2.0, height: 712.0 / 2.0))
    videoSpriteKitNode?.size.width=spriteKitScene.size.width
    videoSpriteKitNode?.size.height=spriteKitScene.size.height
    node?.geometry?.firstMaterial?.diffuse.contentsTransform = SCNMatrix4Translate(SCNMatrix4MakeScale(1, -1, 1), 0, 1, 0)

    videoSpriteKitNode?.position = CGPoint(x: spriteKitScene.size.width / 2.0, y: spriteKitScene.size.height / 2.0)

    videoSpriteKitNode?.size = spriteKitScene.size

    videoSpriteKitNode?.play()
    spriteKitScene.addChild(videoSpriteKitNode!)

    plane?.firstMaterial?.diffuse.contents = spriteKitScene

不需要使用 SKSceneSKVideoNode。您可以直接将 AVPlayer 设置为 SCNMaterialProperty 实例的内容。这将允许更好的性能,并将避免必须处理 SpriteKit 元素的缩放和定位。