我正在进行一个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值在一个范围内随机?
网格数据被组织到顶点属性中。这些总是包括位置,但也可以包括颜色、纹理坐标、法线等。例如,具有纹理的网格可能具有以下内容:
- X、Y和Z的大小为3的"位置顶点属性"(Position VertexAttribute)(可能存在位置属性只有2的2D网格)
- U和V大小为2的TextureCooridantes VertexAttribute
- X、Y和Z大小为3的法线顶点属性
因此,使用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);
索引表示组成网格三角形的三个顶点的组。如果网格上的顶点在多个三角形上相同,则它们可能只出现在顶点列表中一次。这种情况通常发生在网格的软着色顶点上,因为接触该顶点的所有相邻三角形的UV和法线都是相同的。