我不确定如何为以下代码将模型加载到数组中。我所能做的就是在单个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()
中加载模型
答案 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();