2016-04-17 11 views
1

Я создал VR версию моего приложения с помощью этого https://github.com/stevenjs/VR-iOS-ExperimentSceneKit движение камеры в VR

Теперь я хочу пошевелить cameraNode, когда я начинаю двигаться вместе с телефоном. Я пытаюсь использовать userAcceleration из основного движения, но я не знаю, как это сделать. Также я новичок в основном движении.

Пожалуйста, помогите мне решить эту проблему.

ответ

0

Этот код будет адаптироваться к ориентации вашего устройства ... это в основном сфераNode с камеройNode посередине. Core Motion управляет просмотром камеры.

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

 Смежные вопросы

  • Нет связанных вопросов^_^