【问题标题】:How to give material to the renderable instance of .glb file Sceneform ARCore如何为 .glb 文件 Sceneform ARCore 的可渲染实例提供材质
【发布时间】:2021-02-19 07:19:56
【问题描述】:

在生成 .glb 文件的 ModelRenderable 实例后,我曾尝试为材质赋予颜色,但它抛出错误 "java.util.concurrent.CompletionException: java.lang.IllegalArgumentException: submeshIndex ( 0) 超出范围。它必须小于 submeshCount (0)" 但同样适用于 .sfb 的 ModleRenderable 实例,请参阅下面的代码,我不知道如何处理这种情况。

ModelRenderable.builder()
                    .setSource(context, Uri.parse("redMarker.glb"))
                    .setIsFilamentGltf(true)
                    .build()
                    .thenAccept { renderable ->
                        pointy4Cursor = renderable
                    }
                    .exceptionally {
                        Log.e(TAG, "unable to load renderable pointy4Cursor  - " + it.toString())
                        val toast = Toast.makeText(context, "Unable to load renderable new model 6", Toast.LENGTH_LONG)
                        toast.setGravity(Gravity.CENTER, 0, 0)
                        toast.show()
                        null
                    },

 MaterialFactory.makeOpaqueWithColor(context, Color(context.getColor(R.color.colorSecondary)))
                    .thenAccept {
                        navaPink = it
                    }
                    .exceptionally {
                        Log.e(TAG, "unable to load material navaPink")
                        val toast = Toast.makeText(context, "Unable to load material", Toast.LENGTH_LONG)
                        toast.setGravity(Gravity.CENTER, 0, 0)
                        toast.show()
                        null
                    },

 pointy4Cursor.material = navaPink // It's throwing exception as define above. 

请帮忙

【问题讨论】:

    标签: android arcore sceneform


    【解决方案1】:

    我假设您使用的是 Sceneform 1.16 版,因为可以加载 GLB 模型?

    您的问题是已知问题,如您所见 hereherehere

    这里可能的解决方法是使用可以在 Sceneform 1.16 中获得的 filamentAsset。 你可以像这样得到它:

    private void addModel (Anchor anchor, ModelRenderable modelRenderable){
                // Creating a AnchorNode with a specific anchor
                AnchorNode anchorNode = new AnchorNode(anchor);
    
                // attaching the anchorNode with the ArFragment
                anchorNode.setParent(arCam.getArSceneView().getScene());
    
                // attaching the anchorNode with the TransformableNode
                TransformableNode model = new TransformableNode(arCam.getTransformationSystem());
                model.setParent(anchorNode);
    
                // attaching the 3d model with the TransformableNode
                // that is already attached with the node
                model.setRenderable(modelRenderable);
                model.select();
    
                // Saving the object as filament asset
                // -> Possibility to run animations and change textures
                filamentAsset = model.getRenderableInstance().getFilamentAsset();
            }
    

    该函数可以在 ModelRenderable.builder() 中调用,例如:

    ModelRenderable.builder()
                                .setSource(this, R.raw.avocado)
                                .setIsFilamentGltf(true)
                                .build()
                                .thenAccept(modelRenderable -> addModel(anchor, modelRenderable))
                                .exceptionally(throwable -> {
                                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                                    builder.setMessage("Somthing is not right" + throwable.getMessage()).show();
                                    return null;
                                });
    

    当您将 filamentAsset 保存到变量时,您可以访问 MaterialInstances 并设置参数:

    public void changeMaterials () {
                MaterialInstance[] materialInstances = filamentAsset.getMaterialInstances();
    
                TextureSampler textureSampler = new TextureSampler();
    
                for (MaterialInstance materialInstance : materialInstances) {
                    if (materialInstance.getName() == "example_name") {
                        materialInstance.setParameter("baseColorFactor", 0.3f, 0.5f, 0.7f); // Values for Red, Green and Blue
                    }
                }
            }
    

    可以设置哪些值可以查看here

    希望这能解决您的问题!

    【讨论】:

      猜你喜欢
      • 2019-06-21
      • 2019-11-24
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 2019-09-14
      • 1970-01-01
      相关资源
      最近更新 更多