Координатная проекция MapKit дает ошибочные результаты от визуализации сцены - PullRequest
1 голос
/ 03 октября 2019

Я работаю над приложением, которое перекрывает представление MapKit Map с помощью SceneKit SceneView (аналогично https://blog.classycode.com/how-to-write-a-pok%C3%A9mon-go-clone-for-ios-edf1cf1cf5ce).). В моей сцене у меня есть трехмерный узел, положение которого определено так, что он отображается поверх определенной картыкоордината.

В средстве визуализации сцены я обновляю положение узлов путем преобразования координаты карты в точку и проецирования этой точки в трехмерную сцену. Этот метод позволяет пользователю поворачивать карту вокруг, в то время как трехмерный узел отображается воставайтесь на месте.

Это работает. Однако узел «мерцает» при изменении карты. После исследования я обнаружил, что виновником является преобразование координат карты. По какой-то причине, когда карта вращается, иногда преобразованная координата экрана очень неправильная (где-то за пределами экрана).

Я думаю, что проблема связана с многопоточностью. Угол поворота карты определяется в функции touchesMoved и обновляется в средстве визуализации сцены. Я попытался переместить поворот карты и обновление положения узла вкасается перемещенной функции, но это делало преобразованные точки неправильными каждый раз.

Вот как выглядит моя структура:


 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
     *grab map rotation angle start*
}

 override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
     *calculate new map rotation angle*
}

extension GameViewController: SCNSceneRendererDelegate {

  func renderer(renderer: SCNSceneRenderer, updateAtTime time: NSTimeInterval) {
     *set map rotation angle*
     *update 3D node position*
}

Я ожидаю, что преобразование координат карты всегда даст мне точку экранаэто имеет смысл (я знаю, что координаты на экране), но результат периодически неверен во время вращения.

ОБНОВЛЕНИЕ:

Два новых интересных открытия:

1)Проблема существует, только когда тип карты = sateliteFlyover (к сожалению, тот, который мне нужен)

2) Проблема исчезает, когда используется поворот по умолчанию для интерактивной пользовательской карты Apple (также неудачно, потому что мне нужно по-другому управлять поворотом)

Это действительно похоже на какую-то проблему обработки потоков, когда после смены камеры на карте есть «мертвое время», когда проекция координат просто дает неправильное значение. Но что Apple может сделать иначе, чем я, в их методе ротации, который устраняет эту проблему?

...