我正在创建一个由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
的整个表面由视频组成?到目前为止,我只是将其显示在下面显示的单个角落中:
编辑:看起来问题是我只是设置了飞机节点的第一个材料(而不是所有这些......)这就是我看到对方的原因3“象限”为空白。
EDIT2 :第一个结论可能不正确 - 如果我设置:
plane.firstMaterial?.diffuse.contents = NSColor.green
我得到以下结果:
那么......为什么在应用SpriteKit
场景的内容时不会起作用?
答案 0 :(得分:1)
无需使用SKScene
和SKVideoNode
。您可以直接将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