SlideShare a Scribd company logo
ARKIT
♂
Самвел Меджлумян Дмитрий Антышев
AGENDA
• ARKit под капотом
• Наши кейсы
• Практическая реализация
• Итоги
2
ARKIT ПОД КАПОТОМ
developer.apple.com/videos/play/wwdc2017/602/
3
A9 И A10
Поддержка процессоров
4
5
SE 6S/6S PLUS 7/7 PLUS
SCENEKIT, SPRITEKIT, METAL
and third-party tools like Unity and Unreal Engine
6
VISUAL INERTIAL ODOMETRY
7
VISUAL INERTIAL ODOMETRY
8
CAMERA OUTPUT
COREMOTION
9
COREMOTION
ACCELEROMETER
GYROSCOPE
PEDOMETER
ENVIRONMENT-RELATED
НАШИ КЕЙСЫ
10
РЕСТОРАНЫ РЯДОМ
отображение ресторанов в радиусе 1 км
11
🗺
12
МАРШРУТ ДО ЗАВЕДЕНИЯ
13
🚦
14
15
16
17
ОПРЕДЕЛИТЬ РАСПОЛОЖЕНИЕ ОБЪЕКТА В
ПРОСТРАНСТВЕ
ЗАКРЕПИТЬ ОБЪЕКТ В ПОЗИЦИИ
ОТРИСОВАТЬ ОБЪЕКТ В ПРОСТРАНСТВЕ
18
ПОСЧИТАТЬ АЗИМУТ
СФОРМИРОВАТЬ МАТРИЦУ 4Х4 И ANCHOR
СФОРМИРОВАТЬ NODE
АЗИМУТ
19
КОД АЗИМУТА
20
func azimuthBetween(_ firstLocation: CLLocation, secondLocation: CLLocation) -> CGFloat {
var azimuth: CGFloat = 0.0
// переводим координаты в радианы
let firstLatitude: CGFloat = GLKMathDegreesToRadians(firstLocation.coordinate.latitude)
let firstLongitude: CGFloat = GLKMathDegreesToRadians(firstLocation.coordinate.longitude)
let secondLatitude: CGFloat = GLKMathDegreesToRadians(secondLocation.coordinate.latitude)
let secondLongitude: CGFloat = GLKMathDegreesToRadians(secondLocation.coordinate.longitude)
// считаем корректный радиан
let resultLongitude: CGFloat = secondLongitude - firstLongitude
let y: CGFloat = sin(resultLongitude) * cos(secondLatitude)
let x: CGFloat = cos(firstLatitude) * sin(secondLatitude) - sin(firstLatitude) * cos(secondLatitude) *
cos(resultLongitude)
let radiansBearing: CGFloat = atan2(y, x)
// переводим радиан в градусы
azimuth = GLKMathRadiansToDegrees(radiansBearing)
return azimuth
}
КОД АЗИМУТА
21
let firstLatitude: CGFloat =
GLKMathDegreesToRadians(firstLocation.coordinate.latitude)
let firstLongitude: CGFloat =
GLKMathDegreesToRadians(firstLocation.coordinate.longitude)
let secondLatitude: CGFloat =
GLKMathDegreesToRadians(secondLocation.coordinate.latitude)
let secondLongitude: CGFloat =
GLKMathDegreesToRadians(secondLocation.coordinate.longitude)
func azimuthBetween(_ firstLocation: CLLocation, secondLocation: CLLocation) -> CGFloat {
var azimuth: CGFloat = 0.0
// переводим координаты в радианы
let firstLatitude: CGFloat = GLKMathDegreesToRadians(firstLocation.coordinate.latitude)
let firstLongitude: CGFloat = GLKMathDegreesToRadians(firstLocation.coordinate.longitude)
let secondLatitude: CGFloat = GLKMathDegreesToRadians(secondLocation.coordinate.latitude)
let secondLongitude: CGFloat = GLKMathDegreesToRadians(secondLocation.coordinate.longitude)
// считаем корректный радиан
let resultLongitude: CGFloat = secondLongitude - firstLongitude
let y: CGFloat = sin(resultLongitude) * cos(secondLatitude)
let x: CGFloat = cos(firstLatitude) * sin(secondLatitude) - sin(firstLatitude) * cos(secondLatitude) *
cos(resultLongitude)
let radiansBearing: CGFloat = atan2(y, x)
// переводим радиан в градусы
azimuth = GLKMathRadiansToDegrees(radiansBearing)
return azimuth
}
КОД АЗИМУТА
22
let resultLongitude: CGFloat = secondLongitude -
firstLongitude
let y: CGFloat = sin(resultLongitude) * cos(secondLatitude)
let x: CGFloat = cos(firstLatitude) * sin(secondLatitude) -
sin(firstLatitude) * cos(secondLatitude) * cos(resultLongitude)
let radiansBearing: CGFloat = atan2(y, x)
func azimuthBetween(_ firstLocation: CLLocation, secondLocation: CLLocation) -> CGFloat {
var azimuth: CGFloat = 0.0
// переводим координаты в радианы
let firstLatitude: CGFloat = GLKMathDegreesToRadians(firstLocation.coordinate.latitude)
let firstLongitude: CGFloat = GLKMathDegreesToRadians(firstLocation.coordinate.longitude)
let secondLatitude: CGFloat = GLKMathDegreesToRadians(secondLocation.coordinate.latitude)
let secondLongitude: CGFloat = GLKMathDegreesToRadians(secondLocation.coordinate.longitude)
// считаем корректный радиан
let resultLongitude: CGFloat = secondLongitude - firstLongitude
let y: CGFloat = sin(resultLongitude) * cos(secondLatitude)
let x: CGFloat = cos(firstLatitude) * sin(secondLatitude) - sin(firstLatitude) * cos(secondLatitude) *
cos(resultLongitude)
let radiansBearing: CGFloat = atan2(y, x)
// переводим радиан в градусы
azimuth = GLKMathRadiansToDegrees(radiansBearing)
return azimuth
}
23
КОД АЗИМУТА
azimuth = GLKMathRadiansToDegrees(radiansBearing)
func azimuthBetween(_ firstLocation: CLLocation, secondLocation: CLLocation) -> CGFloat {
var azimuth: CGFloat = 0.0
// переводим координаты в радианы
let firstLatitude: CGFloat = GLKMathDegreesToRadians(firstLocation.coordinate.latitude)
let firstLongitude: CGFloat = GLKMathDegreesToRadians(firstLocation.coordinate.longitude)
let secondLatitude: CGFloat = GLKMathDegreesToRadians(secondLocation.coordinate.latitude)
let secondLongitude: CGFloat = GLKMathDegreesToRadians(secondLocation.coordinate.longitude)
// считаем корректный радиан
let resultLongitude: CGFloat = secondLongitude - firstLongitude
let y: CGFloat = sin(resultLongitude) * cos(secondLatitude)
let x: CGFloat = cos(firstLatitude) * sin(secondLatitude) - sin(firstLatitude) * cos(secondLatitude) *
cos(resultLongitude)
let radiansBearing: CGFloat = atan2(y, x)
// переводим радиан в градусы
azimuth = GLKMathRadiansToDegrees(radiansBearing)
return azimuth
}
24
✅ ПОСЧИТАТЬ АЗИМУТ
СФОРМИРОВАТЬ МАТРИЦУ 4Х4 И ANCHOR
СФОРМИРОВАТЬ NODE
ФОРМИРУЕМ МАТРИЦУ
25
func getTranslationMatrix(_ position: vector_float4) -> matrix_float4x4 {
let matrix: matrix_float4x4 = matrix_identity_float4x4
matrix.columns[3] = position
return matrix
}
ФОРМИРУЕМ ANCHOR
26
var anchor = ARAnchor(transform: place.setupTransform)
skView.session.add(anchor)
27
✅ ПОСЧИТАТЬ АЗИМУТ
✅ СФОРМИРОВАТЬ МАТРИЦУ 4Х4 И ANCHOR
СФОРМИРОВАТЬ NODE
ФОРМИРУЕМ NODE
28
func view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode?
var configuration = ARWorldTrackingConfiguration()
configuration.worldAlignment = .gravityAndHeading
skView.session.run(with: configuration)
НАСТРОЙКА
ARSKViewDelegate
29
✅ ПОСЧИТАТЬ АЗИМУТ
✅ СФОРМИРОВАТЬ МАТРИЦУ 4Х4
✅ СФОРМИРОВАТЬ ANCHOR И NODE
30
31
32
ОСНОВНЫЕ ПОИНТЫ
33
ПОСЧИТАТЬ АЗИМУТ И ДИСТАНЦИЮ
СФОРМИРОВАТЬ МАТРИЦУ 4Х4 И ANCHOR
СФОРМИРОВАТЬ NODE
ИТОГИ
🤔
ИТОГИ
• Виральный эффект
35
• Лояльность пользователей
• Повышение Retention rate
• Фичеринг
ONE MORETHING
36
37
38
AR
gartner.com
"ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Rambler&Co

