【问题标题】:ModelRenderable with multiple submeshes only showing one submesh具有多个子网格的 ModelRenderable 仅显示一个子网格
【发布时间】:2019-11-17 01:05:15
【问题描述】:

我需要在 ARCore 中将几个立方体组合成一个 ModelRenderable。我的代码从每个立方体中获取顶点和子网格并创建一个 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 中渲染多个立方体。

【问题讨论】:

  • 我成功击败了StackOverflow的boss战

标签: java android arcore sceneform


【解决方案1】:

当您合并最终数组(命名为vertices)中的所有顶点时,三角形索引应在每个子立方体中偏移。

  • 对于第一个立方体,索引值从 0 到 23(因为每个立方体有 24 个顶点)
  • 对于第二个多维数据集,索引值从 24 变为 47
  • 对于第 ith 个立方体,索引值从 (i-1)*24 变为 i*24-1

否则,您可以通过仅创建一个立方体几何体和节点层次结构来获得相同的结果,每个子节点使用该可渲染但位置不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2012-05-01
    相关资源
    最近更新 更多