SlideShare a Scribd company logo
1 of 39
Download to read offline
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", Хомутников Тимофей, AvitoAvitoTech
 
“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 AirAvitoTech
 
ASO for iOS 11
ASO for iOS 11ASO for iOS 11
ASO for iOS 11AvitoTech
 
Добиваемся эффективности каждого из 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