it fucking works
This commit is contained in:
+45
-27
@@ -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 ((
|
||||
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)
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user