  public TransformGroup getSphere(int divisions){

    float sign = 1.0f;

    float[] texCoords = new float[(divisions+1) * (2*divisions+1) * 2],
            vertices  = new float[(divisions+1) * (2*divisions+1) * 3],
            normals   = new float[(divisions+1) * (2*divisions+1) * 3];

    for(int i = 0; i <= divisions; i++) {
      float rho = (float) ((double) i * Math.PI / (double) divisions);

      for(int j = 0; j <= 2*divisions; j++) {

        float theta = (float) ((double) j * Math.PI / (double) divisions),
              vx    = (float) (Math.cos(theta) * Math.sin(rho)),
              vy    = (float) (sign * Math.cos(rho)),
              vz    = (float) (Math.sin(theta) * Math.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,
            v01 = i*(2*divisions+1)     + j+1,
            v10 = (i+1)*(2*divisions+1) + j  ,
            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);

