Parcourir la source

it fucking works

master
FelixBrendel il y a 8 ans
Parent
révision
a5dbbc58f3
2 fichiers modifiés avec 48 ajouts et 30 suppressions
  1. +48
    -30
      genSphere.py
  2. BIN
     

+ 48
- 30
genSphere.py Voir le fichier

@@ -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)


Chargement…
Annuler
Enregistrer