commit fb27345fd1350f1adcb1e00f4b7edcfef1bb68bd Author: FelixBrendel Date: Tue Oct 17 21:11:03 2017 +0200 Iinitial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d1b0ff4 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.blend1 diff --git a/genSphere.py b/genSphere.py new file mode 100644 index 0000000..2eff6c9 --- /dev/null +++ b/genSphere.py @@ -0,0 +1,139 @@ +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) diff --git a/sphere.blend b/sphere.blend new file mode 100644 index 0000000..1c4c8a3 Binary files /dev/null and b/sphere.blend differ