« 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 78 : Ligne 78 :
=Naissance du tétraèdre=
=Naissance du tétraèdre=


À 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">
NMesh.PutRaw(tm,"tetra",1)
Blender.Redraw()</source>


[[Catégorie:Blender3D (livre)]]
[[Catégorie:Blender3D (livre)]]

Version du 28 juillet 2010 à 18:21

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 l'objet NMesh dont le tétraèdre sera une instance:

import Blender
from Blender import NMesh
tm=NMesh.GetRaw()

L'initialisation de l'objet tm (pour tétraèdre mesh) se fait avec la méthode GetRaw de la classe NMesh. Elle a pour effet de créer un objet tm qui sera une instance de la classe NMesh.

Mais pour l'instant cet objet est vide, et au rendu, ne se verra pas (il est analogue à l'objet empty mesh de Blender). Cependant comme il est une instance de NMesh il hérite de ses propriétés et méthodes.

Entrée des sommets

La première des méthodes de tm qu'on va utiliser, c'est celle qui permet d'y ajouter des sommets. En fait on peut considérer tm comme une base de données qu'on va progressivement mettre à jour. Et un sommet est pour Blender sous Python, un propotype de la classe NMesh, défini à partir de trois nombres réels qui sont ses coordonnées dans l'espace. On le crée par v=NMesh.Vert(x,y,z) (Vert comme vertex). Puis, une fois que le sommet v a été défini, on l'ajoute à la base de données tm.verts (constituée par les sommets de tm) par la méthode append de tm:

v=NMesh.Vert(-1.0,-1.0,-1.0)
tm.verts.append(v)
v=NMesh.Vert(1.0,1.0,-1.0)
tm.verts.append(v)
v=NMesh.Vert(1.0,-1.0,1.0)
tm.verts.append(v)
v=NMesh.Vert(-1.0,1.0,1.0)
tm.verts.append(v)

Ci-dessus on a créé 4 fois un sommet, puis on l'a à chaque fois ajouté à la collection de sommets existante, ce qui fait qu'à ce stade le tétraèdre tm possède 4 sommets comme il se doit. Mais il n'a encore ni face ni arête, et ne serait pas correctement rendu par Blender.

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, en

  1. invoquant 4 fois de suite la méthode Face de la classe puis,
  2. à chaque fois, en y ajoutant au fur et à mesure, dans l'ordre, les sommets qui la définissent;
  3. et quand la face est créée, en la rajoutant à la base de données des faces de tm (qui s'appelle tm.faces) avec sa méthode append.

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 brillance 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. Ceux-ci sont, comme on l'a vu ci-dessus, des éléments de tm.verts qui est non seulement une méthode de tm mais aussi un tableau. Les premier des sommets du tétraèdre s'appelle donc par tm.verts[0]. Enfin on crée une face avec la méthode Face() de la classe NMesh:

f=NMesh.Face()
f.v.append(tm.verts[0])
f.v.append(tm.verts[1])
f.v.append(tm.verts[2])
tm.faces.append(f)
f=NMesh.Face()
f.v.append(tm.verts[0])
f.v.append(tm.verts[2])
f.v.append(tm.verts[3])
tm.faces.append(f)
f=NMesh.Face()
f.v.append(tm.verts[0])
f.v.append(tm.verts[3])
f.v.append(tm.verts[1])
tm.faces.append(f)
f=NMesh.Face()
f.v.append(tm.verts[1])
f.v.append(tm.verts[2])
f.v.append(tm.verts[3])
tm.faces.append(f)

Naissance du tétraèdre

À 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():

NMesh.PutRaw(tm,"tetra",1)
Blender.Redraw()