2017-05-15 5 views
0

パノラマビューアを生成しましたが、カメラが下を向いています。それはテーブルのように私の電話機を平らにしておくと、回転して球体の周りをきれいに見ることを意味します。私はそれを正常(上)に保ち、周りを見ることができるようにしたい。ここに私のコードです。パノラマビューiOS

私はここに使用しています拡張子を持っている:

import UIKit 
import SceneKit 
import CoreMotion 

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 UIApplication.shared.statusBarOrientation { 

    case .landscapeRight: 

     let cq = GLKQuaternionMakeWithAngleAndAxis(Float(Double.pi), 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(-Double.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(Double.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(-Double.pi), 1, 0, 0) 
     let q = GLKQuaternionMultiply(cq, aq) 

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

    return final 
} 
} 

その後のViewControllerは、次のようになります。

import UIKit 
import SceneKit 
import CoreMotion 

class ViewController: UIViewController { 

let motionManager = CMMotionManager() 
let cameraNode = SCNNode() 


@IBOutlet weak var sceneView: SCNView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    guard let imagePath = Bundle.main.path(forResource: "Hellbrunn25", ofType: "jpg") else { 
     fatalError("Failed to find path for panaromic file.") 
    } 
    guard let image = UIImage(contentsOfFile:imagePath) else { 
     fatalError("Failed to load panoramic image") 
    } 

    let scene = SCNScene() 
    sceneView.scene = scene 
    sceneView.allowsCameraControl = true 

    //Create node, containing a sphere, using the panoramic image as a texture 
    let sphere = SCNSphere(radius: 20.0) 
    sphere.firstMaterial!.isDoubleSided = true 
    sphere.firstMaterial!.diffuse.contents = image 
    let sphereNode = SCNNode(geometry: sphere) 
    sphereNode.position = SCNVector3Make(0,0,0) 
    scene.rootNode.addChildNode(sphereNode) 

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

    guard motionManager.isDeviceMotionAvailable else { 
     fatalError("Device motion is not available") 
    } 

    // Action 
    motionManager.deviceMotionUpdateInterval = 1.0/60.0 
    motionManager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: { 
     (deviceDidMove, Error)-> Void in 

     let attitude: CMAttitude = deviceDidMove!.attitude 

     self.cameraNode.orientation = SCNVector4Make(Float(attitude.quaternion.x), Float(attitude.quaternion.y), Float(attitude.quaternion.z), Float(attitude.quaternion.w)) 


    }) 

} 
    override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func deviceDidMove(motion: CMDeviceMotion?, error: NSError?) { 

    if let motion = motion { 
     let orientation = motion.gaze(atOrientation: UIApplication.shared.statusBarOrientation) 
     cameraNode.orientation = orientation 
    } 
} 


} 

私はカメラが画像を前方に直面してもらうにはどうすればよいです。ありがとう

答えて

0

誰かが答えを探しているなら、これを理解しました。ポートレートモードのケースを次のように変更しました:

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

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