Éponge de Menger
Fractale 3D dite Éponge de Menger.
Principe grossier: à chaque itération on coupe chaque cube en trois en long, en large et en travers, puis on retire les cubes centraux.
Génération des modèles : Maya, Mel-Python.
Images : 3ds max, VRay.
Itération | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
Éléments | 1 | 20 | 400 | 8.000 | 160.000 | 3.200.000 |
Polygones | 6 | 120 | 2.400 | 48.000 | 960.000 | 19.200.000 |
Fichier .obj | 1.5 Ko | 30.5 Ko | 640 Ko | 13 Mo | 62 Mo | ~500 Mo |
Génération 1) | < 1 sec | < 1 sec | 1 sec | 5 sec | 640 sec | ? |
Rendu 2) | 20 sec | 25 sec | 40 sec | 75 sec | 286 sec | ? |
- mengerSponge.py
## # Menger Sponge # p01 2010 # Maya python script ## from maya.cmds import * from math import * def mengerSponge(x, y, z, sz, it, lvl=0): if lvl==it: polyCube(w=sz, h=sz, d=sz) move(x, y, z) else: s = sz / 3.0; for i in range(-1, 2): for j in range(-1, 2): for k in range(-1 ,2): sum = abs(i) + abs(j) + abs(k) if(sum and sum!=1): mengerSponge(x+i*s,y+j*s,z+k*s,s,it,lvl+1) def run(it=0, sz=50.0): if objExists('pCube1'): select(all=True) delete() mengerSponge(0, 0, 0, sz, it) select(cl=True) viewFit() def win(): window(t='Menger Sponge') columnLayout(rs=20) intSliderGrp(l='Iteration', field=1, min=0, max=3, v=0, cc=lambda x:run(int(x))) run() win()
Autre syntaxe possible, utilisant les compréhensions de listes :
def mengerSponge(x, y, z, sz, it, lvl=0): if lvl==it: polyCube(w=sz, h=sz, d=sz) move(x, y, z) else: s = sz / 3.0; rng = (-1, 0, 1) for x,y,z in list((x+i*s,y+j*s,z+k*s) for i in rng for j in rng for k in rng if(abs(i)+abs(j)+abs(k) != 0 and abs(i)+abs(j)+abs(k) != 1) ) : mengerSponge(x,y,z,s,it,lvl+1)
→ La pyramide de Sierpinski a été rendue selon la même méthode : Pyramide de Sierpinsky