在libGDX中设置3d网格的索引

时间:2015-01-21 00:20:25

标签: java 3d libgdx mesh

我在libGDX中遇到了问题。我想用网格创建一个简单的无纹理3d模型。这是我创建四面体的代码:

Material material = new Material(new IntAttribute(IntAttribute.CullFace), ColorAttribute.createDiffuse(Color.GRAY));
ModelBuilder modelBuilder = new ModelBuilder();
Mesh mesh = new Mesh(true, 6, 20, new VertexAttribute(Usage.Position, 3, "test"));
mesh.setVertices(new float[] { -0.5f, -0.5f, 0,
                                0.5f, -0.5f, 0,
                                0, 0.5f, 0,
                                0, 0, 1});

mesh.setIndices(new short[] {0, 3, 0, 2, 0, 1, 1, 3, 1, 2, 2, 3});
modelBuilder.begin();
modelBuilder.part("test", mesh, GL20.GL_LINE_STRIP, material);
model = modelBuilder.end();

此代码工作正常,但我不知道如何为生成的顶点设置网格索引。 我目前有一个包含顶点的列表,每个顶点都有一个列表,其中包含与其连接的顶点。 我如何设置网格的索引来实现这种连接?

提前致谢并抱歉我的英语不好。

1 个答案:

答案 0 :(得分:1)

假设您只想绘制边缘而不是曲面:

我认为不可能使用线条绘制四面体的所有边缘而不至少绘制两条边缘。形状不够复杂,无法证明尝试使用线条来优化它。我认为在使用线条或三角形条带的情况下很少见。

所以将GL20.GL_LINE_STRIP更改为GL20.GL_LINES。现在您的indices数组应该是定义线段的索引对的列表。前两个索引定义第一个分段,第三个和第四个索引定义第二个分段,依此类推。

四面体有六条边,所以你应该列出这些点之间的所有连接。在四面体的情况下,它可能是所有可能的点组合。索引号与您定义的顶点对应。您定义了12个浮点数,每个顶点有三个浮点数,因此对于四个总顶点,您将有0到3的索引。

这是一个例子,虽然对的顺序并不重要。

{
 0,1, //Connect the 1st vertex (-0.5f, -0.5f, 0) to the 2nd vertex (0.5f, -0.5f, 0)
 0,2, //Connect the 1st vertex to the 3rd vertex (0, 0.5f, 0)
 0,3, //Connect the 1st vertex to the 4th vertex (0, 0, 1)
 1,2, //Connect the 2nd vertex to the 3rd vertex
 1,3, //Connect the 2nd vertex to the 4th vertex
 2,3  //Connect the 3rd vertex to the 4th vertex
}

这将绘制所有边缘。

如果要绘制实际的三角形曲面,则应使用GL_TRIANGLES,并且索引列表每个三角形需要三个元素,总共12个元素。每三个元素将定义要绘制的三角形的三个角,但您还需要确保它们都以相同的方向缠绕(顺时针或逆时针取决于您的剔除设置)。

实际上,对于一个简单的四面体,你可以使用一个三角形条,但如果你想为它添加光照则不会,因为由于法线不同,没有一个顶点可以在面之间共享。