Java 在LibGDX中合并ModelBuilder中的模型

Java 在LibGDX中合并ModelBuilder中的模型,java,3d,libgdx,Java,3d,Libgdx,我是LibGDX 3D facilities的新手,我想知道如何合并使用该类创建的两个圆柱体。我有两个ModelInstance: 第一个是白色的圆筒 第二个是具有相同属性的红色圆柱体 如何使只渲染一个圆柱体(实例/模型/对象/可以渲染的任何对象),由白色圆柱体上方的红色圆柱体组成(反之亦然) 然后我使用渲染ModelInstance。而不是使用createCylinder(),您可以使用MeshBuilder类创建2个圆柱体,并使用part()合成最终圆柱体 非常感谢Aurel分享代码 可

我是LibGDX 3D facilities的新手,我想知道如何合并使用该类创建的两个圆柱体。我有两个ModelInstance:

  • 第一个是白色的圆筒
  • 第二个是具有相同属性的红色圆柱体
如何使只渲染一个圆柱体(实例/模型/对象/可以渲染的任何对象),由白色圆柱体上方的红色圆柱体组成(反之亦然)


然后我使用渲染ModelInstance。

而不是使用createCylinder(),您可以使用MeshBuilder类创建2个圆柱体,并使用part()合成最终圆柱体


非常感谢Aurel分享代码

可能libGdx的Api略有改变,所以我将发布为我工作的完整代码

    MeshBuilder meshBuilder = new MeshBuilder();
    meshBuilder.begin(VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal);
    meshBuilder.part("id1", GL20.GL_TRIANGLES);
    meshBuilder.box(1f, 1f, 1f);
    Mesh mesh1 = meshBuilder.end();

    meshBuilder.begin(VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal);
    meshBuilder.part("id2", GL20.GL_TRIANGLES);
    meshBuilder.cylinder(1f, 1f, 1f, 16);
    Mesh mesh2 = meshBuilder.end();


    ModelBuilder modelBuilder = new ModelBuilder();
    modelBuilder.begin();

    modelBuilder.part("part1",
            mesh1,
            GL20.GL_TRIANGLES,
            new Material(ColorAttribute.createDiffuse(Color.RED)));

    modelBuilder.part("part2",
            mesh2,
            GL20.GL_TRIANGLES,
            new Material(ColorAttribute.createDiffuse(Color.RED)))
            .mesh.transform(new Matrix4().translate(1, 0, 0f));
要为每个网格保留颜色,请将VertxtAttributes.Usage.ColorPacked添加为meshBuilder.begin()


今天晚上我会试试这个,然后告诉你它是否能很快奏效。看起来很简单!我喜欢它,最后在meshBuilder.begin()之后再调用meshBuilder.part()!
meshBuilder.begin();
meshBuilder.cylinder(4f, 6f, 4f, 16);
Mesh cylinder1 = meshBuilder.end();

meshBuilder.begin();
meshBuilder.cylinder(4f, 6f, 4f, 16);
Mesh cylinder2 = meshBuilder.end();


modelBuilder.begin();

modelBuilder.part("cylinder1", 
    cylinder1,
    Usage.Position | Usage.Normal | Usage.TextureCoordinates,
    new Material(
        TextureAttribute.createDiffuse(white), 
        ColorAttribute.createSpecular(1,1,1,1), 
        FloatAttribute.createShininess(8f)));

modelBuilder.part("cylinder2",
    cylinder2,
    Usage.Position | Usage.Normal | Usage.TextureCoordinates,
    new Material(
        TextureAttribute.createDiffuse(red), 
        ColorAttribute.createSpecular(1,1,1,1), 
        FloatAttribute.createShininess(8f)))
    .mesh.transform(new Matrix4().translate(0, 0, -2f));

Model finalCylinder = modelBuilder.end();
    MeshBuilder meshBuilder = new MeshBuilder();
    meshBuilder.begin(VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal);
    meshBuilder.part("id1", GL20.GL_TRIANGLES);
    meshBuilder.box(1f, 1f, 1f);
    Mesh mesh1 = meshBuilder.end();

    meshBuilder.begin(VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal);
    meshBuilder.part("id2", GL20.GL_TRIANGLES);
    meshBuilder.cylinder(1f, 1f, 1f, 16);
    Mesh mesh2 = meshBuilder.end();


    ModelBuilder modelBuilder = new ModelBuilder();
    modelBuilder.begin();

    modelBuilder.part("part1",
            mesh1,
            GL20.GL_TRIANGLES,
            new Material(ColorAttribute.createDiffuse(Color.RED)));

    modelBuilder.part("part2",
            mesh2,
            GL20.GL_TRIANGLES,
            new Material(ColorAttribute.createDiffuse(Color.RED)))
            .mesh.transform(new Matrix4().translate(1, 0, 0f));
        meshBuilder.begin(VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal | VertexAttributes.Usage.ColorPacked);