2016-04-17 11 views
1

I VR Version meiner Anwendung mit Hilfe dieses https://github.com/stevenjs/VR-iOS-ExperimentSceneKit Kamerabewegung in VR

erstellt haben Jetzt möchte ich meine cameraNode bewegen, wenn ich zusammen mit meinem Handy in Bewegung setzen. Ich versuche, UserAcceleration von Core Motion zu verwenden, aber ich habe keine Ahnung, wie dies zu tun ist. Außerdem bin ich neu in Core Motion.

Bitte helfen Sie mir, dies zu lösen.

Antwort

0

Dieser Code passt sich Ihrer Geräteausrichtung an ... es ist im Grunde ein sphereNode mit einem cameraNode in der Mitte. Core Motion steuert die Kameraansicht.

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