如何让Vuforia使用AVCaptureVideoPreviewLayer和SceneKit?

时间:2014-10-30 00:01:52

标签: rendering augmented-reality avcapturesession vuforia scenekit

我正在使用Vuforia SDK开发增强现实应用。我正在尝试使用AVCaptureVideoPreviewLayer和SceneKit进行应用程序渲染,而不是使用Vuforia示例代码提供的原始OpenGL调用。

我得到了AVCaptureVideoPreviewLayer和没有Vuforia的SceneView,即我设法在相机视频背景上绘制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. 创建名为videoView的UIView。
  2. 初始化AVCaptureVideoPreviewLayer,并将其添加为videoView的子图层。
  3. 创建一个名为scnView的SCNView并初始化场景o scnView。
  4. 将videoView和scnView添加到根UIView。
  5. 目前我正在尝试集成增强现实功能,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

1 个答案:

答案 0 :(得分:0)

这种策略可能会让你很快变得丑陋。更好的方法是使用一个OpenGL上下文将所有内容渲染到一个视图中。如果Vuforia想要做自己的GL内容,它也可以共享该视图/上下文。

查看Apple的GLCameraRipple示例代码,了解将实时摄像机图像转换为GL,以及SCNRenderer使SceneKit将其内容呈现为任意OpenGL(ES)上下文。

或者,如果您只想将相机图像放入SceneKit视图中,请记住您可以将任何Core Animation图层分配给材质的contents - 这也适用于AVCaptureVideoPreviewLayer。< / p>