我已经在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
这显然涉及不必要地复制图像以及将图像转换为CGImage
并将其包裹在UIImage
中。目前,使用大约50%的CPU,高能量冲击,并且闲置大约180 MB的内存。
我还发现使用旧版Vuforia和SceneKit的this project,但它的表现并不好,它接管了UIView。我真正想要的是一种在SCNRenderer
或SCNView
中添加Vuforia相机绘制的方法,以便最大限度地减少C ++出血。
如何使用Metal将来自Vuforia的相机数据绘制到SCNScene的背景中,以便我可以在Objective-C ++中划分C ++代码并且通常在Swift中工作?
答案 0 :(得分:1)
解决问题的一种方法是使用我在VTK中使用的相同方法。只需将UIImage传递到场景的背景内容中即可。从性能角度来看并不是最佳的,但它确实有效。
func didUpdateCameraImage(image: UIImage?)
{
if let image = image {
_scene?.background.contents = image
}
}