it fucking works
This commit is contained in:
+45
-27
@@ -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):
|
def vecLen(vec):
|
||||||
vecLen = sum([c**2 for c in point])**.5
|
return sum([c**2 for c in vec])**.5
|
||||||
return tuple(c/vecLen for c in point)
|
|
||||||
|
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 ((
|
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][0]+ verts[p2][0])*.5,
|
||||||
(verts[p1][1]+ verts[p2][1])*.5,
|
(verts[p1][1]+ verts[p2][1])*.5,
|
||||||
(verts[p1][2]+ verts[p2][2])*.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],
|
divideEdge(edge1),
|
||||||
dividedEdges[edge3]
|
divideEdge(edge3)
|
||||||
))
|
))
|
||||||
|
|
||||||
newFaces.append((
|
newFaces.append((
|
||||||
face[1],
|
face[1],
|
||||||
dividedEdges[edge2],
|
divideEdge(edge2),
|
||||||
dividedEdges[edge1]
|
divideEdge(edge1)
|
||||||
))
|
))
|
||||||
|
|
||||||
newFaces.append((
|
newFaces.append((
|
||||||
face[2],
|
face[2],
|
||||||
dividedEdges[edge3],
|
divideEdge(edge3),
|
||||||
dividedEdges[edge2]
|
divideEdge(edge2)
|
||||||
))
|
))
|
||||||
|
|
||||||
newFaces.append((
|
newFaces.append((
|
||||||
dividedEdges[edge1],
|
divideEdge(edge1),
|
||||||
dividedEdges[edge2],
|
divideEdge(edge2),
|
||||||
dividedEdges[edge3]
|
divideEdge(edge3)
|
||||||
))
|
))
|
||||||
|
|
||||||
|
|
||||||
@@ -130,10 +150,8 @@ def subdivide(verts, faces):
|
|||||||
|
|
||||||
|
|
||||||
verts, faces = generateIcoSphere()
|
verts, faces = generateIcoSphere()
|
||||||
verts, faces = subdivide(verts, faces)
|
for i in range(9):
|
||||||
verts, faces = subdivide(verts, faces)
|
verts, faces = subdivide(verts, faces, i+1)
|
||||||
verts, faces = subdivide(verts, faces)
|
|
||||||
verts, faces = subdivide(verts, faces)
|
|
||||||
verts, faces = subdivide(verts, faces)
|
|
||||||
|
|
||||||
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