我正在研究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值随机?
答案 0 :(得分:1)
网格数据被组织到VertexAttributes中。它们总是包含位置,但也可以包括颜色,纹理坐标,法线等。例如,具有纹理的网格可能具有以下内容:
因此,使用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和法线都是相同的。