如何使用多个模型加载ModelRenderable.builder()?

时间:2018-08-08 08:08:14

标签: android arcore

我不确定如何为以下代码将模型加载到数组中。我所能做的就是在单个ModelRenderable.builder()中加载单个模型。但不适用于同一ModelRenderable.builder()中的多个模型。我很高兴有人能帮助我。

ModelRenderable.builder()
    .setSource(this, Uri.parse("https://unembittered-vector.000webhostapp.com/3dmodels/andy.sfb") )
        .setRegistryId(1)
    .build()
    .thenAccept(renderable -> andyRenderable = renderable)
    .exceptionally(
        throwable -> {
          Toast toast =
              Toast.makeText(this, "Unable to load andy renderable", Toast.LENGTH_LONG);
          toast.setGravity(Gravity.CENTER, 0, 0);
          toast.show();
          return null;
        });
  ModelRenderable.builder()
          .setSource(this, Uri.parse("https://unembittered-vector.000webhostapp.com/3dmodels/scene.sfb") )

          .build()
          .thenAccept(renderable -> andyRenderable1 = renderable)
          .exceptionally(
                  throwable -> {
                      Toast toast =
                              Toast.makeText(this, "Unable to load andy renderable", Toast.LENGTH_LONG);
                      toast.setGravity(Gravity.CENTER, 0, 0);
                      toast.show();
                      return null;
                  });
  ModelRenderable.builder()
          .setSource(this, Uri.parse("https://unembittered-vector.000webhostapp.com/3dmodels/shoes.sfb"))

          .build()
          .thenAccept(renderable -> andyRenderable2 = renderable)
          .exceptionally(
                  throwable -> {
                      Toast toast =
                              Toast.makeText(this, "Unable to load andy renderable", Toast.LENGTH_LONG);
                      toast.setGravity(Gravity.CENTER, 0, 0);
                      toast.show();
                      return null;
                  });

在此处调用andyrenderable加载到锚点

Anchor anchor = hitResult.createAnchor();
        AnchorNode anchorNode = new AnchorNode(anchor);
        anchorNode.setParent(arFragment.getArSceneView().getScene());
        TransformableNode andy = new TransformableNode(arFragment.getTransformationSystem());
        andy.setParent(anchorNode);
        andy.setRenderable(andyRenderable);

        andy.select();

我能做的是,我可以从Uri加载模型,但我也需要在与其他模型的数组相同的ModelRenderable.builder()中加载模型

3 个答案:

答案 0 :(得分:0)

尝试一下

List<RederableDefinition.Submesh> submeshes = new List<>;
submeshes.add(new RenderableDefinition.Submesh.setMaterial(Material material).setName(String name).setTriangleIndices(List<Integer> triangleIndices).build());

RenderableDefinition definition = new RenderableDefinition.setSubmeshes(submeshes).builder();
ModelRenderable.setSource(definition).build();

实际上,我不完全知道该期望什么,但是Submeshes是材质(我希望您的意思是纹理),并且 only 参数可以作为其中的列表一个ModelRenderable。

代码的一部分看起来像是您试图将3个3D模型放在同一模型上。就像在同一个地方画3个一样,它们看起来很怪异,而且彼此叠合。 如果您想给Andy鞋子穿上鞋子,也许还想作为背景,那么您需要先在3D模型上进行制作,然后再放入其他模型中。

答案 1 :(得分:0)

sceneform solarsystem sample的启发,我未经测试的解决方案是:

String[] uris = {
  "https://unembittered-vector.000webhostapp.com/3dmodels/andy.sfb",
  ...
  "https://unembittered-vector.000webhostapp.com/3dmodels/shoes.sfb"
};
CompletableFuture<ModelRenderable>[] mrs = new CompletableFuture<ModelRenderable>[uris.length];

for(int u = 0; u < uris.length; u++)
  mrs[u] = ModelRenderable.builder().setSource(this, Uri.parse(uris[u])).build();

CompletableFuture.allOf(mrs).handle((notUsed, throwable) -> {
    if (throwable != null) {
       throwable.printStackTrace();
       return null;
    }

    try {
      for(int m = 0; m < mrs.length; m++)
        mrs[m].get(); // Do something, frist is andy.sfb, ..., last is shoes.sfb
    }catch (InterruptedException | ExecutionException ex) {
      ex.printStacktrace();
    }
    return null;
});

答案 2 :(得分:0)

使用CompletableFuture在ModelRenderable中更改纹理

CompletableFuture<Texture> futureTexture = Texture.builder()
          .setSource(this, Uri.parse(url))
          .build();

并在ModelRendrable中调用futureTexture

 ModelRenderable.builder()
    .setSource(this, Uri.parse("https://unembittered-vector.000webhostapp.com/3dmodels/andy.sfb"))

    .build()
    //.thenAccept(renderable -> andyRenderable = renderable)

        .thenAcceptBoth(futureTexture, (renderable, texture) -> {
            andyRenderable = renderable;

            andyRenderable.getMaterial().setTexture("baseColor", texture);

        })
    .exceptionally(
        throwable -> {
          Toast toast =
              Toast.makeText(this, "Unable to load andy renderable", Toast.LENGTH_LONG);
          toast.setGravity(Gravity.CENTER, 0, 0);
          toast.show();
          return null;
        });

调用可变形节点

TransformableNode andy1 = new TransformableNode(arFragment.getTransformationSystem());
            andy1.setParent(anchorNode);
            andy1.setRenderable(andyRenderable);
            andy1.select();