【问题标题】:Merging Models from ModelBuilder in LibGDX在 LibGDX 中合并来自 ModelBuilder 的模型
【发布时间】:2014-02-10 06:51:20
【问题描述】:

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

  • 第一个是白色圆柱体,
  • 第二个具有相同属性的红色圆柱体

如何才能只渲染一个圆柱体(实例/模型/对象/可以渲染的任何东西),由白色上方的红色组成(反之亦然)。

Pixmap pixmap1 = new Pixmap(1, 1, Format.RGBA8888);
pixmap1.setColor(Color.WHITE);
pixmap1.fill();
Texture white = new Texture(pixmap1);
//...
Texture red = new Texture(pixmap2);

model1 = modelBuilder.createCylinder(4f, 6f, 4f, 16, 
        new Material(
                TextureAttribute.createDiffuse(white), 
                ColorAttribute.createSpecular(1,1,1,1), 
                FloatAttribute.createShininess(8f))
        , Usage.Position | Usage.Normal | Usage.TextureCoordinates);
model1I_white = new ModelInstance(model1, 0, 0, 0);
//...
model2I_red = new ModelInstance(model2, 0, 0, -2f);

然后我用 ModelBatch#render 渲染 ModelInstance。

【问题讨论】:

    标签: java 3d libgdx


    【解决方案1】:

    您可以使用 MeshBuilder 类创建 2 个圆柱体,而不是使用 createCylinder(),然后使用 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.begin() 之后通过对 meshBuilder.part() 的附加调用使其工作!
    【解决方案2】:

    非常感谢 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(VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal | VertexAttributes.Usage.ColorPacked);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      相关资源
      最近更新 更多