如何更改ModelRenderable的颜色?

时间:2018-07-18 15:16:58

标签: android colors augmented-reality arcore sceneform

我有一个ModelRenderable附加到Node并在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的光设置为不同的颜色,但是效果与我所需的接近。

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

如何更改颜色?

1 个答案:

答案 0 :(得分:1)

创建材料是异步的,这就是为什么它返回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);
    });
  }