Vuforia使用Metal和SceneKit

时间:2016-05-19 09:41:00

标签: swift scenekit vuforia metal

我已经在iOS上基于Framemarker的增强现实应用中使用了Vuforia一段时间。我已经厌倦了使用Kitware的VTK,并希望切换到SceneKit。如何使用Metal和Vuforia最好地吸引场景的背景?

我目前的技术(Objective-C)涉及从Vuforia中抓取每一帧视频:

- (void)Vuforia_onUpdate:(Vuforia::State *)state
{
    Vuforia::Frame frame = state->getFrame();

    for (int i = 0; i < frame.getNumImages(); i++) {
        const Vuforia::Image *image = frame.getImage(i);
        if (image->getFormat() == kVuforiaFrameFormat) {
            [self.delegate updateCameraSceneWithBitmap:image->getPixels() size:CGSizeMake(image->getWidth(), image->getHeight()) format:OARCameraImageFormatRGB];
        }
    }

    // I also grab out the frame marker poses and convert the matrices to
    // SceneKit compatible ones.
}

然后在Swift-land:

// Get image into UIImage and assign to background
scene.background.contents = backgroundImage

enter image description here

这显然涉及不必要地复制图像以及将图像转换为CGImage并将其包裹在UIImage中。目前,使用大约50%的CPU,高能量冲击,并且闲置大约180 MB的内存。

我还发现使用旧版Vuforia和SceneKit的this project,但它的表现并不好,它接管了UIView。我真正想要的是一种在SCNRendererSCNView中添加Vuforia相机绘制的方法,以便最大限度地减少C ++出血。

如何使用Metal将来自Vuforia的相机数据绘制到SCNScene的背景中,以便我可以在Objective-C ++中划分C ++代码并且通常在Swift中工作?

1 个答案:

答案 0 :(得分:1)

使用UIImage

设置场景的背景

解决问题的一种方法是使用我在VTK中使用的相同方法。只需将UIImage传递到场景的背景内容中即可。从性能角度来看并不是最佳的,但它确实有效。

func didUpdateCameraImage(image: UIImage?)
{
    if let image = image {
        _scene?.background.contents = image
    }
}