2017-11-04 16 views
7

風景でパノラマ動画を作れるアプリを作っています。ランドスケープでは、左から右、下から上の2つの方向をサポートします。CoreMotion - iPhone上で左右に動き回って風景を見ながら

携帯電話を左から右に移動したり、右に回転させると、矢印が左から右に移動します。また、デバイスを垂直方向に上に動かすときに、矢印の下を上に移動したい。 パノラマオプション付きのネイティブiPhoneカメラアプリでは、正しいシミュレーションが表示されます。

私の質問は1)左から右に、または右から左に携帯電話を移動していることをどのように知っていますか? iPhoneのパノラマのように、ユーザーが戻ったときに録画を停止したい。

また、2)どのように私は、ユーザーが上向きに垂直電話を動いている知っています


を追加しました:2017年11月10日: 私は、AppStoreでSpincleという名前のアプリを参照してくださいました。 360度の画像を撮るために、デバイスを左から右に回転させるときに矢印を動かしています。私はちょうどピッチとロールを使用してこれを達成することができました(下記のコードを参照)。しかし、我々は床や屋根にデバイスを立っている場合、これは動作しません。

import UIKit 
import CoreMotion 
class ViewController: UIViewController { 
    private let motionManager = CMMotionManager() 
    let arrowView = UIView() 
    func startMotion() { 
     var initialAttitude: CMAttitude? 
     motionManager.deviceMotionUpdateInterval = 1 
     let queue = OperationQueue.current! 
     let statusBarOrientation = UIApplication.shared.statusBarOrientation 
     motionManager.startDeviceMotionUpdates(using: CMAttitudeReferenceFrame.xArbitraryZVertical, to: queue) { (motiondata, err) in 
      guard let data = motiondata else { return } 
      if initialAttitude == nil { 
       initialAttitude = data.attitude 
      } else { 
       let attitude = data.attitude 
       // translate the attitude 
       attitude.multiply(byInverseOf: initialAttitude!) 
       // calculate pitch and roll of the change from our initial attitude 
       let pitch = self.radiansToDegrees(attitude.pitch) 
       let roll = self.radiansToDegrees(attitude.roll) 
       print("\nroll = \(roll), pitch = \(pitch), yaw = \(self.radiansToDegrees(attitude.yaw))") 
       print("x = \(data.userAcceleration.x), y = \(data.userAcceleration.y), z = \(data.userAcceleration.z)") 
       DispatchQueue.main.async { 
        var rect = self.arrowView.frame 
        var addXPixel = self.view.frame.size.width/45 
        var addYPixel = self.view.frame.size.height/45 
        if statusBarOrientation == .landscapeRight { 
         addXPixel *= -1 
        } else { 
         addYPixel *= -1 
        } 
        rect.origin.x = (CGFloat(pitch) * addXPixel) 
        rect.origin.y = (self.view.frame.size.height/2 - 20) + (CGFloat(roll) * addYPixel) 
        self.arrowView.frame = rect 
       } 
      } 
     } 
    } 
    func stopMotion() { 
     motionManager.stopDeviceMotionUpdates() 
    } 
    func radiansToDegrees(_ radian: Double) -> Float { 
     return Float(radian * 180.0/Double.pi) 
    } 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     view.addSubview(arrowView) 
     arrowView.backgroundColor = UIColor.red 
    } 
    @IBAction func tappedButton() { 
     arrowView.frame = CGRect(x: 0, y: self.view.frame.size.height/2 - 20, width: 40, height: 40) 
     startMotion() 
    } 
} 

問題は、あなたが左を決定するためにお使いの携帯電話の見出しをチェックするためにCLLocationManagerを使用して、あなたのアルゴリズムを書くことができ、それは少し右に左に行くと矢印が上下に

答えて

関連する問題