1
我想使用CoreMotion(如果可能,不是CoreLocation)計算指向真北的指南針。我發現了一些公式,但只有當電話在桌子上平放時才工作。有人可以幫助我找到一種方法來計算指南針的標題,這將適用於像羅盤應用程序的每個設備位置?基於CoreMotion的指南針
我想使用CoreMotion(如果可能,不是CoreLocation)計算指向真北的指南針。我發現了一些公式,但只有當電話在桌子上平放時才工作。有人可以幫助我找到一種方法來計算指南針的標題,這將適用於像羅盤應用程序的每個設備位置?基於CoreMotion的指南針
我找到了答案。這是我得到的指南針從CoreMotion弧度標題:
guard let a = motionManager.deviceMotion?.attitude, g = motionManager.deviceMotion?.gravity else { return }
let deviceAngle = {() -> Double in
switch interfaceOrientation {
case .LandscapeLeft: return -M_PI_2 + atan2(g.x, g.y)
case .LandscapeRight: return M_PI_2 + atan2(g.x, g.y)
default: return M_PI + atan2(g.x, g.y)
}
}()
// Calculate Heading.
let cA = cos(a.yaw), sA = sin(a.yaw), sB = sin(a.pitch), cG = cos(a.roll), sG = sin(a.roll)
let rA = cA * sG + sA * sB * cG
let rB = sA * sG - cA * sB * cG
var compassHeading = -atan(rA/rB) + M_PI + deviceAngle
if rB > 0 { compassHeading += M_PI }
還需要對此進行測試,但現在它似乎工作。
你不使用CoreLocation的原因是什麼? – jbehrens94
我正在製作一個AR應用程序,它已經使用CoreMotion來顯示對象。我需要這個雷達視圖的指南針。我注意到,當我使用CoreLocation trueHeading時,有時雷達上的點會從我在AR視圖中看到的有點偏移。可能有些額外的過濾用於通過CoreLocation計算標題。無論如何,如果這將有可能從核心運動態度中脫穎而出,那麼我認爲這個問題不會存在。 –