2017-02-21 73 views
0

目前,我在製作3D指南針的功能方面感到困惑。與SceneKit,我裝的箭頭對象,然後取出傳感器數據,如下面的代碼(其效果是this video如何使用SceneKit實現3D指南針

let motionManager = CMMotionManager() 
motionManager.deviceMotionUpdateInterval = 1.0/60.0 
if motionManager.isDeviceMotionAvailable { 
    motionManager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: { (devMotion, error) -> Void in 
     arrow.orientation = SCNQuaternion(-CGFloat((motionManager.deviceMotion?.attitude.quaternion.x)!), -CGFloat((motionManager.deviceMotion?.attitude.quaternion.y)!), -CGFloat((motionManager.deviceMotion?.attitude.quaternion.z)!), CGFloat((motionManager.deviceMotion?.attitude.quaternion.w)!)) 

     })} 

完成此操作後,如果用戶在任何軸線旋轉的裝置中,箭頭可以旋轉爲好。由於這是一個3D羅盤,我需要箭頭指向方向。所以我通過CLLocationManager獲取標題數據,然後問題即將到來。

let gq1: GLKQuaternion = GLKQuaternionMakeWithAngleAndAxis(GLKMathDegreesToRadians(heading), 0, 0, 1) 
arrow.orientation = SCNVector4(gq1.x,gq1.y,gq1.z,gq1.w) 

上面的代碼在2D中做得很完美,就像下面的圖片一樣,它指向了正確的東方向。但我想它在3D環境中,所以我不喜歡下面

motionManager.deviceMotionUpdateInterval = 1.0/60.0 
    if motionManager.isDeviceMotionAvailable { 
     motionManager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: { (devMotion, error) -> Void in 
      arrow.orientation = orient(q: (motionManager.deviceMotion?.attitude.quaternion)!, angle: heading) 
    } 
func orient(q:CMQuaternion,angle:Float) -> SCNQuaternion{ 
    GLKQuaternionMakeWithAngleAndAxis(GLKMathDegreesToRadians(-angle), 0, 0, 1) 
    let gq1: GLKQuaternion = GLKQuaternionMakeWithAngleAndAxis(GLKMathDegreesToRadians(-angle), 0, 0, 1) 
    // add a rotation in z axis 
    let gq2: GLKQuaternion = GLKQuaternionMake(Float(q.x), Float(q.y), Float(q.z), Float(q.w)) 
    // the current orientation 
    let qp: GLKQuaternion = GLKQuaternionMultiply(gq1, gq2) 
    // get the "new" orientation 
    var rq = CMQuaternion() 
    rq.x = Double(qp.x) 
    rq.y = Double(qp.y) 
    rq.z = Double(qp.z) 
    rq.w = Double(qp.w) 
    return SCNVector4(-Float(rq.x), -Float(rq.y), -Float(rq.z), Float(rq.w)) 
} 

有一個bug(this video所示),如果我旋轉設備圍繞Z軸,方向仍然圍繞y軸旋轉。我做錯了什麼嗎?

enter image description here

回答

0

如果我通過該方法繞z軸的裝置,所述方向數據連續出來。因此,我無法使用CLLocationManager來實現我的目標。這thread是我想要的。