# Programmation objet et géométrie/Objets Python sous Blender/Création de surfaces paramétrées avec bpy

Pour représenter des surfaces paramétrées, on utilise la seule chose que Blender sache gérer: Des polyèdres. Seulement ils ont tellement de faces et elles sont si petites, que le polyèdre aura l'air, si on n'y fait trop attention, d'une surface de classe ${\mathcal {C}}^{1}$. Cette représentation des surfaces par des approximations polyédrales est à la base de chapitres entiers des mathématiques:
* la méthode des éléments finis en analyse numérique;
* la cohomologie en topologie.
Dans les deux cas, la surface est approchée par une triangulation. Comme les deux paramètres de la surface
$\left\{{\begin{array}{l}x=f(u,v)\\y=g(u,v)\\z=h(u,v)\end{array}}\right.$
s'appellent souvent $u$ et $v$, le nom d' uv-mapping est souvent utilisé dans les logiciels de 3D (comme Blender) pour désigner les coordonnées de textures.
Ci-dessous on va représenter une surface unilatère, la surface romane de Steiner.

# Expression paramétrique

La surface de Steiner est donnée par la représentation paramétrique suivante:
$\left\{{\begin{array}{l}x=sin(2u)sin^{2}v\\y=sin(u)sin(2v)\\z=cos(u)sin(2v)\end{array}}\right.$
avec $0\leqslant u\leqslant \pi$ et $0\leqslant v\leqslant \pi$.

## sommets
### Entête du fichier

Comme précédemment, on importe les classes Blender et bpy, mais aussi les fonctions trigonométriques et $\pi$, qui sont des méthodes (et propriété pour $\pi$) de l'objet math:

### Liste des sommets

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 $0\leqslant i\leqslant 100$ à $0\leqslant u\leqslant \pi$, on multiplie i par ${\frac {\pi }{100}}$ pour avoir u. De même, $v=j\times {\frac {\pi }{50}}$:
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 $101\times 51=5151$ points.
Il reste à trouver, dans cette immense collection, quels sommets sont reliés à quels autres.

## faces
### plan des (u,v)

Les faces seront des quadrilatères, bordés horizontalement par des lignes de niveau de v et verticalement par des lignes de niveau de u. Les numéros des sommets correspondent à l'ordre de leur création, soit colonne par colonne:

### tableau des faces

Ainsi, chaque sommet a un numéro de la forme $50i+j$, et est relié successivement aux sommets de numéros $50i+j+50$, $50i+j+51$ et $50i+j+1$. 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:
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...

# Création de la surface de Steiner

Ensuite comme précédemment il reste à
* Instancier un objet héritant de la classe meshes, et l'appeler pp (comme plan projectif)
* Y placer les sommets calculés ci-dessus;
* Y ajouter les faces calculées ci-dessus;
* Rendre la scène Blender active pour pouvoir la modifier;
* En profiter pour y placer l'objet surface de Steiner
Ce qui s'écrit ainsi:
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:

# Exercice

Construire une bouteille de Klein en utilisant la représentation paramétrique de Jeener :