python:pygram:cube

Table of Contents

Cube

import bpy
Pygram = bpy.data.texts["pygram.py"].as_module()

et

Pygram.cleanup()
  • Nous allons créer une fonction cube(w) pour générer des cubes de toutes dimensions.
  • Mais au lieu d'utiliser la fonction face() des Objets Pygram,
  • nous allons commencer par créer une fonction d'extrusion (comme celle de Blender).

Ligne

  • Découvrir les objets Point et les objets Ligne.
  • Dans les premières lignes de notre fichier,
  • Commençons par créer deux points (a et b), une ligne (l) et un vecteur (v) et 4 variables a,b,l,v :
  • Créer un point a aux coordonnées (0,0,0)
  • Créer un point b aux coordonnées (10,0,0)
  • Créer une ligne l avec a et b
  • Créer un Vecteur v : (0,10,0) de 10 unités en Y
  • Maintenant, vérifions que nous pouvons « extruder » un point à l'aide d'un vecteur :
  • Créer un point m à partir du point a de la ligne l en le déplaçant à l'aide du vecteur v :
m = l.a.move(v)
  • Noter que la fonction move() créer une copie du point déplacé.
  • Afficher les coordonnées du point m grace à la fonction print() de l'objet Point() :
print(m)

et vérifier ses coordonnées dans la console.

  • Nous voyons bien que nous pouvions créer l'équivalent du point b en déplaçant le point a avec le vecteur v

Extrusion

  • Maintenant, nous allons écrire une fonction qui extrude une ligne et produit une face, comme le fait Blender.
  • Écrire une fonction extrude(l,v) prenant 2 arguments : une ligne l et un vecteur v
  • Dans la fonction extrude() créons des variables pour stocker les points a et b de la ligne l
a = l.a
b = l.b
  • Puis créer 2 nouveaux points c et d en déplaçant les points a et b de la ligne.
  • Le point a est déplacé en un point d
  • Le point b est déplacé en un point c
  • Créer un objet Pygram et utiliser les points a et b de la ligne l et les points c et d pour créer une face à l'aide de la fonction face()
  • :!: Attention, il faut bien respecter les relations des points (a⇒d,b⇒c) et l'ordre des points dans la fonction face(a,b,c,d).
  • Pour terminer, ajouter dans la fonction extrude() l'appel de construction obj.build()
  • Et « renvoyer » l'objet créé (return obj)
  • Ajouter une nouvelle variable f = extrude(l,v) pour tester la fonction

  • Maintenant, changer et tester les valeurs de v : (0,0,10)

  • Et avec v : (0,10,10)

Cube

  • Créons maintenant la fonction cube(f,v) prenant 2 arguments : f une face et v un vecteur
  • Il s'agit donc d'« extruder » un cube à partir d'une face comme le fait Blender.
  • Nous avons déjà la variable f que nous avons créée avec la fonction extrude()
  • Ajoutons une nouvelle variable pour l'extrusion du cube :
j = Pygram.Vector(0,0,10)
  • Ensuite commençons à écrire notre fonction cube()
  • La première chose que nous allons faire, c'est de « récupérer » la face que nous avons créée dans l'Objet Pygram. Car la variable obj que nous avons retournée de notre fonction extrude(), c'est un Objet. Ce n'est pas une Face ni un Point ni un Vecteur
  • Les Faces sont stockées dans les Objets Pygram dans une Liste.
  • Les éléments des listes sont numérotés à partir de zéro
  • Pour accéder aux Faces de notre Objet, nous avons une fonction get_face(n)
  • Donc ici, nous allons ajouter au début de notre fonction cube() cette ligne :
def cube(f,v):
  face = f.get_face(0)
  • Vérifions dans la console que les données correspondent à ce que nous avons en tête :
def cube(f,v):
  face = f.get_face(0)
  print(face)
  • Puis nous ajoutons un nouvel objet avec lequel nous allons « extruder » notre face
 obj = Pygram.Object()
  • À présent, nous allons créer les faces du cube en déplaçant avec move() les 4 points de la face.
  • Nous pouvons commencer par déplacer, à la verticale, le point a1 ainsi :
  a1 = face.a.move(j)
  • Rappelons-nous que v sera égale à j quand nous aurons fini d'écrire la fonction et que nous l'appellerons avec les variables précédemment créées (l'Objet f et le Vecteur j)
  • Continuons par créer les 3 autres points à la verticale de b,c et d que nous nommons b1,c1 et d1.
  • Ensuite ajoutons une première face avec la fonction face() de notre Objet obj et pour commencer, avec les point c,d,d1 et c1
  • Ajoutons ensuite la fonction obj.build()
  • Puis sur une nouvelle ligne, testons notre fonction
cube(f,j)

  • Notez bien la manière de fabriquer les faces : dans le sens inverse des aiguilles d'une montre :

  • Si, par exemple vous inversez :
    • obj.face(c,d,c1,d1)
    • au lieu de
    • obj.face(c,d,d1,c1)
  • Voici le résultat :

  • Pour terminer, ajoutez, une par une, les autres faces et testez votre fonction à chaque étape

  • Ajoutons uniquement 5 faces au cube car nous n'aurons pas besoin de la face au sol
  • Pour terminer ajoutons, avant la fonction build() le nom de l'objet :
obj.name = "cube"

😅