使用Swift在SceneKit中设置视频纹理对象的布局坐标

时间:2018-03-21 19:01:12

标签: swift macos sprite-kit scenekit skspritenode

我正在创建一个由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的整个表面由视频组成?到目前为止,我只是将其显示在下面显示的单个角落中:enter image description here

编辑:看起来问题是我只是设置了飞机节点的第一个材料(而不是所有这些......)这就是我看到对方的原因3“象限”为空白。

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

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

我得到以下结果:

enter image description here

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

2 个答案:

答案 0 :(得分:1)

无需使用SKSceneSKVideoNode。您可以直接将AVPlayer设置为SCNMaterialProperty实例的内容。这样可以提高性能,避免处理SpriteKit元素的缩放和定位。

答案 1 :(得分:0)

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