Rendering a SceneKit scene to video output

前端 未结 4 663
隐瞒了意图╮
隐瞒了意图╮ 2020-12-12 23:17

As a primarily high-level/iOS dev, I\'m interested in using SceneKit for animation projects.

I\'ve been having fun with SceneKit for some months now, despite it obvi

4条回答
  •  夕颜
    夕颜 (楼主)
    2020-12-12 23:53

    You can do it this way with a SKVideoNode you put into a SKScene that you use to map as a SCNode's SCMaterial.Diffuse.Content (Hope that's clear ;) )

    player = AVPlayer(URL: fileURL!)
    let videoSpriteKitNodeLeft = SKVideoNode(AVPlayer: player)
    let videoNodeLeft = SCNNode()
    let spriteKitScene1 = SKScene(size: CGSize(width: 1280 * screenScale, height: 1280 * screenScale))
    spriteKitScene1.shouldRasterize = true
    
    videoNodeLeft.geometry = SCNSphere(radius: 30)
    spriteKitScene1.scaleMode = .AspectFit
    videoSpriteKitNodeLeft.position = CGPoint(
      x: spriteKitScene1.size.width / 2.0, y: spriteKitScene1.size.height / 2.0)
    videoSpriteKitNodeLeft.size = spriteKitScene1.size
    
    spriteKitScene1.addChild(videoSpriteKitNodeLeft)
    
    videoNodeLeft.geometry?.firstMaterial?.diffuse.contents = spriteKitScene1
    videoNodeLeft.geometry?.firstMaterial?.doubleSided = true
    
    // Flip video upside down, so that it's shown in the right position
    var transform = SCNMatrix4MakeRotation(Float(M_PI), 0.0, 0.0, 1.0)
    transform = SCNMatrix4Translate(transform, 1.0, 1.0, 0.0)
    
    videoNodeLeft.pivot = SCNMatrix4MakeRotation(Float(M_PI_2), 0.0, -1.0, 0.0)
    videoNodeLeft.geometry?.firstMaterial?.diffuse.contentsTransform = transform
    
    videoNodeLeft.position = SCNVector3(x: 0, y: 0, z: 0)
    
    scene.rootNode.addChildNode(videoNodeLeft)
    

    I've extracted the code from a github project of mine for a 360 video player using SceneKit to play a video inside a 3D Sphere: https://github.com/Aralekk/simple360player_iOS/blob/master/simple360player/ViewController.swift

    I hope this helps !

    Arthur

提交回复
热议问题