diff --git a/genSphere.py b/genSphere.py index 2eff6c9..8893a62 100644 --- a/genSphere.py +++ b/genSphere.py @@ -1,4 +1,5 @@ import bpy +import random print("- - "*20) @@ -67,28 +68,51 @@ def createMeshFromData(name, origin, verts, faces): me.update() -def subdivide(verts, faces): +def subdivide(verts, faces, iteration): newFaces = [] dividedEdges = {} - def normalize(point): - vecLen = sum([c**2 for c in point])**.5 - return tuple(c/vecLen for c in point) + def vecLen(vec): + return sum([c**2 for c in vec])**.5 + + def expandVecToLen(vec, desiredLength): + vecLen_now = vecLen(vec) + return ( + vec[0]*desiredLength/vecLen_now, + vec[1]*desiredLength/vecLen_now, + vec[2]*desiredLength/vecLen_now + ) 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 - )) + vecLen_p1 = vecLen(verts[p1]) + vecLen_p2 = vecLen(verts[p2]) + vecLen_new = (vecLen_p1 + vecLen_p2)*.5 + heightDelta = random.gauss(0,.05*(.5**iteration)) + # heightDelta = 0 + # if heightDelta < 0: + # heightDelta = -(heightDelta**iteration) + # else: + # heightDelta = heightDelta**iteration + + return expandVecToLen (( + (verts[p1][0]+ verts[p2][0])*.5, + (verts[p1][1]+ verts[p2][1])*.5, + (verts[p1][2]+ verts[p2][2])*.5 + ), vecLen_new + heightDelta) def divideEdge(edge): try: - return dividedEdges[edge] + normalizedEdge = list(edge) + normalizedEdge.sort() + normalizedEdge = tuple(normalizedEdge) + return dividedEdges[tuple(normalizedEdge)] except Exception as e: newVert = getCenterPoint(*edge) newIndex = len(verts) - dividedEdges[edge] = newIndex + normalizedEdge = list(edge) + normalizedEdge.sort() + normalizedEdge = tuple(normalizedEdge) + dividedEdges[normalizedEdge] = newIndex verts.append(newVert) return newIndex @@ -97,32 +121,28 @@ def subdivide(verts, faces): edge2 = (face[1], face[2]) edge3 = (face[2], face[0]) - divideEdge(edge1) - divideEdge(edge2) - divideEdge(edge3) - newFaces.append(( face[0], - dividedEdges[edge1], - dividedEdges[edge3] + divideEdge(edge1), + divideEdge(edge3) )) newFaces.append(( face[1], - dividedEdges[edge2], - dividedEdges[edge1] + divideEdge(edge2), + divideEdge(edge1) )) newFaces.append(( face[2], - dividedEdges[edge3], - dividedEdges[edge2] + divideEdge(edge3), + divideEdge(edge2) )) newFaces.append(( - dividedEdges[edge1], - dividedEdges[edge2], - dividedEdges[edge3] + divideEdge(edge1), + divideEdge(edge2), + divideEdge(edge3) )) @@ -130,10 +150,8 @@ def subdivide(verts, faces): 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) +for i in range(9): + verts, faces = subdivide(verts, faces, i+1) + -createMeshFromData('Icosphere', (0,0,0), verts, faces) +createMeshFromData('ProcGenSphere', (0,0,0), verts, faces) diff --git a/sphere.blend b/sphere.blend index 1c4c8a3..02e4557 100644 Binary files a/sphere.blend and b/sphere.blend differ