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

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 objetsModifier

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

from Blender import *
import bpy

La sphèreModifier

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 cylindreModifier

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éplacementModifier

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èneModifier

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'origineModifier

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:

IntersectionModifier

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: