2016-04-17 2 views
1

J'ai créé la version VR à ma demande avec l'aide de cette https://github.com/stevenjs/VR-iOS-ExperimentSceneKit mouvement de la caméra dans VR

Maintenant, je veux passer mon cameraNode quand je commence à se déplacer le long avec mon téléphone. J'essaye d'employer userAcceleration du mouvement de noyau, mais je n'ai aucune idée de comment faire ceci. Aussi, je suis nouveau à la motion de base.

S'il vous plaît aidez-moi à résoudre ce problème.

Répondre

0

Ce code s'adapte à l'orientation de votre périphérique ... il s'agit essentiellement d'un noeud sphereNode avec un noeud CameraNode au milieu. Core Motion contrôle la vue de la caméra.

import UIKit 
import SceneKit 
import CoreMotion 
import SpriteKit 
import AVFoundation 

class Video360VC: UIViewController { 

    @IBOutlet weak var sceneView: SCNView! 

    let motionManager = CMMotionManager() 
    let cameraNode = SCNNode() 
    var player: AVPlayer? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     startSelected() 
    } 

    func startNewPlayer(fileURL: URL, fileURLSub: URL){ 
     player = AVPlayer(url: fileURL) 
     let videoNode = SKVideoNode(avPlayer: player!) 
     let size = CGSize(width: 4096, height: 2048) 

     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?.isMuted = true 
     player?.play() 
    } 


    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 

     //test mode help 
     sceneView.showsStatistics = false 
     sceneView.allowsCameraControl = false 

     // 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 } 

      self?.cameraNode.camera?.fieldOfView = 90 
      self?.cameraNode.orientation = data.gaze(atOrientation: .landscapeRight) 
     } 
    } 
} 

extension CMDeviceMotion { 

    func gaze(atOrientation orientation: UIInterfaceOrientation) -> SCNVector4 { 

     let attitude = self.attitude.quaternion 
     let aq = GLKQuaternionMake(Float(attitude.x), Float(attitude.y), Float(attitude.z), Float(attitude.w)) 

     let final: SCNVector4 

     switch orientation { 

     case .landscapeRight: 

      let cq = GLKQuaternionMakeWithAngleAndAxis(Float(Float.pi/2), 0, 1, 0) 
      let q = GLKQuaternionMultiply(cq, aq) 

      final = SCNVector4(x: -q.y, y: q.x, z: q.z, w: q.w) 

     case .landscapeLeft: 

      let cq = GLKQuaternionMakeWithAngleAndAxis(Float(-Float.pi), 0, 1, 0) 
      let q = GLKQuaternionMultiply(cq, aq) 

      final = SCNVector4(x: q.y, y: -q.x, z: q.z, w: q.w) 

     case .portraitUpsideDown: 

      let cq = GLKQuaternionMakeWithAngleAndAxis(Float(Float.pi), 1, 0, 0) 
      let q = GLKQuaternionMultiply(cq, aq) 

      final = SCNVector4(x: -q.x, y: -q.y, z: q.z, w: q.w) 

     case .unknown: 

      fallthrough 

     case .portrait: 

      let cq = GLKQuaternionMakeWithAngleAndAxis(Float(-Float.pi), 1, 0, 0) 
      let q = GLKQuaternionMultiply(cq, aq) 

      final = SCNVector4(x: q.x, y: q.y, z: q.z, w: q.w) 

     default: 
      print("Default") 
     } 

     return final 
    } 
}