java ModelRenderable具有多个子图,仅显示一个子图
我需要将ARCore中的几个立方体组合成一个可渲染的模型。我的代码是从每个立方体中获取顶点和子网格,并创建一个ModelRenderable,但是,只渲染最后添加的立方体
如前所述,我只添加了最后一个立方体。我能看到的一件奇怪的事情是,有些顶点的位置相同,所以我不确定这是否正确
下面是我的代码,它获取每个立方体并添加子图和顶点
List<RenderableDefinition.Submesh> submeshes = new ArrayList<>();
List<Vertex> vertices = new ArrayList<>();
for (SubCube cube : cubes) {
submeshes.add(cube.getSubmesh());
vertices.addAll(cube.getVertices());
}
RenderableDefinition renderableDefinition = RenderableDefinition.builder().setVertices(vertices).setSubmeshes(submeshes).build();
CompletableFuture future = ModelRenderable.builder().setSource(renderableDefinition).build();
ModelRenderable result = (ModelRenderable) future.get();
这是我创建立方体的代码。它基本上与ShapeFactory相同。makeCube
public SubCube makeCube(Vector3 size, Vector3 center, Material material) {
AndroidPreconditions.checkMinAndroidApiLevel();
Vector3 extents = size.scaled(0.5F);
Vector3 p0 = Vector3.add(center, new Vector3(-extents.x, -extents.y, extents.z));
Vector3 p1 = Vector3.add(center, new Vector3(extents.x, -extents.y, extents.z));
Vector3 p2 = Vector3.add(center, new Vector3(extents.x, -extents.y, -extents.z));
Vector3 p3 = Vector3.add(center, new Vector3(-extents.x, -extents.y, -extents.z));
Vector3 p4 = Vector3.add(center, new Vector3(-extents.x, extents.y, extents.z));
Vector3 p5 = Vector3.add(center, new Vector3(extents.x, extents.y, extents.z));
Vector3 p6 = Vector3.add(center, new Vector3(extents.x, extents.y, -extents.z));
Vector3 p7 = Vector3.add(center, new Vector3(-extents.x, extents.y, -extents.z));
Vector3 up = Vector3.up();
Vector3 down = Vector3.down();
Vector3 front = Vector3.forward();
Vector3 back = Vector3.back();
Vector3 left = Vector3.left();
Vector3 right = Vector3.right();
Vertex.UvCoordinate uv00 = new Vertex.UvCoordinate(0.0F, 0.0F);
Vertex.UvCoordinate uv10 = new Vertex.UvCoordinate(1.0F, 0.0F);
Vertex.UvCoordinate uv01 = new Vertex.UvCoordinate(0.0F, 1.0F);
Vertex.UvCoordinate uv11 = new Vertex.UvCoordinate(1.0F, 1.0F);
List<Vertex> vertices = Arrays.asList(
Vertex.builder().setPosition(p0).setNormal(down).setUvCoordinate(uv01).build(),
Vertex.builder().setPosition(p1).setNormal(down).setUvCoordinate(uv11).build(),
Vertex.builder().setPosition(p2).setNormal(down).setUvCoordinate(uv10).build(),
Vertex.builder().setPosition(p3).setNormal(down).setUvCoordinate(uv00).build(),
Vertex.builder().setPosition(p7).setNormal(left).setUvCoordinate(uv01).build(),
Vertex.builder().setPosition(p4).setNormal(left).setUvCoordinate(uv11).build(),
Vertex.builder().setPosition(p0).setNormal(left).setUvCoordinate(uv10).build(),
Vertex.builder().setPosition(p3).setNormal(left).setUvCoordinate(uv00).build(),
Vertex.builder().setPosition(p4).setNormal(front).setUvCoordinate(uv01).build(),
Vertex.builder().setPosition(p5).setNormal(front).setUvCoordinate(uv11).build(),
Vertex.builder().setPosition(p1).setNormal(front).setUvCoordinate(uv10).build(),
Vertex.builder().setPosition(p0).setNormal(front).setUvCoordinate(uv00).build(),
Vertex.builder().setPosition(p6).setNormal(back).setUvCoordinate(uv01).build(),
Vertex.builder().setPosition(p7).setNormal(back).setUvCoordinate(uv11).build(),
Vertex.builder().setPosition(p3).setNormal(back).setUvCoordinate(uv10).build(),
Vertex.builder().setPosition(p2).setNormal(back).setUvCoordinate(uv00).build(),
Vertex.builder().setPosition(p5).setNormal(right).setUvCoordinate(uv01).build(),
Vertex.builder().setPosition(p6).setNormal(right).setUvCoordinate(uv11).build(),
Vertex.builder().setPosition(p2).setNormal(right).setUvCoordinate(uv10).build(),
Vertex.builder().setPosition(p1).setNormal(right).setUvCoordinate(uv00).build(),
Vertex.builder().setPosition(p7).setNormal(up).setUvCoordinate(uv01).build(),
Vertex.builder().setPosition(p6).setNormal(up).setUvCoordinate(uv11).build(),
Vertex.builder().setPosition(p5).setNormal(up).setUvCoordinate(uv10).build(),
Vertex.builder().setPosition(p4).setNormal(up).setUvCoordinate(uv00).build());
ArrayList<Integer> triangleIndices = new ArrayList(36);
for(int i = 0; i < 6; ++i) {
triangleIndices.add(3 + 4 * i);
triangleIndices.add(1 + 4 * i);
triangleIndices.add(0 + 4 * i);
triangleIndices.add(3 + 4 * i);
triangleIndices.add(2 + 4 * i);
triangleIndices.add(1 + 4 * i);
}
RenderableDefinition.Submesh submesh = RenderableDefinition.Submesh.builder().setTriangleIndices(triangleIndices).setMaterial(material).build();
return new SubCube(submesh, vertices);
}
我没有收到错误信息或任何东西。我知道传递到makeCube的位置不同,所以这不是问题所在。预期的行为是,我能够在一个ModelRenderable中渲染多个立方体
# 1 楼答案
当您将所有顶点合并到一个最终数组(名为
vertices
)中时,三角形索引应该在每个子立方体中偏移否则,通过仅创建一个立方体几何体和一个节点层次,每个子节点使用可渲染但不同的位置,可以实现相同的结果