import bpy print("- - "*20) def generateIcoSphere(): verts = [ (0,0,1), (0.89442, 0, 0.44721), (0.27639, 0.85064, 0.44721), (-0.7236, 0.52572, 0.44721), (-0.7236, -0.52572, 0.44721), (0.27639, -0.85064, 0.44721), ( 0.7236, 0.52572, -0.44721), (-0.27639, 0.85064, -0.44721), (-0.89442, 0, -0.44721), (-0.27639, -0.85064, -0.44721), ( 0.7236, -0.52572, -0.44721), (0,0,-1), ] faces = ( (0,1,2), (0,2,3), (0,3,4), (0,4,5), (0,5,1), (1,6,2), (2,7,3), (3,8,4), (4,9,5), (5,10,1), (10,6,1), (6,7,2), (7,8,3), (8,9,4), (9,10,5), (10,11,6), (6,11,7), (7,11,8), (8,11,9), (9,11,10) ) return (verts, faces) def createMeshFromData(name, origin, verts, faces): # Create mesh and object me = bpy.data.meshes.new(name+'Mesh') ob = bpy.data.objects.new(name, me) ob.location = origin # Link object to scene and make active scn = bpy.context.scene scn.objects.link(ob) scn.objects.active = ob ob.select = True # Create mesh from given verts, faces. me.from_pydata(verts, [], faces) # Update mesh with new data me.update() def subdivide(verts, faces): newFaces = [] dividedEdges = {} def normalize(point): vecLen = sum([c**2 for c in point])**.5 return tuple(c/vecLen for c in point) def getCenterPoint(p1, p2): return normalize (( (verts[p1][0]+verts[p2][0])*.5, (verts[p1][1]+verts[p2][1])*.5, (verts[p1][2]+verts[p2][2])*.5 )) def divideEdge(edge): try: return dividedEdges[edge] except Exception as e: newVert = getCenterPoint(*edge) newIndex = len(verts) dividedEdges[edge] = newIndex verts.append(newVert) return newIndex for face in faces: edge1 = (face[0], face[1]) edge2 = (face[1], face[2]) edge3 = (face[2], face[0]) divideEdge(edge1) divideEdge(edge2) divideEdge(edge3) newFaces.append(( face[0], dividedEdges[edge1], dividedEdges[edge3] )) newFaces.append(( face[1], dividedEdges[edge2], dividedEdges[edge1] )) newFaces.append(( face[2], dividedEdges[edge3], dividedEdges[edge2] )) newFaces.append(( dividedEdges[edge1], dividedEdges[edge2], dividedEdges[edge3] )) return verts, newFaces verts, faces = generateIcoSphere() verts, faces = subdivide(verts, faces) verts, faces = subdivide(verts, faces) verts, faces = subdivide(verts, faces) verts, faces = subdivide(verts, faces) verts, faces = subdivide(verts, faces) createMeshFromData('Icosphere', (0,0,0), verts, faces)