Libgdx渲染3D游戏地板

5
在我的第一个3D游戏中,我现在想要渲染地面,实际上是一个平面(不是libgdx的Plane),位于y = 0
我想添加一个Texture,这样我就可以在每个级别中有不同的地面。
现在我的问题是:创建和渲染这个纹理地面的最佳方法是什么?
我考虑使用基本的Block Models,用ModelBuilder制作,然后添加一个Texture,但是由于我只能看到6个面中的1个面,所以2DTexture就足够了,所以我考虑使用Plane
我可以给Plane添加一个Texture吗?因为它是一个无限的3D空间中的面。然后我想到了DecalDecal是我要找的东西吗?我该如何使用它们?还是你有其他解决方案。
任何教程或其他帮助都将是很好的。
谢谢
1个回答

7

首先是关于贴花(Decals)的内容,贴花类似于精灵(Sprites),但在三维坐标中,可以这样使用:

private Decal decal; private DecalBatch decalBatch;

在 show() 或 create() 方法中使用。

decalBatch = new DecalBatch();
CameraGroupStrategy cameraGroupStrategy = new CameraGroupStrategy(camera);
decal = Decal.newDecal(textureRegion, true);
decal.setPosition(5, 8, 1);
decal.setScale(0.02f);
decalBatch.setGroupStrategy(cameraGroupStrategy);

in render()

//Add all your decals then flush()
decalBatch.add(decal);
decalBatch.flush();

还要使用decalBatch.dispose();来清除。

请注意,在未来,decal将成为3d的一部分,个人建议不要像我一样使用Decals,因为我在使用3d平面时遇到了一些问题。如果要使用3D平面,请按照以下方式使用。以下是我贴出的一些代码:

private Model createPlaneModel(final float width, final float height, final Material material, 
            final float u1, final float v1, final float u2, final float v2) {

modelBuilder.begin();
MeshPartBuilder bPartBuilder = modelBuilder.part("rect", 
GL10.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates, 
material);
//NOTE ON TEXTURE REGION, MAY FILL OTHER REGIONS, USE GET region.getU() and so on
bPartBuilder.setUVRange(u1, v1, u2, v2);
        bPartBuilder.rect(
                -(width*0.5f), -(height*0.5f), 0, 
                (width*0.5f), -(height*0.5f), 0, 
                (width*0.5f), (height*0.5f), 0, 
                -(width*0.5f), (height*0.5f), 0,
                0, 0, -1);


        return (modelBuilder.end());
    }

材质可以添加纹理属性

material.set(new TextureAttribute(TextureAttribute.Diffuse, texture)

为具有透明度的平面添加 Alpha 到其他属性。
attributes.add( new BlendingAttribute(color.getFloat(3)));          
attributes.add( new FloatAttribute(FloatAttribute.AlphaTest, 0.5f));

material.set(attributes);

初始化ModelInstance以获取返回的模型

modelInstance = new ModelInstance(createPlaneModel(...))

使用ModelBatch对象在render()中进行渲染

modelBatch.render(modelInstance );

请看下面这些链接。 http://www.badlogicgames.com/forum/viewtopic.php?f=11&t=11884 以下是我对平面与贴花的基准测试结果。 http://www.badlogicgames.com/forum/viewtopic.php?f=11&t=12493

那么现在我不应该使用贴花吗?使用MeshPartBuilder,我可以在三维空间中构建二维矩形吗?这正是我要寻找的,因为我想创建基于瓷砖的地板。使用这种方法,每个瓷砖都将是一个带有纹理材料的矩形。我是对的吗? - Robert P
你可以根据你的使用情况自由选择,如果你有很多透明部分,就使用平面(plane),否则使用贴花(decal)或模型(model)。另外请注意,如果你想渲染精灵(sprites),请在 modelbatch 之后添加精灵,顺序很重要。正如我所写的,你可以同时使用贴花和模型,贴花对内存友好一些,但你应该测试一下哪个更适合你。请注意,如果你在 u 和 v 中添加更高的值,你会得到重复的纹理。 - daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接