More Related Content

More from AvitoTech

Yandex Tank - Арсений Фомченко
Yandex Tank - Арсений ФомченкоYandex Tank - Арсений Фомченко
Yandex Tank - Арсений Фомченко
AvitoTech
 
Migro - Юрий Богомолов
Migro - Юрий БогомоловMigro - Юрий Богомолов
Migro - Юрий Богомолов
AvitoTech
 
TableKit - Максим Соколов
TableKit - Максим СоколовTableKit - Максим Соколов
TableKit - Максим Соколов
AvitoTech
 
Jsonwire Grid - Михаил Подцерковский (Avito)
Jsonwire Grid - Михаил Подцерковский (Avito)Jsonwire Grid - Михаил Подцерковский (Avito)
Jsonwire Grid - Михаил Подцерковский (Avito)
AvitoTech
 
SimplePEG - Алексей Охрименко
SimplePEG - Алексей ОхрименкоSimplePEG - Алексей Охрименко
SimplePEG - Алексей Охрименко
AvitoTech
 
Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
 Как перестать бояться и начать контрибьютить - Алексей Кудрявцев Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
AvitoTech
 
"Анонимизация фото с помощью Vision", Хомутников Тимофей, Avito
"Анонимизация фото с помощью Vision",  Хомутников Тимофей, Avito"Анонимизация фото с помощью Vision",  Хомутников Тимофей, Avito
"Анонимизация фото с помощью Vision", Хомутников Тимофей, Avito
AvitoTech
 
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
AvitoTech
 
