java 如何使用libGDX将网格转换为模型?

xe55xuns  于 2023-03-21  发布在  Java
关注(0)|答案(1)|浏览(120)

所以,我在游戏中创建了一个由2个三角形组成的网格。现在我想把这个网格变成一个模型,这样它就可以用ModelBatch渲染。如果我只是单独渲染它,它会给我带来奇怪的模型深度问题:

如果我把多个不同的模型渲染在一起,它不会给予我错误(两种树)。所以如果我把它渲染成一个模型,问题就有希望消失了。

y1aodyip

y1aodyip1#

要像你说的那样在modelBatch中使用mesh,你必须将它传递到model中。为此,你必须创建一个具有所需顶点和索引的mesh

顶点:是组成3D/2D形状的点(这里是由两个三角形组成的平面)。
指数:必须被三角测量的顶点的顺序、索引必须是“冗余的”以闭合和三角测量路径。

例如,这里有一个图像,以更好地解释:

然后你必须指定位置,UV和法线的属性。属性用来给着色器给予信息(mesh必须用着色器渲染)。对于每个顶点,着色器都有这些属性提供的信息。

职位:是空间中顶点的三维点。
UV:用于纹理Map,是修正的(更多信息here)。
法线:是归一化向量,面或顶点的法线(在你的例子中,我假设它只指向每个顶点的北极)。

要创建mesh

Mesh mesh = new Mesh(true, vertices.length, indices.length,
                    new VertexAttribute(Usage.Position, 3, ShaderProgram.POSITION_ATTRIBUTE),
                    new VertexAttribute(Usage.TextureCoordinates, 2, ShaderProgram.TEXCOORD_ATTRIBUTE),
                    new VertexAttribute(Usage.Normal, 3, ShaderProgram.NORMAL_ATTRIBUTE));

mesh.setVertices(vertices);
mesh.setIndices(indices);

如果网格是动态的,网格需要布尔值,顶点长度,索引长度和一些顶点属性,这些属性为着色器给予属性。model的默认着色器使用ShaderProgram.POSITION_ATTRIBUTEShaderProgram.TEXCOORD_ATTRIBUTEShaderProgram.NORMAL_ATTRIBUTE,您可以使用自己的着色器进行调整。
然后你添加顶点和索引。对于你的例子verticesindices是:

float vertices[] = {-1, -1, 0, // bottom left corner
                          -1,  1, 0, // top left corner
                           1,  1, 0, // top right corner
                           1, -1, 0}; // bottom right corner
    
short indices[] = {0,1,2, // first triangle (bottom left - top left - top right)
                         0,2,3}; // second triangle (bottom left - top right - bottom right)

创建网格后,您需要将其提供给modelBuilder,如下所示

ModelBuilder modelBuilder = new ModelBuilder(); // creates model build
modelBuilder.begin();// begin it
        
modelBuilder.part("plane", mesh, 
                GL20.GL_TRIANGLES,  
                0, 
                mesh.getNumIndices(), 
                new Material()); // creates your mesh
        
model = modelBuilder.end(); // makes the model
instance = new ModelInstance(model);

//...
//render it in render loop
modelBatch.begin(camera);
modelBatch.render(instance, environment);
modelBatch.end();

主要包括:

希望它能帮助你和其他正在寻找同样的过程。

相关问题