« Programmation objet et géométrie/Objets Python sous Blender/Création d'un objet 3D en Python sous Blender » : différence entre les versions

Un livre de Wikilivres.
Contenu supprimé Contenu ajouté
Ligne 47 : Ligne 47 :
=Naissance du tétraèdre=
=Naissance du tétraèdre=


On a maintenant tout ce qu'il faut pour créer le tétraèdre, qui est une instance de la classe [[w:polyèdre|polyèdre]]. Créer un objet qui est une instance d'une classe, cela s'appelle une [[w:instanciation|instanciation]]. La méthode de la classe ''Mesh'' (polyèdre) qui permet d'instancier un objet héritant de cette classe s'appelle, classiquement, ''new()''. Elle accepte en paramètre le nom que portera l'objet (ici ''tetra''):
À ce stade, le tétraèdre ''tm'' est créé, et il ne reste plus qu'à le placer dans l'espace (figure Blender) ce qui se fait par la méthode ''PutRaw'' de la classe ''NMesh''. En donnant à celle-ci le paramètre 1, on va forcer Blender à recalculer les vecteurs normaux, ce qui corrige les éventuelles erreurs faites au moment de la déclaration des faces ci-dessus. Enfin on demande à Blender de mettre à jour son affichage par ''Redraw()'':


<source lang="python">
<source lang="python">
NMesh.PutRaw(tm,"tetra",1)
me = bpy.data.meshes.new('tetra')
Blender.Redraw()</source>
</source>


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:
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:

Version du 29 juillet 2010 à 19:28

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

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

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

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

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. La méthode de la classe Mesh (polyèdre) qui permet d'instancier un objet héritant de cette classe s'appelle, classiquement, new(). Elle accepte en paramètre le nom que portera l'objet (ici tetra):

me = bpy.data.meshes.new('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

Faire un tétraèdre régulier dont la base est horizontale

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

Faire une stella octangula

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

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