~~META:date created=2010-04-18~~
{{tag>3d programmation python maya 3dsmax vray maths}}
======Éponge de Menger======
Fractale 3D dite [[wp>É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.
{{gallery>..:galerie?500x500&mengersponge_*&showtitle}}
^ 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 ((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.))| < 1 sec | < 1 sec | 1 sec | 5 sec | 640 sec | ? |
^ Rendu ((Ces temps correspondent au rendu des images avec VRay sous 3ds max. Temps enregistrés sur un i7 860 à 2.8 GHz.))| 20 sec | 25 sec | 40 sec | 75 sec | 286 sec | ? |
##
# 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_sierpinski]]