Programmation objet et géométrie/Objets Python sous Blender/Objets 3D en Python sous Blender

Un livre de Wikilivres.

Pour Blender, les cubes, sphères, cônes etc. sont des objets. Des objets 3D, mais des objets.

Pour Python, tout est objet. Y compris les objets de Blender!

On peut donc utiliser l'un pour créer les autres.

Dans l'exemple ci-dessous, on va représenter une fenêtre de Viviani, et plus précisément l'intersection d'une sphère et d'un cylindre pleins.


Les objets[modifier | modifier le wikicode]

Le fichier doit, comme on l'a vu, commencer par

from Blender import *
import bpy

La sphère[modifier | modifier le wikicode]

En fait il y a deux sphères différentes, l'une avec des méridiens et des parallèles (donc à faces quadrilatérales), l'autre ressemblant à un icosaèdre avec éventuellement plus de 20 faces, mais triangulaires. La première sphère s'appelle UVsphere, la seconde Icosphere. C'est la seconde qu'on a choisi ici, avec 4 subdivisions appliquées à un icosaèdre et un rayon de 2.0:

me1 = Mesh.Primitives.Icosphere(4,2.0)

Elle s'appelle me1 parce que c'est un mesh.

Le cylindre[modifier | modifier le wikicode]

Le cylindre doit avoir un rayon moitié de celui de la sphère, soit 1.0 et on lui donne une hauteur de 2.0; en plus, pour qu'il soit suffisamment arrondi, on lui donne 64 sommets par base:

me2 = Mesh.Primitives.Cylinder(64,1.0,2.0)

Déplacement[modifier | modifier le wikicode]

Maintenant il est temps d'accéder à la scène, ce qu'on fait en invoquant la méthode GetCurrent de l'objet Scene.

Ensuite on place un cylindre de type me2 (créé ci-dessus) dans la scène. C'est une instanciation de l'objet me2.

Enfin on translate ce cylindre, simplement en modifiant son abscisse, qui devient 0.5:

sc = Scene.GetCurrent()
cyl=sc.objects.new(me2,'Mesh')
cyl.LocX=0.5

LocY et LocZ sont les autres coordonnées de l'objet, et il existe aussi des propriétés angulaires des objets comme RotX etc. qui sont donnés en radians.

La scène[modifier | modifier le wikicode]

Pour finir, il suffit de placer une sphère (objet me1) dans la même scène, et d'activer l'affichage de celle-ci dans Blender:

sph=sc.objects.new(me1,'Mesh')
Window.RedrawAll()

C'est tout! Le script dans son intégralité est rappelé ci-dessous:

from Blender import *
import bpy
me1 = Mesh.Primitives.Icosphere(4,2.0)
me2 = Mesh.Primitives.Cylinder(64,1.0,2.0)
sc = Scene.GetCurrent()
cyl=sc.objects.new(me2,'Mesh')
cyl.LocX=0.5
sph=sc.objects.new(me1,'Mesh')
Window.RedrawAll()

À l'origine[modifier | modifier le wikicode]

Une fois le rendu effectué, et en texturant les deux objets avec des couleurs transparentes, on obtient le rendu que voici:

Avec un peu d'imagination, on peut voir la courbe de Viviani. Mais le lissage de la figure a diminué un peu le rayon de la sphère et on ne voit plus le point double de la courbe. Alors on peut utiliser Blender pour créer un nouvel objet, l'intersection des deux objets précédents:

Intersection[modifier | modifier le wikicode]

On sélectionne les deux objets d'un clic droit, puis on appuie sur la touche W du clavier, ce qui permet de sélectionner l'intersection (opération booléenne). Mais on ne voit rien si on n'enlève pas la sphère et le cylindre. Une fois que c'est fait, il reste cet objet: