void createSphere1(String strName, float r, int nRings, int nSegments) { IManualObject manual = mSceneMgr.createManualObject(strName); manual.begin("BaseWhiteNoLighting", OperationType.OT_TRIANGLE_LIST); float fDeltaRingAngle = (float) (Math.PI / nRings); float fDeltaSegAngle = (float) (2 * Math.PI / nSegments); short wVerticeIndex = 0; // Generate the group of rings for the sphere for (int ring = 0; ring <= nRings; ring++) { float r0 = (float) (r * Math.sin(ring * fDeltaRingAngle)); float y0 = (float) (r * Math.cos(ring * fDeltaRingAngle)); // Generate the group of segments for the current ring for (int seg = 0; seg <= nSegments; seg++) { float x0 = (float) (r0 * Math.sin(seg * fDeltaSegAngle)); float z0 = (float) (r0 * Math.cos(seg * fDeltaSegAngle)); // Add one vertex to the strip which makes up the sphere manual.position(x0, y0, z0); Vector3 temp = new Vector3(x0, y0, z0); Vector3 vNormal = new Vector3(); temp.normalisedCopy(vNormal); manual.normal(vNormal); manual.textureCoord((float) seg / (float) nSegments, (float) ring / (float) nRings); if (ring != nRings) { // each vertex (except the last) has six indicies pointing // to it manual.index(wVerticeIndex + nSegments + 1); manual.index(wVerticeIndex); manual.index(wVerticeIndex + nSegments); manual.index(wVerticeIndex + nSegments + 1); manual.index(wVerticeIndex + 1); manual.index(wVerticeIndex); wVerticeIndex++; } } ; // end for seg } // end for ring manual.end(); MeshPtr mesh = new MeshPtr(); manual.convertToMesh(mesh, strName, ResourceGroupManager.getDEFAULT_RESOURCE_GROUP_NAME()); mesh.get()._setBounds( new AxisAlignedBox(new Vector3(-r, -r, -r), new Vector3(r, r, r)), false); mesh.get()._setBoundingSphereRadius(r); short src = 0, dest = 0; if (!mesh.get().suggestTangentVectorBuildParams( VertexElementSemantic.VES_TANGENT, new IntegerPointer(src), new IntegerPointer(dest))) { mesh.get().buildTangentVectors(VertexElementSemantic.VES_TANGENT, src, dest, false, false, false); } }