2017-02-10 5 views
1

Я работаю над проектом iOS/Swift, который содержит сцену (SceneKit). Что я хочу сделать, это повернуть SCNCamera, когда пользователь поворачивает свой телефон.Движение SCNCamera синхронизировано с акселерометром iPhone

Вот что я сделал:

motionManager = CMMotionManager() 
    motionManager.accelerometerUpdateInterval = 0.1 

    motionManager.startAccelerometerUpdates(to: OperationQueue.main) { [weak self] (data: CMAccelerometerData?, error: Error?) in self?.update_rotation(p: (data?.acceleration)!) } 

и в функции update_rotation:

camera_node.eulerAngles = SCNVector3Make(angle_x,angle_y,angle_z) 

camera_node мой объект SCNNode камеры. angle_x и angle_z рассчитаны по данным акселерометров. (Я просто умножу значение акселерометра на 90, и я преобразую его в радианы). angle_y рассчитывается по компасу (северный угол).

Моя проблема исходит от angle_z. Это очень странно, потому что поведение свойства eulerAngles.z зависит от значения angle_y. Другими словами, все отлично работает, если смотреть на север. Когда я смотрю на юг, angle_z необходимо перевернуть. Я не понимаю, почему.

ответ

0
let motionManager = CMMotionManager() 
motionManager.deviceMotionUpdateInterval = 1.0/60.0 
if motionManager.isDeviceMotionAvailable { 
    motionManager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: { (devMotion, error) -> Void in 
     cameraNode.eulerAngles = SCNVector3(
      -Float((devMotion?.attitude.roll)!) - Float(M_PI_2), 
      Float((motionManager.deviceMotion?.attitude.yaw)!), 
      -Float((motionManager.deviceMotion?.attitude.pitch)!) 
     ) 
    })} 

Я стараюсь это с моей детской площадкой приложение в IPad

+0

Там точно такая же проблема. Я удалил два минуса в вашем SCNVector3, потому что я работаю в Landscape - home left. Если я наклоняю свой телефон влево/вправо, это не работает, когда я смотрю позади – Bob5421

Смежные вопросы