Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

156 Zeilen
3.6 KiB

  1. import bpy
  2. import random
  3. print("- - "*20)
  4. random.seed(27051996)
  5. def generateIcoSphere():
  6. verts = [
  7. (0,0,1),
  8. (0.89442, 0, 0.44721),
  9. (0.27639, 0.85064, 0.44721),
  10. (-0.7236, 0.52572, 0.44721),
  11. (-0.7236, -0.52572, 0.44721),
  12. (0.27639, -0.85064, 0.44721),
  13. ( 0.7236, 0.52572, -0.44721),
  14. (-0.27639, 0.85064, -0.44721),
  15. (-0.89442, 0, -0.44721),
  16. (-0.27639, -0.85064, -0.44721),
  17. ( 0.7236, -0.52572, -0.44721),
  18. (0,0,-1)
  19. ]
  20. faces = (
  21. (0,1,2),
  22. (0,2,3),
  23. (0,3,4),
  24. (0,4,5),
  25. (0,5,1),
  26. (1,6,2),
  27. (2,7,3),
  28. (3,8,4),
  29. (4,9,5),
  30. (5,10,1),
  31. (10,6,1),
  32. (6,7,2),
  33. (7,8,3),
  34. (8,9,4),
  35. (9,10,5),
  36. (10,11,6),
  37. (6,11,7),
  38. (7,11,8),
  39. (8,11,9),
  40. (9,11,10)
  41. )
  42. return (verts, faces)
  43. def createMeshFromData(name, origin, scale, verts, faces):
  44. # Create mesh and object
  45. me = bpy.data.meshes.new(name+'Mesh')
  46. ob = bpy.data.objects.new(name, me)
  47. ob.location = origin
  48. ob.scale = scale
  49. # Link object to scene and make active
  50. scn = bpy.context.scene
  51. scn.objects.link(ob)
  52. scn.objects.active = ob
  53. # ob.select = False
  54. # Create mesh from given verts, faces.
  55. me.from_pydata(verts, [], faces)
  56. # Update mesh with new data
  57. me.update()
  58. def subdivide(verts, faces, iteration):
  59. newFaces = []
  60. dividedEdges = {}
  61. def vecLen(vec):
  62. return sum([c**2 for c in vec])**.5
  63. def scaleVecToLen(vec, desiredLength):
  64. vecLen_now = vecLen(vec)
  65. return (
  66. vec[0] * desiredLength / vecLen_now,
  67. vec[1] * desiredLength / vecLen_now,
  68. vec[2] * desiredLength / vecLen_now
  69. )
  70. def getCenterPoint(p1, p2):
  71. vecLen_p1 = vecLen(verts[p1])
  72. vecLen_p2 = vecLen(verts[p2])
  73. vecLen_new = (vecLen_p1 + vecLen_p2)*.5
  74. heightDelta = random.gauss(0,.01*(.6**iteration))
  75. return scaleVecToLen ((
  76. (verts[p1][0] + verts[p2][0]) * .5,
  77. (verts[p1][1] + verts[p2][1]) * .5,
  78. (verts[p1][2] + verts[p2][2]) * .5
  79. ), vecLen_new + heightDelta)
  80. def divideEdge(edge):
  81. try:
  82. normalizedEdge = list(edge)
  83. normalizedEdge.sort()
  84. normalizedEdge = tuple(normalizedEdge)
  85. return dividedEdges[tuple(normalizedEdge)]
  86. except Exception as e:
  87. newVert = getCenterPoint(*edge)
  88. newIndex = len(verts)
  89. normalizedEdge = list(edge)
  90. normalizedEdge.sort()
  91. normalizedEdge = tuple(normalizedEdge)
  92. dividedEdges[normalizedEdge] = newIndex
  93. verts.append(newVert)
  94. return newIndex
  95. for face in faces:
  96. edge1 = (face[0], face[1])
  97. edge2 = (face[1], face[2])
  98. edge3 = (face[2], face[0])
  99. newFaces.append((
  100. face[0],
  101. divideEdge(edge1),
  102. divideEdge(edge3)
  103. ))
  104. newFaces.append((
  105. face[1],
  106. divideEdge(edge2),
  107. divideEdge(edge1)
  108. ))
  109. newFaces.append((
  110. face[2],
  111. divideEdge(edge3),
  112. divideEdge(edge2)
  113. ))
  114. newFaces.append((
  115. divideEdge(edge1),
  116. divideEdge(edge2),
  117. divideEdge(edge3)
  118. ))
  119. return verts, newFaces
  120. verts, faces = generateIcoSphere()
  121. for i in range(10):
  122. verts, faces = subdivide(verts, faces, i+1)
  123. createMeshFromData('ProcGenSphere', (0,0,0), (8,8,8), verts, faces)