2017-05-15 6 views
0

J'ai donc généré une belle visionneuse panoramique mais l'appareil photo pointe vers le bas. Ce qui veut dire que si je tiens mon téléphone à plat comme s'il était sur une table, il tourne et regarde autour de la sphère. Je veux être capable de le maintenir normal et regarder autour de moi. Voici mon code.Vue panoramique iOS

J'ai une extension, je me sers ici:

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

Alors le viewcontroller ressemble à ceci:

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


} 

Comment puis-je obtenir la caméra pour faire face à l'avant sur l'image. Merci

Répondre

0

Je l'ai compris si quelqu'un d'autre cherche une réponse. J'ai changé le cas du mode portrait pour le suivant:

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)