如何解决如何为 .glb 文件 Sceneform ARCore 的可渲染实例提供材质
在生成 .glb 文件的 ModelRenderable 实例后,我曾尝试为材质赋予颜色,但它抛出错误 "java.util.concurrent.CompletionException: java.lang.IllegalArgumentException: submeshIndex ( 0) 超出范围。它必须小于 submeshCount (0)" 但同样适用于 .sfb 的 ModelRenderable 实例,请参阅下面的代码,我不知道如何处理这种情况。
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)
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",pointy4Cursor.material = navaPink // It's throwing exception as define above.
请帮忙
解决方法
我假设您使用的是 Sceneform 1.16 版,因为可以加载 GLB 模型?
您的问题是已知问题,如您所见here、here 或 here。
这里可能的解决方法是使用您可以在 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。
希望这能解决您的问题!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。