代码之家  ›  专栏  ›  技术社区  ›  Crigges

在libGDX中设置三维网格的索引

  •  0
  • Crigges  · 技术社区  · 11 年前

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

    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 回复  |  直到 11 年前
        1
  •  1
  •   Tenfour04    11 年前

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

    我认为不可能使用线条条来绘制四面体的所有边而不绘制至少一条边两次。形状不够复杂,不足以证明使用线条条来优化它。我认为很少出现使用线条条或三角形条有意义的情况。

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

    四面体有六条边,所以你应该列出这些点之间的所有连接。在四面体的情况下,它是所有可能的点的组合。索引号与您定义的顶点相对应。您定义了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个元素。每三个元素将定义要绘制的三角形的三个角,但您还需要确保它们都以相同的方向缠绕(顺时针或逆时针,取决于您的剔除设置)。

    实际上,在简单四面体的情况下,您可以使用三角形条带,但如果您想为其添加照明,则不需要,因为由于法线不同,面之间无法共享任何顶点。