我正在尝试使用 SKVideoNode 作为 SCNView 中 SCNSphere 的视频纹理源
我正在关注这个答案:
SKVideoNode(嵌入在 SKScene 中)作为场景套件节点的纹理不起作用 https://stackoverflow.com/questions/32794733/skvideonode-embedded-in-skscene-as-texture-for-for-scene-kit-node-not-working
通过我的代码(粘贴在问题末尾),我确实可以播放视频和音频。
问题是,映射仅发生在球体的四分之一(所有 xy 正四分之一)上。
cameraNode 位于 (0,0,0) 球体内部并且独立于 sphereNode。
我确实对球体节点应用了比例,只是为了反转纹理的节点:
sphereNode.scale = SCNVector3Make(-1, 1, 1)
但注释掉没有任何效果。
这都是在设备上测试的(iphone 6+,使用 iOS 9.1):
let sphere = SCNSphere(radius: 1)
.
.
.
func setupView() {
// setup the sphere
sphere.segmentCount = 55
// sphere material
sceneMaterial = SCNMaterial()
// setup the sphereNode
sphereNode = SCNNode(geometry: sphere)
sphereNode.position = SCNVector3Make(0, 0, 0)
sphereNode.scale = SCNVector3Make(-1, 1, 1)
let apperture = 75.0
// setup the camera
camera = SCNCamera()
camera.xFov = apperture
camera.zFar = 10000
camera.yFov = apperture
camera.zNear = 0.5
camera.aperture = 1/10
cameraNode.position = SCNVector3Make(0, 0, 0)
cameraNode.camera = camera
// light node
let lightNode = SCNNode()
lightNode.position = SCNVector3Make(0, 0, 0)
// light
let ambientLight = SCNLight()
ambientLight.type = SCNLightTypeAmbient
ambientLight.color = UIColor(white: 0.7, alpha: 1)
lightNode.light = ambientLight
// add top sceneView
topScene.scene = scene
bottomScene.scene = scene
// setup the sceneView
scene.rootNode.addChildNode(sphereNode)
scene.rootNode.addChildNode(cameraNode)
// video reader
let path = NSBundle.mainBundle().pathForResource("tb", ofType: "mp4")
let url = NSURL(fileURLWithPath: path!)
let asset = AVURLAsset(URL: url,options: nil)
let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer(playerItem: playerItem)
let videoNode = SKVideoNode(AVPlayer: player)
// check the sizes
let size = CGFloat(1000.0)
let spriteScene = SKScene(size: CGSizeMake(size,size))
videoNode.size.width = size
videoNode.size.height = size
spriteScene.addChild(videoNode)
// the image
sceneMaterial.specular.contents = UIColor.whiteColor()
sceneMaterial.doubleSided = true
sceneMaterial.shininess = 1
sceneMaterial.diffuse.contents = spriteScene
sphere.materials = [sceneMaterial]
videoNode.play()
}