ASO for iOS 11
ASO for iOS 11ASO for iOS 11
ASO for iOS 11
AvitoTech
 
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
AvitoTech
 
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
AvitoTech
 
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
AvitoTech
 
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
AvitoTech
 
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
AvitoTech
 
Конкурс Авито-2017 - Решение 2ое место - Василий Рубцов
Конкурс Авито-2017 - Решение 2ое место - Василий РубцовКонкурс Авито-2017 - Решение 2ое место - Василий Рубцов
Конкурс Авито-2017 - Решение 2ое место - Василий Рубцов
AvitoTech
 
Конкурс Авито-2017 - Решение 3ое место
Конкурс Авито-2017 - Решение 3ое местоКонкурс Авито-2017 - Решение 3ое место
Конкурс Авито-2017 - Решение 3ое место
AvitoTech
 
Конкурс Авито-2017 - Решение победителя
Конкурс Авито-2017 - Решение победителяКонкурс Авито-2017 - Решение победителя
Конкурс Авито-2017 - Решение победителя
AvitoTech
 
Avito Recommendations Contest - Михаил Каменщиков
Avito Recommendations Contest - Михаил КаменщиковAvito Recommendations Contest - Михаил Каменщиков
Avito Recommendations Contest - Михаил Каменщиков
AvitoTech
 
Какие задачи решает команда рекомендаций в Avito - Василий Лексин
Какие задачи решает команда рекомендаций в Avito - Василий ЛексинКакие задачи решает команда рекомендаций в Avito - Василий Лексин
Какие задачи решает команда рекомендаций в Avito - Василий Лексин
AvitoTech
 
