Programmation objet et géométrie/Objets Python sous Blender/Création d'un objet 3D en Python sous Blender

Un livre de Wikilivres.

Un objet 3D est un objet ! En l'occurrence, un objet Mesh, que l'on peut créer et modifier sous Python. Puisque le plus petit objet 3D est le tétraèdre, on va en créer un pour illustrer par un exemple comment ça fonctionne. L'exemple sera un tétraèdre régulier inscrit dans un cube, pour avoir plus facilement les coordonnées de ses sommets.

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

Une fois que l'on a transformé l'une des vues 3D en vue Texte (script Python), et entré le fameux import Blender qui permet de commencer, on va également importer la classe Mesh dont le tétraèdre sera une instance. Cette classe fait partie du paquet bpy (blender python) qu'on va donc importer, en plus de Blender lui-même:

from Blender import *
import bpy

Un tétraèdre est un polyèdre, et hérite donc de ses propriétés. On peut donc dire qu'un tétraèdre est une instance d'un polyèdre, ou qu'un polyèdre est une classe dont le tétraèdre hérite certaines propriétés.

Entrée des sommets[modifier | modifier le wikicode]

Les 4 sommets du tétraèdre seront stockés dans un tableau appelé sommets. Contrairement à CaRMetal, ce ne sont pas les noms des sommets qui seront stockés, mais directement leurs coordonnées:

sommets=[ [-1,-1,-1], [1,1,-1], [1,-1,1], [-1,1,1] ]

Pour définir le tétraèdre, il reste à lui fournir la liste de ses faces (les arêtes en découleront automatiquement).

Entrée des faces[modifier | modifier le wikicode]

En fait il n'est pas nécessaire de créer les 6 arêtes du tétraèdre parce que celles-ci sont les bords des faces de celui-ci, et on n'a besoin que de créer les 4 faces, comme ci-dessus.

Chaque face sera décrite comme une liste portant, dans l'ordre, les numéros des sommets qui la définissent, en commençant à compter à partir de 0.

Pour connaître l'ordre dans lequel on va citer les sommets qui définissent chaque face, on peut regarder les vecteurs normaux de toutes les faces du tétraèdre:

Comme ces vecteurs normaux seront utilisés par le moteur de rendu pour simuler la réflexion ou la réfraction, il est préférable de numéroter les sommets de chaque face, de façon que ces vecteurs soient cohérents entre eux, ce qui, en utilisant les numéros des sommets ci-dessus, donne (avec un parcours dans le sens trigonométrique)

C'est dans l'ordre 0, 1, 2 qu'on va donc entrer les sommets de la première face:

faces= [ [0,1,2], [0,2,3], [0,3,1], [1,2,3] ]

Naissance du tétraèdre[modifier | modifier le wikicode]

On a maintenant tout ce qu'il faut pour créer le tétraèdre, qui est une instance de la classe polyèdre. Créer un objet qui est une instance d'une classe, cela s'appelle une instanciation. Elle se fait en deux temps: Allocation et initialisation.

Allocation du tétraèdre[modifier | modifier le wikicode]

La méthode de la classe meshes (polyèdres) qui permet d'allouer un objet héritant de cette classe s'appelle, classiquement, new() (constructeur). Elle accepte en paramètre le nom que portera l'objet (ici tetra):

tm = bpy.data.meshes.new('tetra')

(la variable dans laquelle l'objet tétraèdre est stockée s'appelle tm pour tetrahedron mesh)

Initialisation du tétraèdre[modifier | modifier le wikicode]

À ce stade, le tétraèdre est un polyèdre, mais vide puisqu'il ne contient aucun sommet, aucune arête et aucune face. En fait la seule propriété qu'il possède est son nom tetra. Il reste donc à lui fournir les deux listes créées auparavant, sommets et faces. Cela se fait avec la méthode extend() commune aux propriétés verts (abréviation de vertices) et faces du tétraèdre:

tm.verts.extend(sommets)   
tm.faces.extend(faces)

Maintenant que Blender possède un objet tétraèdre régulier (qu'il n'avait pas auparavant), il ne reste plus qu'à en placer un dans la scène 3D:

Placement du tétraèdre dans la scène[modifier | modifier le wikicode]

Il faut s'assurer que la scène est active pour qu'on puisse y placer un objet, puis le placer en le rajoutant à la base de données des objets Blender:

scn = bpy.data.scenes.active  
ob = scn.objects.new(tm, 'tetra')

Une fois qu'on a exécuté le script avec le raccourci clavier Alt+P, un objet supplémentaire est apparu dans la scène 3D, et il s'appelle "tetra". En le texturant puis en effectuant un rendu (appui sur F12), on a l'image suivante:

Exercices[modifier | modifier le wikicode]

Faire un tétraèdre régulier dont la base est horizontale[modifier | modifier le wikicode]

Seules les coordonnées des sommets sont différentes de l'exemple ci-dessus.

Faire une stella octangula[modifier | modifier le wikicode]

Deux manières:

  1. Créer deux tétraèdres, dont la réunion sera la stella octangula;
  2. Créer un polyèdre concave, il faudra tout de même 14 sommets et 24 faces!

Faire un octaèdre régulier[modifier | modifier le wikicode]

Pour créer sous Python des objets 3D plus complexes, il est nécessaire d'utiliser des boucles.