Blender (jusqu'à 2.49)
Python 
Script: créer un réseau carré de polygone.
3ieme partie: automatiser la création des points.
 
English Version
  Index principal  Index Python
précédentPython: itérations (2/5) 
Python: automatisation...des facettes(4/5) Suivant

 (Attention à partir d'ici ce texte pourrait devenir rébarbatif, et peut-être même: fastidieux)

Nous avons donc deux problèmes à résoudre:

  1. il nous faut deux boucles for/next  imbriquées l'une dans l'autre.
  2. il faut répartir la liste de point qui n'a qu'une seule dimension dans un tableau à deux dimensions de manière à situer et récupérer les sommets de facettes juxtaposées . Ces facettes doivent former une surface continue.
Pour le premier problème Python nous propose une solution qui consiste à créer provisoirement et dans les limites du sous-programme une nouvelle liste  dans laquelle sont rangées toutes les valeurs nécessaires, pour cela il utilise la procedure:

      range(valeur_de_depart,valeur_limite,valeur_d_incrémention)

Si la valeur de départ est 0, le nombre d'éléments: 100 et la progression de 1, range(0,100,1) va construire une liste dont  la valeur qui se trouve à l'indice [0] sera 0, à l'indice [1] sera 1 et ainsi de suite. Si  la progression avait été de deux, il aurait fallu indiquer: range(0,100,2), la valeur rangée en [0] aurait été :  0,
                            en 1 : 2,
                            en 2 : 4,
                            en 3 : 6, etc. (note)
 
# exemple de boucle python
for i in range(0,100,1):
    # Ici commence le premier sous-programme
    # quatre espaces d'indentation
    ....

Pour le second problème il faut raisonner un peu. Imaginons un instant un réseau carré de polygone constitué de 4 facettes ayant  4 sommets. Nous  aurions donc 9 points à répartir. Ces points sont rangés, dans un liste, de la manière suivante [0,1,2,3,4,5,6,7,8]. Avec un rapide croquis on voit clairement qu'il y a trois lignes de trois points. Les numéros de ligne pourraient être rangés dans une variable i et les numéros des points dans une variables j.
 

0 1 2
3 4 5
6 7 8

La question que l'on peut se poser est la suivante : quelle valeur doit-on attribuer à la variable i et à la variable j s'il faut  les utiliser toutes les deux pour atteindre le premier point qui se trouve à l'indice 0.  On peut poser:   i relation j = 0, a priori  0 relation 0 = 0, et ça parait très utilisable puisque pour l'indice suivant sur la même ligne i continue à valoir 0 mais il faut augmenter la valeur de j pour arriver à 1. la relation pourrait être i +j, mais est-ce suffisant. En effet sur la ligne suivante i vaudra 1 mais pour arriver à l'indice 3 la relation i+j ne donnera pas ce qu'on espère puisque j vaudra d'abord 0. En fait il faut multiplier i par 3 pour obtenir le résultat que l'on attend. La formule qui permet de se repérer dans ce réseau est i*3+j.
Est-ce que l'on peut remplacer la valeur 3 par une variable qui pourrait se déterminer automatiquement sans que l'on n'intervienne et cela à partir du nombre total de point de la liste. Oui. Si le réseau de polygones est carré, ce sera toujours la racine carré du nombre total de point de la liste. (On peut arriver à des résultats avec  la division entière et le reste de la  division entière lorsque le réseau n'est pas carré mais c'est une autre histoire que nous réserverons pour un autre didacticiel.)
 
import Blender
from Blender import NMesh

# Quelques fonctions du module mathématiques de  Python
# peuvent se révéler utiles,  le python, grand économe,
# ne charge que le strict minimum lorsqu'il est sollicité
import math
from math import *

# Creation du reseau de polygones
me=NMesh.GetRaw()

# Sans aborder le problème des variables locales
# et des variables globales il vaut mieux (je préfère)  déclarer les 
# compteurs en dehors des sous-programmes
i=0
j=0

#  Les strictes conditions du didacticiel
# on range la valeur 9 dans une variable maxpoint
maxpoint=9

# On applique systematiquement:
# on tire la racine carré de maxpoint avec 
# la fonction sqrt(). Noter que si la ligne:
# "from math import *" n'avait pas été utilisée plus haut 
# il aurait fallu écrire "math.sqrt(maxpoint)"
n=sqrt(maxpoint)

for i in range(0,n,1):
    # Ici commence le premier sous-programme
    # quatre espaces d'indentation
    for j in range(0,n,1):
        # Ici commence la seconde boucle
        # huit espaces d'indentation
        v =NMesh.Vert(j,i,0)
        me.verts.append(v)
        # Fin de la boucle interne
    #Fin de la boucle externe

# Faisons une pause avant de passer 
# à la création automatique des facettes
# il est toujours possible d'essayer ce 
# script en l'état à condition d'ajouter 
# NMesh.PutRaw(me,"plane",1)
# et
# Blender.Redraw()

précédentPython: itérations (2/5) 
 Python: automatisation...des facettes(4/5)  Suivant
Vers le  Haut de page

Les questions concernant cette page  peuvent être posées sur  :
news://news.zoo-logique.org/3D.Blender


Note: Par définition range() crée une liste de valeurs entières. Les arguments doivent être de vrais entiers. Mais le fait de passer des nombres décimaux ne change pas le résultat .

Livre en français
Blender : apprenez, pratiquez, Créez, livre, Ed. Campus Press, coll. Starter Kit
Blender Starter Kit

Forum
FAQ
Lexique
Didacticiels
Compilations
Blender2KT
Débuter
Modelage
Blender python
Materiaux
Lumière
Animation
API python (eng)
Archives nzn
Statistiques
Doc flash Sculptris
Galerie Sculptris

mon site de démos sur youtube