Рекомендации в OZON.ru - Ксения Бокша
Рекомендации в OZON.ru - Ксения БокшаРекомендации в OZON.ru - Ксения Бокша
Рекомендации в OZON.ru - Ксения Бокша
AvitoTech
 

More from AvitoTech (20)

Yandex Tank - Арсений Фомченко
Yandex Tank - Арсений ФомченкоYandex Tank - Арсений Фомченко
Yandex Tank - Арсений Фомченко
 
Migro - Юрий Богомолов
Migro - Юрий БогомоловMigro - Юрий Богомолов
Migro - Юрий Богомолов
 
TableKit - Максим Соколов
TableKit - Максим СоколовTableKit - Максим Соколов
TableKit - Максим Соколов
 
Jsonwire Grid - Михаил Подцерковский (Avito)
Jsonwire Grid - Михаил Подцерковский (Avito)Jsonwire Grid - Михаил Подцерковский (Avito)
Jsonwire Grid - Михаил Подцерковский (Avito)
 
SimplePEG - Алексей Охрименко
SimplePEG - Алексей ОхрименкоSimplePEG - Алексей Охрименко
SimplePEG - Алексей Охрименко
 
Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
 Как перестать бояться и начать контрибьютить - Алексей Кудрявцев Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
Как перестать бояться и начать контрибьютить - Алексей Кудрявцев
 
"Анонимизация фото с помощью Vision", Хомутников Тимофей, Avito
"Анонимизация фото с помощью Vision",  Хомутников Тимофей, Avito"Анонимизация фото с помощью Vision",  Хомутников Тимофей, Avito
"Анонимизация фото с помощью Vision", Хомутников Тимофей, Avito
 
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
“iOS 11 в App in the Air”, Пронин Сергей, App in the Air
 
ASO for iOS 11
ASO for iOS 11ASO for iOS 11
ASO for iOS 11
 
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
Добиваемся эффективности каждого из 9000+ UI-тестов - Максим Сахаров (Tutu.ru)
 
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
Проблемы управления тестами, или Что мешает создавать дешевые и полезные тест...
 
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
Запускаем тесты в Continuous Integration - Сергей Пак (JetBrains)
 
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
Векторы развития систем автоматизации тестирования - Дмитрий Химион (Avito)
 
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
Прокачиваем WebDriverAgent, или Как тестировать iOS-приложения после ядерного...
 
Конкурс Авито-2017 - Решение 2ое место - Василий Рубцов
Конкурс Авито-2017 - Решение 2ое место - Василий РубцовКонкурс Авито-2017 - Решение 2ое место - Василий Рубцов
Конкурс Авито-2017 - Решение 2ое место - Василий Рубцов
 
Конкурс Авито-2017 - Решение 3ое место
Конкурс Авито-2017 - Решение 3ое местоКонкурс Авито-2017 - Решение 3ое место
Конкурс Авито-2017 - Решение 3ое место
 
Конкурс Авито-2017 - Решение победителя
Конкурс Авито-2017 - Решение победителяКонкурс Авито-2017 - Решение победителя
Конкурс Авито-2017 - Решение победителя
 
Avito Recommendations Contest - Михаил Каменщиков
Avito Recommendations Contest - Михаил КаменщиковAvito Recommendations Contest - Михаил Каменщиков
Avito Recommendations Contest - Михаил Каменщиков
 
Какие задачи решает команда рекомендаций в Avito - Василий Лексин
Какие задачи решает команда рекомендаций в Avito - Василий ЛексинКакие задачи решает команда рекомендаций в Avito - Василий Лексин
Какие задачи решает команда рекомендаций в Avito - Василий Лексин
 
Рекомендации в OZON.ru - Ксения Бокша
Рекомендации в OZON.ru - Ксения БокшаРекомендации в OZON.ru - Ксения Бокша
Рекомендации в OZON.ru - Ксения Бокша
 

