0

我有一个 ModelRenderable 附加到一个节点并在 ArFragment 中呈现。

我想以突出的颜色向用户突出显示该元素 0.5 秒。

我试图改变材料,但没有成功。渲染冻结而不会引发错误。这是我尝试过的:

private void addHighlightToNode(Node node) {

    CompletableFuture<Material> materialCompletableFuture =
            MaterialFactory.makeOpaqueWithColor(this, new Color(0, 255, 244));
    ModelRenderable highlightedRenderable = (ModelRenderable) node.getRenderable();
    highlightedRenderable = highlightedRenderable.makeCopy();
    try {
        highlightedRenderable.setMaterial(materialCompletableFuture.get());
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
    node.setRenderable(highlightedRenderable);
}

我设法在运行时将节点的灯光设置为不同的颜色,但效果并不接近我需要的效果。

node.setLight(Light.builder(Light.Type.POINT).setColor(new Color(0,255,244)).build());

我怎样才能改变颜色?

4

1 回答 1

2

创建材质是异步的,这就是它返回 CompletableFuture 的原因。您正在调用 CompletableFuture.get(),这是一个阻塞调用,但由于您在 UI 线程上,它最终会冻结应用程序。如果您移动要在 thenAccept 中调用的设置,则它可以正常工作。

  private void addHighlightToNode(Node node) {
    CompletableFuture<Material> materialCompletableFuture =
            MaterialFactory.makeOpaqueWithColor(this, new Color(0, 255, 244));

    materialCompletableFuture.thenAccept(material -> {
      Renderable r2 = node.getRenderable().makeCopy();
      r2.setMaterial(material);
      node.setRenderable(r2);
    });
  }
于 2018-07-18T17:28:20.873 回答