我是LibGDX 3D设备的新手,我想知道如何合并使用ModelBuilder#createCylinder类创建的两个柱面。我有两个ModelInstances:
如何使只渲染一个圆柱(实例/模型/对象/可以渲染的任何东西)由白色上方的红色组成(反之亦然)。
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。
答案 0 :(得分:4)
您可以使用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();
答案 1 :(得分:1)
非常感谢Aurel分享代码。
可能libGdx的Api略有变化所以我会发布为我工作的完整代码
/
要为每个网格保留颜色,请将VertxtAttributes.Usage.ColorPacked添加为meshBuilder.begin()
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));