Blender (jusqu'à 2.49)
|
Python
Script:
créer un réseau carré de polygone.
3ieme
partie: automatiser la création des points.
|
|
English
Version
(Attention à partir d'ici
ce texte pourrait devenir rébarbatif, et peut-être même:
fastidieux)
Nous avons donc deux problèmes à
résoudre:
-
il nous faut deux boucles for/next imbriquées
l'une dans l'autre.
-
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.
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() |
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 . |
|