2017-02-15 11 views
2

現在、私はiOSプラットフォームの問題を抱えています。基本的には、2D環境で東を指す矢印をロードします(上は北、左は西、右は東と下が南です)。 3D環境では本物の東を指すことができるので、自動的に正しい方向に回転します。私は自分の状況を正確に描写するために絵を描きます。今SceneKitの右方向を指す

enter image description here

(点線の矢印は、私のロードされた矢印と実線の矢印は、私はコアモーションデータを使用している場合、私が欲しいものです)私がやった

let motionManager = CMMotionManager() 
    motionManager.deviceMotionUpdateInterval = 1.0/60.0 
    if motionManager.isDeviceMotionAvailable { 
     motionManager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: { (devMotion, error) -> Void in 
       parent_arrows[0].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)!)) 

     })} 

スニペットを自動的に作成することはできません矢印は右方向に回転します。私の考えは、デバイスと北の間の角度を取得し、矢印の方向にこの角度を適用することです。しかし、どのように四角形にアングルを追加できますか?これを達成するための他のアイデアはありますか?

+0

実際の問題は何ですか? 'parent_arrows [0]'は更新されていて、更新は表示されていませんか? 'parent_arrows [0]'は更新されていませんか?それは更新して表示していますが、間違った方向を示していますか? – Grimxn

+0

質問を簡単にするには、3D矢印をロードします。この矢印が方向を指すようにします(たとえば:east)。私は下にあるものに答えましたが、ジンバルロックが出てくるようです。 – OtakuFitness

答えて

1

このthreadは私を啓発します。

let motionManager = CMMotionManager() 
    motionManager.deviceMotionUpdateInterval = 1.0/60.0 
    if motionManager.isDeviceMotionAvailable { 
     motionManager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: { (devMotion, error) -> Void in 
      parent_arrows[0].orientation = self.orient(q: (motionManager.deviceMotion?.attitude.quaternion)!) 

     })} 
} 

func orient(q:CMQuaternion) -> SCNQuaternion{ 
    let gq1: GLKQuaternion = GLKQuaternionMakeWithAngleAndAxis(GLKMathDegreesToRadians(-heading), 0, 0, 1) 
    // add a rotation of the yaw and the heading relative to true north 
    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 SCNVector4Make(-Float(rq.x), -Float(rq.y), -Float(rq.z), Float(rq.w)) 
} 

これを実行すると、矢印が最初の時点で正しい方向を指します。しかし、もう1つ質問した別の問題がありますthread。最終的な答えはthis

+0

このスニペットは完全には機能しません。私がiPhoneを持っているとき、矢印はX軸とY軸でちょうど回転できます。 Z軸の回転が消えます。 – OtakuFitness

関連する問題