SKVideoNode(嵌入在 SKScene 中)作为 Scene Kit Node 的纹理不起作用
Posted
技术标签:
【中文标题】SKVideoNode(嵌入在 SKScene 中)作为 Scene Kit Node 的纹理不起作用【英文标题】:SKVideoNode (embedded in SKScene) as texture for for Scene Kit Node not working 【发布时间】:2015-12-24 00:39:06 【问题描述】:我正在尝试使用 Scenekit 将视频作为纹理映射到 VR 项目的原始圆柱体:嵌入在 SKScene 中的 SKVideoNode 作为 SceneKit SCNTube 对象的纹理,但我无法显示视频就像静止图像一样。下面的 PLayground 代码应该生成映射到圆柱体的移动视频,但映射不起作用:
编辑:在列表末尾添加单行进行修复。下面的代码应该可以工作
import UIKit
import SceneKit // for 3D mapping
import SpriteKit // for SKVideoNode
import QuartzCore // for basic animation
import XCPlayground // for live preview
import AVFoundation // for video playback engine
// create a scene view with an empty scene
var sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
var scene = SCNScene()
sceneView.scene = scene
// start a live preview of that view
XCPShowView("The Scene View", view: sceneView)
// default lighting
sceneView.autoenablesDefaultLighting = true
// a geometry object
var tube = SCNTube(innerRadius: 1.99, outerRadius: 2, height: 3)
var tubeNode = SCNNode(geometry: tube)
scene.rootNode.addChildNode(tubeNode)
// video scene
let urlStr = NSBundle.mainBundle().pathForResource("sample", ofType: "mp4")
let url = NSURL(fileURLWithPath: urlStr!)
let asset = AVURLAsset(URL: url, options: nil)
let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer(playerItem: playerItem)
let videoNode = SKVideoNode(AVPlayer: player)
let spritescene = SKScene(size: CGSize(width: 1211, height: 431))
videoNode.size.width=spritescene.size.width
videoNode.size.height=spritescene.size.height
spritescene.addChild(videoNode)
// configure the geometry object
var myImage = UIImage.init(named: "BandImage.jpeg")
tube.firstMaterial?.diffuse.contents = spritescene
// set a rotation axis (no angle) to be able to
// use a nicer keypath below and avoid needing
// to wrap it in an NSValue
tubeNode.rotation = SCNVector4(x: 0.0, y: 1.0, z: 0.0, w: 0.0)
// animate the rotation of the torus
var spin = CABasicAnimation(keyPath: "rotation.w") // only animate the angle
spin.toValue = 2.0*M_PI
spin.duration = 3
spin.repeatCount = HUGE // for infinity
tubeNode.addAnimation(spin, forKey: "spin around")
// starts the video, solving the issue
sceneView.playing = true
【问题讨论】:
“映射不起作用”?-> 全黑?您是否尝试将 SKScene 的宽度设置为 1024?您是否尝试强制使用 GL 渲染器(请参阅 SCNView 界面构建器设置)? 全黑,即使 skscene 设置为 1024。音频播放,所以我知道电影正在播放,但没有纹理映射到表面 界面生成器?我正在代码中从头开始生成视图。 Similar SKVideoNode -> SceneKit 材质代码适用于我的设备...但不适用于模拟器。你在设备上试过了吗? 【参考方案1】:我已经在 github 上发布了我的代码(以及一些示例全景内容),供任何想要获得工作示例代码或有兴趣在开源全景视频播放器上进行合作的人使用:
https://github.com/jglasse/OSVR
事实证明,模拟器(和游乐场)似乎不支持此功能。将上面的代码移动到一个项目并在设备上运行,我终于让它工作了。
所以故事的寓意是 - 如果您使用 SKVideoNodes 作为 Scenekit 的纹理,请使用实际设备进行测试。
【讨论】:
看起来我们几乎同时发现了这个。干得好:) 现在似乎纹理只在对象移动时更新 - 当没有移动时,虽然音频继续播放,但纹理不会更新。你见过这个吗? @jglasse 你有没有解决过其他问题?纹理仅在对象移动时更新? 没有。我添加了一个不易察觉的小动作来“修复”它。尚未使用以后的 Xcode 版本进行测试以查看该错误是否已修复,但将在今天晚些时候尝试。 播放的是音频而不是视频,因为您需要设置sceneView.playing = true
。这告诉视图定期更新其纹理。以上是关于SKVideoNode(嵌入在 SKScene 中)作为 Scene Kit Node 的纹理不起作用的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 11 中将 SKVideoNode 添加到 ARKit-SceneKit?
如何在 iOS Sprite Kit SKVideoNode 中控制视频的播放?