Java LibGDX';s mesh.getVertices输出?

Java LibGDX';s mesh.getVertices输出?,java,3d,libgdx,mesh,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()];

我正在从事一个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);
}

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

网格数据被组织到顶点属性中。这些始终包括位置,但也可以包括颜色、纹理坐标、法线等。例如,具有纹理的网格可能具有以下内容:

  • 对于X、Y和Z,位置顶点属性的大小为3(可能有一个2D网格,其中位置属性只有2)
  • U和V尺寸为2的纹理源顶点属性
  • 大小为3的X、Y和Z的法线顶点属性
因此,使用
mesh.getVertices()
得到的浮点数组将是每个顶点的8个浮点数组,一个接一个

如果从模型文件加载网格而不是手动构建网格,则可能无法确定它具有什么样的VertexAttribute设置,因此需要对其进行检查,以确定所需属性的偏移量:

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);
//这是如何获得适当大小的网格:
float[]顶点=新的float[mesh.getNumVertices()*mesh.getVertexSize()/4];
获取顶点(顶点);
对于(int i=yOffset;i
索引表示组成网格三角形的三个顶点组。如果网格上的顶点在多个三角形上相同,则它们可能只在“顶点”列表中出现一次。这通常发生在网格的软着色顶点上,因为所有接触该顶点的相邻三角形的UV和法线都相同

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