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

问题描述 投票:0回答:1

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

如果我一起渲染多个不同的模型,它不会给我错误(两种树)。因此,如果我将其渲染为模型,问题有望消失。

网上找了好久也没找到答案。我什至花了一些时间查看 libGDX 文档,但一无所获。任何帮助将不胜感激。谢谢。

java opengl 3d libgdx
1个回答
0
投票

如您所说,要在

mesh
中使用
modelBatch
,您必须在
model
中传递它。为此,您必须创建一个具有所需顶点和索引的
mesh

Vertices:是构成 3D/2D 形状的点(这里是由两个三角形组成的平面)。

Indices:必须三角化的顶点的顺序,indicies 必须是“冗余的”以关闭和三角化路径。

例如这里有一张图片可以更好地解释:

然后你必须指定position、uv和normals的属性。属性用于向着色器提供信息(

mesh
必须使用着色器渲染)。对于每个顶点,着色器都有这些属性给出的信息。

Position:是空间中顶点的 3D 点。

UV :用于纹理映射并且是强制性的(更多信息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_ATTRIBUTE
ShaderProgram.TEXCOORD_ATTRIBUTE
ShaderProgram.NORMAL_ATTRIBUTE
,您可以调整它们以使用自己的着色器。

然后添加顶点和索引。对于您的情况

vertices
indices
是:

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();

以下主要是:

希望它能帮助您和其他正在寻找相同过程的人。

© www.soinside.com 2019 - 2024. All rights reserved.