首页 > 解决方案 > 为什么增强图像 Sceneform SDK 示例不适用于运行时构建的 AR 对象?

问题描述

在完成随附的代码实验室后,我正在修改 Sceneform SDK 的增强图像示例代码。完成的示例将两种类型的对象添加到 AR 场景中:一种使用 CAD 软件建模并从二进制文件(即绿色迷宫)加载,另一种是使用和运行时构建的红球。sfbMaterialFactoryShapeFactory

一个简单的实验是去掉绿色迷宫,只剩下红球(当然也去掉物理引擎)。然而,在这种情况下,红球不会出现在 AR 场景中。

有趣的是,绿色迷宫不必出现在场景中 - 我的意思是我不必创建Node、分配可渲染等。https://github.com/CsabaConsulting/sceneform-android-sdk /blob/master/samples/augmentedimage/app/src/main/java/com/google/ar/sceneform/samples/augmentedimage/AugmentedImageNode.java#L139

mazeNode = new Node();
mazeNode.setParent(this);
mazeNode.setRenderable(mazeRenderable.getNow(null));

但是如果我取出加载代码https://github.com/CsabaConsulting/sceneform-android-sdk/blob/master/samples/augmentedimage/app/src/main/java/com/google/ar/sceneform/samples/ AugmentedImage/AugmentedImageNode.java#L89

mazeRenderable =
        ModelRenderable.builder()
                .setSource(context, Uri.parse("GreenMaze.sfb"))
                .build();

最重要的是setImage等待模型完全加载和构建的代码https://github.com/CsabaConsulting/sceneform-android-sdk/blob/master/samples/augmentedimage/app/src/main/java/com /google/ar/sceneform/samples/augmentedimage/AugmentedImageNode.java#L125

if (!mazeRenderable.isDone()) {
  CompletableFuture.allOf(mazeRenderable)
          .thenAccept((Void aVoid) -> setImage(image))
          .exceptionally(
                  throwable -> {
                    Log.e(TAG, "Exception loading", throwable);
                    return null;
                  });
  return;
}

球不会出现。如果我取出.isDone()上面的这一部分,球(以及我添加的任何其他运行时构造的对象)将不会出现。我在 AR 或其他任何地方都没有找到任何指示Session某些东西还没有准备好工作的指标。在我的应用程序中,我可能只使用运行时构建的 3D 对象,我是否sfb只需要那些出现的对象?

标签: augmented-realityarcoresceneformandroid-augmented-reality

解决方案


发生这种情况是因为基于工厂的场景构建CompletableFuture也隐含地包含!更具体地说,材料构建是一个返回的函数CompletableFuture

没有意识到这一点,我没有引用问题中的重要代码部分。您可以看到 Maze 模型加载器说明的正下方:

https://github.com/CsabaConsulting/sceneform-android-sdk/blob/master/samples/augmentedimage/app/src/main/java/com/google/ar/sceneform/samples/augmentedimage/AugmentedImageNode.java#L94

MaterialFactory.makeOpaqueWithColor(context, new Color(android.graphics.Color.RED))
  .thenAccept(
    material -> {
      ballRenderable =
        ShapeFactory.makeSphere(0.01f, new Vector3(0, 0, 0), material); });

在这里,我们可以看到返回 Future 的.thenAccept(迹象makeOpaqueWithColor。虽然模型加载也在代码中,但我们稍后也进行了此检查:

if (!mazeRenderable.isDone()) {
  CompletableFuture.allOf(mazeRenderable)

不幸的是,该代码没有关注同样是异步构建的材料。但是等待 3D 模型加载提供了足够的时间,以便在访问材料构建时也可以完成。然而,一旦我将迷宫连同未来的服务员代码部分一起移除,就没有等待材料建造完成的保障。这导致在材质实际准备好之前构建整个场景层次结构。这导致了一个看不见的场景。

https://github.com/googlecodelabs/arcore-augmentedimage-intro/issues/7


推荐阅读