2017-11-28 12 views
4

私はSpriteKitを使用して360度のビデオプレーヤーで遊んでいます。SceneKit and CoreMotion.プレーヤーはこれまで働いていますが、ビデオは常にズームインされます。カメラの位置が(0,0,0)ではないように見えますが、Z軸では何とか間違っています。残念ながら、私はそれを調整する方法を見出していません。ビヘイビアを再現するには、ビデオが再生され、ピンチ・ズームアウトされているときに画面をタップします。これにより、ジェスチャーによるカメラ制御が可能になり、ダブルタップはデバイスでのカメラ制御に戻ります。SceneKitとCoreMotionを使用して360度のビデオを再生するカメラ位置が間違っています

import UIKit 
import SceneKit 
import CoreMotion 
import SpriteKit 
import AVFoundation 

class Video360VC: UIViewController { 
let motionManager = CMMotionManager() 
let cameraNode = SCNNode() 
@IBOutlet weak var sceneView: SCNView! 

@IBAction func exitBtnClicked(_ sender: Any) { 
performSegueToReturnBack() 
} 

func createSphereNode(material: AnyObject?) -> SCNNode { 
    let sphere = SCNSphere(radius: 20.0) 
    sphere.firstMaterial!.isDoubleSided = true 
    sphere.firstMaterial!.diffuse.contents = material 
    let sphereNode = SCNNode(geometry: sphere) 
    sphereNode.position = SCNVector3Make(0,0,0) 
    sphereNode.rotation = SCNVector4Make(1, 0, 0, Float.pi) 
    return sphereNode 
} 

func configureScene(node sphereNode: SCNNode) { 
    // Set the scene 
    let scene = SCNScene() 
    sceneView.scene = scene 
    sceneView.showsStatistics = true 
    sceneView.allowsCameraControl = true 

    // Camera, ... 
    cameraNode.camera = SCNCamera() 
    cameraNode.position = SCNVector3Make(0, 0, 0) 
    scene.rootNode.addChildNode(sphereNode) 
    scene.rootNode.addChildNode(cameraNode) 
} 

func startCameraTracking() { 
    motionManager.deviceMotionUpdateInterval = 1.0/60.0 
    motionManager.startDeviceMotionUpdates(to: OperationQueue.main) { 
     [weak self](data: CMDeviceMotion?, error: Error?) in 
     guard let data = data else { return } 
     let attitude: CMAttitude = data.attitude 

     self?.cameraNode.eulerAngles = SCNVector3Make(- Float(attitude.roll + Double.pi/2), Float(attitude.yaw), -Float(attitude.pitch)) 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    guard let fileURL = Bundle.main.url(forResource: "360Test2", withExtension: "mp4") else { 
     print("Video File not found") 
     return 
    } 

    let player = AVPlayer(url: fileURL) 
    let videoNode = SKVideoNode(avPlayer: player) 
    let size = CGSize(width: 1280, height: 720) 
    videoNode.size = size 
    videoNode.position = CGPoint(x: size.width/2, y: size.height/2) 

    let spriteScene = SKScene(size: size) 
    spriteScene.scaleMode = .resizeFill 
    spriteScene.addChild(videoNode) 

    let sphereNode = createSphereNode(material:spriteScene) 
    configureScene(node: sphereNode) 
    guard motionManager.isDeviceMotionAvailable else { 
     fatalError("Device motion is not available") 
    } 
    startCameraTracking() 
    player.play() 
} 

override func viewWillAppear(_ animated: Bool) { 
    self.sceneView.play(self) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 
} 

私もhereをダウンロードすることができ、テスト、このvideoを使用。 ありがとう!

答えて

1

私があなたの説明から収集できるものは、いわゆるField of Viewに問題があるということです。カメラがzoomedのように見えるかもしれませんが、実際はそうではありません。カメラのFOV設定を調べ、90度のような設定を試してください。

+0

まさにそれでした! SCNCameraはプロパティ "fieldOfView"を持っています。私はそれを90度に設定しました。 'self!.cameraNode.camera?.fieldOfView = 90' – Felix

関連する問題