###前提・実現したいこと
iOSで、カメラのライブビュー映像にUFO画像を合成するアプリを作っています。
実際に空に浮かんでるかのように、カメラを上に向けるとUFOが下に、下に向けると上に、右を向くと左に、左を向くと右に動くようにしたいです。
UFOを上下左右に動かすためにはカメラの向いている仰角と、方角を知らねばなりませんが、思うようにいかずに困っています。
CoreMotionのattitudeでpitchの値で、デバイスを前後に倒した角度が求められることはわかりました。
しかしデバイスを垂直に立てた状態を90度として、画面が上になるように奥に倒そうが、下になるように手前に倒そうが、同じように90度から角度が減るので、カメラが上を向いているのか下を向いているのか判断できません。
そのため、重力加速度gravityのzの値(画面が上向きならマイナス、下向きならプラス)を見て、判断していますが、このやり方でいいんでしょうか?
ただしpitchの値の増減の境が、必ずしもデバイスを垂直に立てた場合の90とならず、88や86くらいの不定な値になることが多いので、90を想定して処理をしていると値が飛ぶことがあり、困っています。
方角についてはCoreLocationの電子コンパスを使っています。
デバイスを垂直に立てたあたりではちゃんと方位角がわかるのですが、カメラを45度程度以上に向けると値が大きく変わってしまい(たとえば180くらいだったのが300を超えたり)、表示していたUFOが勝手に飛んでいってしまい困っています(苦笑)
###発生している問題・エラーメッセージ
要は、上下左右どこにカメラを向けてもその仰角と方位角がわかればいいのですが、値がはっきりしなかったり、向ける方向によって値が大きく変わってしまうため困っています。
いい方法はないでしょうか。
###該当のソースコード
Swift
1 2/モーションセンサー 3motionMgr = CMMotionManager() 4//更新頻度(秒) 5motionMgr?.deviceMotionUpdateInterval = 0.1 6//姿勢センサースタート(真北基準で) 7motionMgr?.startDeviceMotionUpdates(using: CMAttitudeReferenceFrame.xTrueNorthZVertical, to: OperationQueue.current!, withHandler: { (data, error) in 8 //ラジアンから変換 9 let pitchDeg = 180 * data!.attitude.pitch / M_PI 10 //重力加速度 11 let gravityZ = data!.gravity.z //画面が上なら-1.0、下なら1.0、垂直なら0 12 13 if Double(gravityZ) > 0 { 14 //画面下向き時 15 //デバイス垂直を0度とした角度 16 self.angle = 90 - pitchDeg 17 } else { 18 //画面が上向きならそのままのpitch角を使用 19 //デバイスを垂直時を0度とした角度 20 self.angle = pitchDeg - 90 21 } 22}
###試したこと
姿勢センサーのpitchは、デバイスのZ軸が少しでも傾いていた場合、値の境が88とか86とかになってしまうような感じです。
###補足情報(言語/FW/ツール等のバージョンなど)
Swift3、Xcode8、iOS10
回答2件
あなたの回答
tips
プレビュー