Как заставить Vuforia работать с AVCaptureVideoPreviewLayer и SceneKit?

Я разрабатываю приложение дополненной реальности с помощью 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)
}

Реализацию можно резюмировать следующим образом:

  1. Создайте UIView под названием videoView.
  2. Инициализируйте AVCaptureVideoPreviewLayer и добавьте его как подуровень videoView.
  3. Создайте SCNView с именем scnView и инициализируйте сцену в scnView.
  4. Добавьте как 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


person lge    schedule 30.10.2014    source источник


Ответы (1)


Эта стратегия может очень быстро вам навредить. Лучше было бы отобразить все в одном представлении с одним контекстом OpenGL. Если Vuforia хочет создать свой собственный GL-материал, он также может поделиться этим представлением / контекстом.

Посмотрите пример кода Apple GLCameraRipple для получения изображений с камеры в реальном времени. в GL и SCNRenderer для рендеринга SceneKit его содержимое в произвольный контекст OpenGL (ES).

В качестве альтернативы, если вы просто хотите получить изображение с камеры в представлении SceneKit, помните, что вы можете назначить любой слой Core Animation для _ 2_ материала - это также должно работать для AVCaptureVideoPreviewLayer.

person rickster    schedule 30.10.2014