Я разрабатываю приложение дополненной реальности с помощью Vuforia SDK. Я пытаюсь использовать AVCaptureVideoPreviewLayer и SceneKit для рендеринга приложений вместо необработанных вызовов OpenGL, предоставляемых образцом кода Vuforia.
Я получил AVCaptureVideoPreviewLayer и SceneView, работающие без Vuforia, т.е. мне удалось нарисовать 3D-сцену поверх фонового изображения камеры. Код находится по адресу: https://github.com/lge88/scenekit-test0/blob/master/scenekit-test0/GameViewController.swift#L74-L85:
func initViews() {
let rootView = self.view
let scnView = createSceneView()
let scene = createScene()
scnView.scene = scene
let videoView = createVideoView()
rootView.addSubview(videoView)
rootView.addSubview(scnView)
}
Реализацию можно резюмировать следующим образом:
- Создайте UIView под названием videoView.
- Инициализируйте AVCaptureVideoPreviewLayer и добавьте его как подуровень videoView.
- Создайте SCNView с именем scnView и инициализируйте сцену в scnView.
- Добавьте как videoView, так и scnView в корневой UIView.
В настоящее время я пытаюсь интегрировать функцию дополненной реальности, GameViewController.swift # L68-L71:
initViews()
animateScene()
initControls()
ARServer(size:viewFrame.size, done: initARCallback)
ARServer - это класс, который заботится об инициализации Vuforia, его реализация взята из примера кода Vuforia ImageTargets. Трекер работает, он может успешно отслеживать цели выборки данных.
Однако рендеринг AVCaptureVideoPreviewLayer работает некорректно, область области рендеринга видео изменяется, а видеослой не обновляется, он показывает статическое изображение, снятое при запуске камеры трекера. Вот как это выглядит со скриншота ipad: https://github.com/lge88/scenekit-test0/blob/master/video-preview-layer-issue.png