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
不需要使用 SKScene
和 SKVideoNode
。您可以直接将 AVPlayer
设置为 SCNMaterialProperty
实例的内容。这将允许更好的性能,并将避免必须处理 SpriteKit 元素的缩放和定位。
我正在创建一个 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
不需要使用 SKScene
和 SKVideoNode
。您可以直接将 AVPlayer
设置为 SCNMaterialProperty
实例的内容。这将允许更好的性能,并将避免必须处理 SpriteKit 元素的缩放和定位。