Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ####################################################################
- # Felce frattale (Barnsley fern)
- # Tratto da Wikipedia
- #
- # Adattato per Blender da Roberto Viaggi
- #
- # Dai ALEK!!!
- # Attendiamo il prossimo corso!!
- #
- # Edit History
- # 07/7/2021
- #####################################################################
- import bpy
- import random
- import time
- #C=bpy.context
- #D=bpy.data
- #O=bpy.ops
- #########################################################
- # Funzioni utili
- #########################################################
- ### cancello tutto (epurazione) ###
- def purge():
- for o in bpy.data.objects:
- bpy.data.objects.remove(o,do_unlink=True)
- for m in bpy.data.meshes:
- bpy.data.meshes.remove(m,do_unlink=True)
- for c in bpy.data.collections:
- bpy.data.collections.remove(c,do_unlink=True)
- ### cancello un oggetto specifico tramite nome ###
- def delete_objName(name):
- for ob in bpy.data.objects:
- if ob.name==name:
- bpy.data.objects.remove(ob,do_unlink=True)
- ### seleziono un oggetto specifico tramite nome ###
- def select_obName(name):
- for ob in bpy.data.objects:
- if ob.name==name:
- bpy.data.objects[ob.name].select_set(True)
- #########################################################
- # Fine Funzioni utili
- #########################################################
- #########################################################
- # INIZIO PROGRAMMA
- #########################################################
- """
- # asssegno al contesto corrente la vista 3D
- bpy.context.area.ui_type = 'VIEW_3D'
- # setto la vista TOP nel contesto corrente. Per tornare nel TEXT EDITOR shift F11
- bpy.ops.view3d.view_axis(type='TOP', align_active=False, relative=False)
- """
- # cancello tutto
- purge()
- #delete_objName("Fern") # in alternativa a purge()
- # array per from_pydata
- verts = []
- faces = []
- edges = []
- # numero iterazioni! Cambia qui per veder cosa succede.
- iter=int(2.5*(10**6))
- # azzeramenti iniziali (z sarΓ sempre 0)
- x = 0
- y = 0
- z = 0
- print()
- print (" <<<< Inizio calcolo per " + str(iter)+ " punti >>>>")
- # tempo di inizio
- tic = time.perf_counter()
- # ora calcolo i punti
- for i in range(0, iter):
- # genero numeri floating tra 0 ed 1 escluso
- r = random.random()
- # moltiplico x 100 per ottenere i valori per IF
- r= r * 100
- # salvo i valori correnti di x, y
- xprec = x
- yprec = y
- if r < 1:
- x = 0
- y = 0.16 * yprec
- elif r < 86:
- x = 0.85 * xprec + 0.04 * yprec
- y = -0.04 * xprec + 0.85 * yprec + 1.6
- elif r < 93:
- x = 0.20 * xprec - 0.26 * yprec
- y = 0.23 * xprec + 0.22 * yprec + 1.6
- else:
- x = -0.15 * xprec + 0.28 * yprec
- y = 0.26 * xprec + 0.24 * yprec + 0.44
- # aggiorno i vertici
- vert = (x,y,z)
- verts.append(vert)
- # fisso il tempo di esecuzione
- toc = time.perf_counter()
- print(f"Tempo esecuzione calcolo punti {toc - tic:0.4f} secondi")
- print ()
- #creo mesh ed oggetto vuoti
- mymesh = bpy.data.meshes.new("Fern")
- myobject = bpy.data.objects.new("Fern",mymesh)
- tic = time.perf_counter()
- print()
- print ("Inizio costruzione mesh con from_pydata")
- # creo mesh con i vertici senza spigoli e facce
- mymesh.from_pydata(verts,edges,faces)
- mymesh.update(calc_edges=True)
- toc = time.perf_counter()
- print(f"Tempo esecuzione from_pydata {toc - tic:0.4f} secondi")
- print ()
- #posiziono la mesh
- myobject.location = bpy.context.scene.cursor.location=[0,0,0]
- bpy.context.collection.objects.link(myobject)
- #setto edit mode
- bpy.context.view_layer.objects.active = myobject
- bpy.ops.object.mode_set(mode='EDIT')
- tic = time.perf_counter()
- print()
- print ("Inizio rimozione punti duplicati")
- # cancello i vertici duplicati (remove duplicate vertices)
- bpy.ops.mesh.remove_doubles()
- toc = time.perf_counter()
- print(f"Tempo esecuzione rimozione punti duplicati {toc - tic:0.4f} secondi")
- print ()
- # guarda nella console per vedere quanti ne ha cancellati
- #setto object mode
- bpy.ops.object.mode_set(mode='OBJECT')
- # seleziono il risultato
- select_obName("Fern")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement