| @@ -1,4 +1,5 @@ | |||||
| import bpy | import bpy | ||||
| import random | |||||
| print("- - "*20) | print("- - "*20) | ||||
| @@ -67,28 +68,51 @@ def createMeshFromData(name, origin, verts, faces): | |||||
| me.update() | me.update() | ||||
| def subdivide(verts, faces): | |||||
| def subdivide(verts, faces, iteration): | |||||
| newFaces = [] | newFaces = [] | ||||
| dividedEdges = {} | 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): | 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): | def divideEdge(edge): | ||||
| try: | try: | ||||
| return dividedEdges[edge] | |||||
| normalizedEdge = list(edge) | |||||
| normalizedEdge.sort() | |||||
| normalizedEdge = tuple(normalizedEdge) | |||||
| return dividedEdges[tuple(normalizedEdge)] | |||||
| except Exception as e: | except Exception as e: | ||||
| newVert = getCenterPoint(*edge) | newVert = getCenterPoint(*edge) | ||||
| newIndex = len(verts) | newIndex = len(verts) | ||||
| dividedEdges[edge] = newIndex | |||||
| normalizedEdge = list(edge) | |||||
| normalizedEdge.sort() | |||||
| normalizedEdge = tuple(normalizedEdge) | |||||
| dividedEdges[normalizedEdge] = newIndex | |||||
| verts.append(newVert) | verts.append(newVert) | ||||
| return newIndex | return newIndex | ||||
| @@ -97,32 +121,28 @@ def subdivide(verts, faces): | |||||
| edge2 = (face[1], face[2]) | edge2 = (face[1], face[2]) | ||||
| edge3 = (face[2], face[0]) | edge3 = (face[2], face[0]) | ||||
| divideEdge(edge1) | |||||
| divideEdge(edge2) | |||||
| divideEdge(edge3) | |||||
| newFaces.append(( | newFaces.append(( | ||||
| face[0], | face[0], | ||||
| dividedEdges[edge1], | |||||
| dividedEdges[edge3] | |||||
| divideEdge(edge1), | |||||
| divideEdge(edge3) | |||||
| )) | )) | ||||
| newFaces.append(( | newFaces.append(( | ||||
| face[1], | face[1], | ||||
| dividedEdges[edge2], | |||||
| dividedEdges[edge1] | |||||
| divideEdge(edge2), | |||||
| divideEdge(edge1) | |||||
| )) | )) | ||||
| newFaces.append(( | newFaces.append(( | ||||
| face[2], | face[2], | ||||
| dividedEdges[edge3], | |||||
| dividedEdges[edge2] | |||||
| divideEdge(edge3), | |||||
| divideEdge(edge2) | |||||
| )) | )) | ||||
| newFaces.append(( | 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 = 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) | |||||