« Programmation objet et géométrie/Objets Python sous Blender/Création de surfaces paramétrées avec bpy » : différence entre les versions

Contenu supprimé Contenu ajouté
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
 
Ligne 28 :
Comme précédemment, on importe les classes Blender et bpy, mais aussi les fonctions trigonométriques et <math>\pi</math>, qui sont des méthodes (et propriété pour <math>\pi</math>) de l'objet ''math'':
 
<sourcesyntaxhighlight lang="python">
from Blender import *
import bpy
from math import pi, cos, sin
sommets=[]
</syntaxhighlight>
</source>
 
===Liste des sommets===
Ligne 39 :
Lors de sa création, la liste des sommets est vide. Il reste donc à la remplir, ce qui se fait par quelque chose qu'on n'a pas utilisé dans l'article précédent: Une boucle. Celle-ci est double (puisqu'il y a deux paramètres) et ses deux indices sont choisis entre 0 et 100 (pour ''i'') et entre 0 et 50 (pour ''j''). Pour passer de <math>0 \leqslant i \leqslant 100</math> à <math>0 \leqslant u \leqslant \pi</math>, on multiplie ''i'' par <math>\frac{\pi}{100}</math> pour avoir ''u''. De même, <math>v=j \times \frac{\pi}{50}</math>:
 
<sourcesyntaxhighlight lang="python">
for i in range(0,100):
u=i*pi/100
Ligne 48 :
z=cos(u)*sin(2*v)
sommets.append([x,y,z])
</syntaxhighlight>
</source>
 
''x'', ''y'' et ''z'' sont calculés à partir de ''u'' et ''v'' avec les formules ci-dessus, puis le sommet (x,y,z) est ajouté à la base de donnée des sommets. À l'issue de cette boucle, la surface de Steiner sera riche de <math>101 \times 51 = 5151</math> points.
Ligne 61 :
 
 
<sourcesyntaxhighlight lang="javascript">
| | | |
4--54-104-154-
Ligne 73 :
0--50-100-150-
 
</syntaxhighlight>
</source>
 
===tableau des faces===
Ligne 79 :
Ainsi, chaque sommet a un numéro de la forme <math>50i+j</math>, et est relié successivement aux sommets de numéros <math>50i+j+50</math>, <math>50i+j+51</math> et <math>50i+j+1</math>. Il suffit alors de créer un tableau initialisé à 0 pour les faces, et d'y ajouter des listes telles que celle ci-dessus, au fur et à mesure, dans une double boucle:
 
<sourcesyntaxhighlight lang="python">
faces=[]
for i in range(0,99):
for j in range(0,49):
faces.append([50*i+j,50*i+j+50,50*i+j+51,50*i+j+1])
</syntaxhighlight>
</source>
 
En réalité, il manque des faces telles que 49-99-50-0 et 5000-0-1-5001 mais leur absence ne se verra pas, et corriger cet oubli, est laissé en exercice...
Ligne 101 :
Ce qui s'écrit ainsi:
 
<sourcesyntaxhighlight lang="python">
st=bpy.data.meshes.new('pp')
st.verts.extend(sommets)
Ligne 107 :
scn = bpy.data.scenes.active
ob = scn.objects.new(st, 'steiner')
</syntaxhighlight>
</source>
 
Ensuite il suffit de cocher le bouton ''Set smooth'' pour arrondir les angles (et en profiter pour décocher le bouton ''double sided'' puisque pour une fois, on a défini une surface unilatère), à texturer la surface avec un matériau transparent, puis à effectuer un rendu: