LibGDX的mesh.getVerticies输出是什么?

时间:2016-08-02 23:03:00

标签: java 3d libgdx mesh

我正在研究3D LibGDX项目,并且正在尝试操纵3D模型的顶点。我有模型加载,我把它作为我的代码:

Model plain = assets.get("plain.g3db", Model.class);
for(Mesh m : plain.meshes){
    float[] t = m.getVertices(new float[m.getMaxVertices()]);
    float[] newVerticies = new float[m.getMaxVertices()];
    for(int i = 0; i < t.length-1; i++){
        newVerticies[i] = t[i];
        System.out.println("X: " + t[i] + " " + i);
        newVerticies[i] = t[i];
        System.out.println("Y: " + t[i++] + " " + i);
        newVerticies[i] = random.nextInt(1-0) + 0;
        System.out.println("Z: " + t[i++] + " " + i);
        newVerticies[i] = t[i];
        System.out.println("R: " + t[i++]);
        newVerticies[i] = t[i];
        System.out.println("G: " + t[i++]);
        newVerticies[i] = t[i];
        System.out.println("B: " + t[i++]);
        newVerticies[i] = t[i];
        System.out.println("A: " + t[i++]);
    }
    m.setVertices(newVerticies);
}

这不是我想要的方式,但我至少可以看到模型。如果我注释掉这些内容:

newVerticies[i] = t[i];
System.out.println("R: " + t[i++]);
newVerticies[i] = t[i];
System.out.println("G: " + t[i++]);
newVerticies[i] = t[i];
System.out.println("B: " + t[i++]);
newVerticies[i] = t[i];
System.out.println("A: " + t[i++]);

我刚看到黑屏。即使我四处走动,我什么也看不见。我想知道的是,float[] t = m.getVertices(new float[m.getMaxVertices()]);输出究竟是什么。输出如何与模型相对应?如何在一定范围内使Y值随机?

1 个答案:

答案 0 :(得分:1)

网格数据被组织到VertexAttributes中。它们总是包含位置,但也可以包括颜色,纹理坐标,法线等。例如,具有纹理的网格可能具有以下内容:

  • X,Y和Z的大小为3的位置VertexAttribute(可能有一个2D网格,其中position属性只有2个)
  • 一个尺寸为2的TextureCooridantes VertexAttribute,用于U和V
  • 普通VertexAttribute,大小为3,适用于X,Y和Z

因此,使用mesh.getVertices()得到的float数组将是每个顶点的一组8个浮点数,一个接着一个。

如果从模型文件加载Mesh而不是手动构建它,您可能不确定它具有什么VertexAttribute设置,因此您需要检查它以找出所需属性的偏移量: / p>

int positionOffset = mesh.getVertexAttributes().getOffset(Usage.Position);
int yOffset = positionOffset + 1; //skip X
int vertexSize = mesh.getVertexSize() / 4; //divide to convert bytes to floats

现在,如果你想改变Y,你可以像这样循环顶点:

//this is how to get the properly sized mesh:
float[] vertices = new float[mesh.getNumVertices() * mesh.getVertexSize() / 4];
mesh.getVertices(vertices);

for (int i = yOffset; i < vertices.length; i += vertexSize){
    vertices[i] += someValue;
}
mesh.setVertices(vertices);

索引表示构成网格三角形的三个顶点的组。如果网格上的顶点在多个三角形上相同,则它们可能只出现在顶点列表中一次。这通常发生在网格的软阴影顶点上,因为接触该顶点的所有相邻三角形的UV和法线都是相同的。