我试图通过使用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