【发布时间】:2018-02-23 20:02:11
【问题描述】:
我有一个使用 SceneKit 的 AR 应用程序,并使用 AVPlayer 将视频导入场景,从而将其添加为 SKVideo 节点的子节点。
视频应该是可见的,但视频的透明度没有实现。
代码如下:
let spriteKitScene = SKScene(size: CGSize(width: self.sceneView.frame.width, height: self.sceneView.frame.height))
spriteKitScene.scaleMode = .aspectFit
guard let fileURL = Bundle.main.url(forResource: "Triple_Tap_1", withExtension: "mp4") else {
return
}
let videoPlayer = AVPlayer(url: fileURL)
videoPlayer.actionAtItemEnd = .none
let videoSpriteKitNode = SKVideoNode(avPlayer: videoPlayer)
videoSpriteKitNode.position = CGPoint(x: spriteKitScene.size.width / 2.0, y: spriteKitScene.size.height / 2.0)
videoSpriteKitNode.size = spriteKitScene.size
videoSpriteKitNode.yScale = -1.0
videoSpriteKitNode.play()
spriteKitScene.backgroundColor = .clear
spriteKitScene.addChild(videoSpriteKitNode)
let background = SCNPlane(width: CGFloat(2), height: CGFloat(2))
background.firstMaterial?.diffuse.contents = spriteKitScene
let backgroundNode = SCNNode(geometry: background)
backgroundNode.position = position
backgroundNode.constraints = [SCNBillboardConstraint()]
backgroundNode.rotation.z = 0
self.sceneView.scene.rootNode.addChildNode(backgroundNode)
// Create a transform with a translation of 0.2 meters in front of the camera.
var translation = matrix_identity_float4x4
translation.columns.3.z = -0.2
let transform = simd_mul((self.session.currentFrame?.camera.transform)!, translation)
// Add a new anchor to the session.
let anchor = ARAnchor(transform: transform)
self.sceneView.session.add(anchor: anchor)
在这种情况下,实现Triple_Tap_1 视频透明度的最佳方式是什么?
我已经解决了一些关于这个主题的堆栈溢出问题,并发现唯一的解决方案是在 2013 年使用 Objective C 创建的 KittyBoom 存储库。
我希望社区可以为这个问题找到更好的解决方案。 GPUImage library 不是我可以去工作的。
【问题讨论】:
-
您可以尝试执行以下操作:创建具有素材透明蒙版的视频;添加到
material.transparent.contents;使用表面着色器修改器,该修改器将使用_surface.transparent从_surface.diffuse中“切出 alpha”。如果这听起来对您来说是一个合理的解决方案,我会详细说明。 -
请。会有很大帮助。
-
请注意,在最新版本的 SceneKit 中使用
SKScene和SKVideoNode是不必要的。您可以直接将AVPlayer设置为SCNMaterialProperty实例的内容。