"ARKit в приложении Афиша Рестораны”, Меджлумян Самвел, Антышев Дмитрий, Rambler&Co

  • 2. AGENDA • ARKit под капотом • Наши кейсы • Практическая реализация • Итоги 2
  • 4. A9 И A10 Поддержка процессоров 4
  • 5. 5 SE 6S/6S PLUS 7/7 PLUS
  • 6. SCENEKIT, SPRITEKIT, METAL and third-party tools like Unity and Unreal Engine 6
  • 12. 12
  • 14. 14
  • 15. 15
  • 16. 16
  • 17. 17 ОПРЕДЕЛИТЬ РАСПОЛОЖЕНИЕ ОБЪЕКТА В ПРОСТРАНСТВЕ ЗАКРЕПИТЬ ОБЪЕКТ В ПОЗИЦИИ ОТРИСОВАТЬ ОБЪЕКТ В ПРОСТРАНСТВЕ
  • 20. КОД АЗИМУТА 20 func azimuthBetween(_ firstLocation: CLLocation, secondLocation: CLLocation) -> CGFloat { var azimuth: CGFloat = 0.0 // переводим координаты в радианы let firstLatitude: CGFloat = GLKMathDegreesToRadians(firstLocation.coordinate.latitude) let firstLongitude: CGFloat = GLKMathDegreesToRadians(firstLocation.coordinate.longitude) let secondLatitude: CGFloat = GLKMathDegreesToRadians(secondLocation.coordinate.latitude) let secondLongitude: CGFloat = GLKMathDegreesToRadians(secondLocation.coordinate.longitude) // считаем корректный радиан let resultLongitude: CGFloat = secondLongitude - firstLongitude let y: CGFloat = sin(resultLongitude) * cos(secondLatitude) let x: CGFloat = cos(firstLatitude) * sin(secondLatitude) - sin(firstLatitude) * cos(secondLatitude) * cos(resultLongitude) let radiansBearing: CGFloat = atan2(y, x) // переводим радиан в градусы azimuth = GLKMathRadiansToDegrees(radiansBearing) return azimuth }
  • 21. КОД АЗИМУТА 21 let firstLatitude: CGFloat = GLKMathDegreesToRadians(firstLocation.coordinate.latitude) let firstLongitude: CGFloat = GLKMathDegreesToRadians(firstLocation.coordinate.longitude) let secondLatitude: CGFloat = GLKMathDegreesToRadians(secondLocation.coordinate.latitude) let secondLongitude: CGFloat = GLKMathDegreesToRadians(secondLocation.coordinate.longitude) func azimuthBetween(_ firstLocation: CLLocation, secondLocation: CLLocation) -> CGFloat { var azimuth: CGFloat = 0.0 // переводим координаты в радианы let firstLatitude: CGFloat = GLKMathDegreesToRadians(firstLocation.coordinate.latitude) let firstLongitude: CGFloat = GLKMathDegreesToRadians(firstLocation.coordinate.longitude) let secondLatitude: CGFloat = GLKMathDegreesToRadians(secondLocation.coordinate.latitude) let secondLongitude: CGFloat = GLKMathDegreesToRadians(secondLocation.coordinate.longitude) // считаем корректный радиан let resultLongitude: CGFloat = secondLongitude - firstLongitude let y: CGFloat = sin(resultLongitude) * cos(secondLatitude) let x: CGFloat = cos(firstLatitude) * sin(secondLatitude) - sin(firstLatitude) * cos(secondLatitude) * cos(resultLongitude) let radiansBearing: CGFloat = atan2(y, x) // переводим радиан в градусы azimuth = GLKMathRadiansToDegrees(radiansBearing) return azimuth }
  • 22. КОД АЗИМУТА 22 let resultLongitude: CGFloat = secondLongitude - firstLongitude let y: CGFloat = sin(resultLongitude) * cos(secondLatitude) let x: CGFloat = cos(firstLatitude) * sin(secondLatitude) - sin(firstLatitude) * cos(secondLatitude) * cos(resultLongitude) let radiansBearing: CGFloat = atan2(y, x) func azimuthBetween(_ firstLocation: CLLocation, secondLocation: CLLocation) -> CGFloat { var azimuth: CGFloat = 0.0 // переводим координаты в радианы let firstLatitude: CGFloat = GLKMathDegreesToRadians(firstLocation.coordinate.latitude) let firstLongitude: CGFloat = GLKMathDegreesToRadians(firstLocation.coordinate.longitude) let secondLatitude: CGFloat = GLKMathDegreesToRadians(secondLocation.coordinate.latitude) let secondLongitude: CGFloat = GLKMathDegreesToRadians(secondLocation.coordinate.longitude) // считаем корректный радиан let resultLongitude: CGFloat = secondLongitude - firstLongitude let y: CGFloat = sin(resultLongitude) * cos(secondLatitude) let x: CGFloat = cos(firstLatitude) * sin(secondLatitude) - sin(firstLatitude) * cos(secondLatitude) * cos(resultLongitude) let radiansBearing: CGFloat = atan2(y, x) // переводим радиан в градусы azimuth = GLKMathRadiansToDegrees(radiansBearing) return azimuth }
  • 23. 23 КОД АЗИМУТА azimuth = GLKMathRadiansToDegrees(radiansBearing) func azimuthBetween(_ firstLocation: CLLocation, secondLocation: CLLocation) -> CGFloat { var azimuth: CGFloat = 0.0 // переводим координаты в радианы let firstLatitude: CGFloat = GLKMathDegreesToRadians(firstLocation.coordinate.latitude) let firstLongitude: CGFloat = GLKMathDegreesToRadians(firstLocation.coordinate.longitude) let secondLatitude: CGFloat = GLKMathDegreesToRadians(secondLocation.coordinate.latitude) let secondLongitude: CGFloat = GLKMathDegreesToRadians(secondLocation.coordinate.longitude) // считаем корректный радиан let resultLongitude: CGFloat = secondLongitude - firstLongitude let y: CGFloat = sin(resultLongitude) * cos(secondLatitude) let x: CGFloat = cos(firstLatitude) * sin(secondLatitude) - sin(firstLatitude) * cos(secondLatitude) * cos(resultLongitude) let radiansBearing: CGFloat = atan2(y, x) // переводим радиан в градусы azimuth = GLKMathRadiansToDegrees(radiansBearing) return azimuth }
  • 24. 24 ✅ ПОСЧИТАТЬ АЗИМУТ СФОРМИРОВАТЬ МАТРИЦУ 4Х4 И ANCHOR СФОРМИРОВАТЬ NODE
  • 25. ФОРМИРУЕМ МАТРИЦУ 25 func getTranslationMatrix(_ position: vector_float4) -> matrix_float4x4 { let matrix: matrix_float4x4 = matrix_identity_float4x4 matrix.columns[3] = position return matrix }
  • 26. ФОРМИРУЕМ ANCHOR 26 var anchor = ARAnchor(transform: place.setupTransform) skView.session.add(anchor)
  • 27. 27 ✅ ПОСЧИТАТЬ АЗИМУТ ✅ СФОРМИРОВАТЬ МАТРИЦУ 4Х4 И ANCHOR СФОРМИРОВАТЬ NODE
  • 28. ФОРМИРУЕМ NODE 28 func view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode? var configuration = ARWorldTrackingConfiguration() configuration.worldAlignment = .gravityAndHeading skView.session.run(with: configuration) НАСТРОЙКА ARSKViewDelegate
  • 29. 29 ✅ ПОСЧИТАТЬ АЗИМУТ ✅ СФОРМИРОВАТЬ МАТРИЦУ 4Х4 ✅ СФОРМИРОВАТЬ ANCHOR И NODE
  • 30. 30
  • 31. 31
  • 33. 33 ПОСЧИТАТЬ АЗИМУТ И ДИСТАНЦИЮ СФОРМИРОВАТЬ МАТРИЦУ 4Х4 И ANCHOR СФОРМИРОВАТЬ NODE
  • 35. ИТОГИ • Виральный эффект 35 • Лояльность пользователей • Повышение Retention rate • Фичеринг
  • 37. 37