É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

1)
Ces temps correspondent à la génération du modèle sous Maya, pas au rendu des images. Temps enregistrés sur un i7 860 à 2.8 GHz.
2)
Ces temps correspondent au rendu des images avec VRay sous 3ds max. Temps enregistrés sur un i7 860 à 2.8 GHz.