Я работаю над приложением, которое перекрывает представление 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 может сделать иначе, чем я, в их методе ротации, который устраняет эту проблему?