Uh, I don't know if this is what you need, but this makes a sphere with the proper texcoords:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| public static Geometry getSphere(int divisions, int radius) { float sign = 1.0f;
float[] texCoords = new float[(divisions + 1) * (2 * divisions + 1) * 2]; float[] vertices = new float[(divisions + 1) * (2 * divisions + 1) * 3]; float[] normals = new float[(divisions + 1) * (2 * divisions + 1) * 3];
for (int i = 0;i <= divisions;i++) { float rho = (float)((double)i * FastMath.PI / (double)divisions);
for (int j = 0;j <= 2 * divisions;j++) { float theta = (float)((double)j * FastMath.PI / (double)divisions); float vx = (float)(FastMath.cos(theta) * FastMath.sin(rho)); float vy = (float)(sign * FastMath.cos(rho)); float vz = (float)(FastMath.sin(theta) * FastMath.sin(rho));
texCoords[((i * (2 * divisions + 1)) + j) * 2 + 0] = 1f - (float)j / (2f * divisions); texCoords[((i * (2 * divisions + 1)) + j) * 2 + 1] = (float)i / divisions;
vertices[((i * (2 * divisions + 1)) + j) * 3 + 0] = vx * radius; vertices[((i * (2 * divisions + 1)) + j) * 3 + 1] = vy * radius; vertices[((i * (2 * divisions + 1)) + j) * 3 + 2] = vz * radius;
normals[((i * (2 * divisions + 1)) + j) * 3 + 0] = vx * sign; normals[((i * (2 * divisions + 1)) + j) * 3 + 1] = vy * sign; normals[((i * (2 * divisions + 1)) + j) * 3 + 2] = vz * sign; } }
int[] vIdx = new int[divisions * 2 * divisions * 6]; int n = 0;
for (int i = 0;i < divisions;i++) { for (int j = 0;j < 2 * divisions;j++) { int v00 = i * (2 * divisions + 1) + j; int v01 = i * (2 * divisions + 1) + j + 1; int v10 = (i + 1) * (2 * divisions + 1) + j; int v11 = (i + 1) * (2 * divisions + 1) + j + 1;
vIdx[n++] = v11; vIdx[n++] = v10; vIdx[n++] = v00; vIdx[n++] = v11; vIdx[n++] = v00; vIdx[n++] = v01; } }
IndexedTriangleArray shapeGeom = new IndexedTriangleArray(vertices.length / 3, GeometryArray.TEXTURE_COORDINATE_2 | TriangleArray.COORDINATES | TriangleArray.NORMALS, vIdx.length);
shapeGeom.setTextureCoordinates(0, 0, texCoords); shapeGeom.setValidVertexCount(vertices.length / 3); shapeGeom.setValidIndexCount(vIdx.length); shapeGeom.setCoordinates(0, vertices); shapeGeom.setNormals(0, normals); shapeGeom.setIndex(vIdx);
return shapeGeom; } |