2017-02-15 26 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

Задайте вопрос простым, загрузите трехмерную стрелку, и я хочу, чтобы эта стрелка указывала направление (например: восток). Я ответил, что у меня внизу, но кажется, что карданный замок выходит. – 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)) 
} 

После этого стрелка указывает на правильное направление в начале. Тем не менее, это еще одна проблема, которую я задал в другом thread. Ответ получен в this

+0

Этот сниппет не работает так прекрасно. Когда я задерживаю iPhone, стрелка может просто вращаться по оси X и Y. Вращение оси Z исчезает. – OtakuFitness