Programmation objet et géométrie/Objets Python sous Blender/Création de fractales avec bpy

Un livre de Wikilivres.

Pour créer des surfaces fractales, avec bpy sous Blender comme ailleurs, il est nécessaire de faire appel à la récursivité. À part ça, l'objet créé (un tétraèdre de Sierpinski) sera un polyèdre et la technique de création sera la même que précédemment.

Fonctions Python[modifier | modifier le wikicode]

Comme précédemment, pour pouvoir utiliser les méthodes de bpy, on doit les importer:

from Blender import *
import bpy
sommets=[]
faces=[]

Les tableaux sommets et faces sont des variables globales; Python va les modifier au fur et à mesure des appels récursifs à la fonction sierpin ci-dessous.

Milieu[modifier | modifier le wikicode]

Pour simplifier le code ci-dessous, on crée une fonction milieu qui, à deux tableaux de trois coordonnées (deux points dans l'espace) associe un troisième tableau du même genre:

def milieu(m,n):
		x=(m[0]+n[0])/2.
		y=(m[1]+n[1])/2.
		z=(m[2]+n[2])/2.
		return [x,y,z]

Récursivité[modifier | modifier le wikicode]

La fonction sierpin met dans le tableau sommets la liste des sommets du polyèdre, et dans faces la liste de ses faces, au fur et à mesure. Son code est relativement court grâce à la récursivité et à une variable auxiliaire n appelée ordre du tétraèdre:

  • Si n=0, on se contente de créer un tétraèdre, à partir des 4 sommets donnés à sierpin;
  • Sinon, on construit sur chaque sommet, un tétraèdre de Sierpinski deux fois plus petit, dont les autres sommets sont les milieux des arêtes qui passent par lui:
def sierpin(a,b,c,d,n):
		if (n>0):
				sierpin(a,milieu(a,b),milieu(a,c),milieu(a,d),n-1)
				sierpin(milieu(a,b),b,milieu(b,c),milieu(b,d),n-1)
				sierpin(milieu(a,c),milieu(b,c),c,milieu(c,d),n-1)
				sierpin(milieu(a,d),milieu(b,d),milieu(c,d),d,n-1)
		else:
				sommets.append(a)
				sommets.append(b)
				sommets.append(c)
				sommets.append(d)
				ns=len(sommets)
				faces.append([ns-4,ns-3,ns-2])
				faces.append([ns-4,ns-2,ns-1])
				faces.append([ns-4,ns-1,ns-3])
				faces.append([ns-3,ns-2,ns-1])

La variable ns contient le nombre actuel de sommets, en effet elle est calculée comme longueur du tableau contenant la liste des sommets, qui est donc bien égale au nombre de sommets. Mais comme ceux-ci sont numérotés à partir de 0, les 4 derniers sommets sont les numéros ns-4 à ns-1 (il n'y a pas de numéro ns).

Un appel à sierpin(a,b,c,d,0) donne les sommets et faces d'un tétraèdre (de sommets a, b, c et d),

un appel à sierpin(a,b,c,d,1) donne les sommets et faces de 4 tétraèdres,

etc.

Création de l'objet[modifier | modifier le wikicode]

Appel de la fonction récursive[modifier | modifier le wikicode]

Grâce à ce qui précède, il suffit pour avoir les sommets et faces de l'approximation polyédrale de l'objet fractal, d'une seule ligne:

sierpin([-1,-1,-1],[1,1,-1],[-1,1,1],[1,-1,1],6)

Cet appel remplit les tableaux sommets et faces qu'il suffit de fournir à un objet polyèdre pour créer celui-ci:

création du tétraèdre de Sierpinski[modifier | modifier le wikicode]

Comme à chaque fois, il reste à

  • instancier un objet héritant de la classe meshes (nommé sierp);
  • Lui fournir ses sommets;
  • lui fournir ses faces;
  • activer la scène Blender;
  • y placer l'objet en question (un si comme Sierpinski):


si=bpy.data.meshes.new('sierp')
si.verts.extend(sommets)
si.faces.extend(faces)
scn = bpy.data.scenes.active    
ob = scn.objects.new(si, 'sierpinski')

Ensuite, après avoir texturé l'objet 3D, il suffit d'un appui sur le bouton F12 du clavier pour effectuer un rendu: