2015-09-26 7 views
6

Ich versuche ein Video als Textur zu einem primitiven Zylinder für ein VR-Projekt mit Hilfe von Scenekit abzubilden: ein SKVideoNode eingebettet in einem SKScene als Textur für ein SceneKit SCNTube-Objekt, und ich kann einfach kein Video als Standbild anzeigen lassen. SPIELPLATZ Code unten sollte erzeugen Video Zylinder abgebildet bewegen, aber die Zuordnung funktioniert nicht:SKVideoNode (eingebettet in SKScene) als Textur für für Szene Kit Knoten funktioniert nicht

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 
+0

"Mapping funktioniert nicht"? -> ganz schwarz? hast du versucht, die Breite des SKScene auf 1024 zu setzen? Haben Sie versucht, den GL Renderer zu erzwingen (siehe Einstellungen für den SCNView Interface Builder)? – Toyos

+0

Ganz schwarz, auch wenn skscene auf 1024 eingestellt ist. Audio spielt, also weiß ich, dass der Film spielt, aber keine Zuordnung der Textur zur Oberfläche – jglasse

+0

Interface Builder? Ich erzeuge die Ansicht von Grund auf im Code. – jglasse

Antwort

4

Ich habe meinen Code geschrieben (und einige Beispiel-Panorama-Gehalt) auf Github für jeden, der einen Arbeitsbeispielcode haben will oder ist in der Zusammenarbeit an einem Open-Source-Panorama-Video-Player interessiert:

https://github.com/jglasse/OSVR

wie sich herausstellt, ist es wie Simulator (und Spielplätze) sieht diese Funktion nicht unterstützen. Den obigen Code in ein Projekt verschieben und auf einem Gerät ausführen, habe ich endlich funktioniert.

Also die Moral der Geschichte ist - Wenn Sie SKVideoNodes als Texturen für Scenekit verwenden, verwenden Sie ein tatsächliches Gerät zum Testen.

+1

Sieht aus, als hätten wir das ungefähr zur gleichen Zeit entdeckt. Gut gemacht :) –

+0

Jetzt scheint es so, als ob die Textur nur aktualisiert wird, wenn sich das Objekt bewegt - wenn es keine Bewegung gibt, während das Audio weiter abgespielt wird, wird die Textur nicht aktualisiert. hast du das gesehen? – jglasse

+0

@jglasse hast du jemals das andere Problem behoben? dass die Textur nur aktualisiert wird, wenn sich das Objekt bewegt? – Travis