Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

140 righe
3.0 KiB

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