« Programmation objet et géométrie/Objets Python sous Blender/Objets 3D en Python sous Blender » : différence entre les versions

Un livre de Wikilivres.
Contenu supprimé Contenu ajouté
Annulation des modifications 446723 de CommonsDelinker (discussion)
Ligne 89 : Ligne 89 :




[[Catégorie:Blender3D (livre)]]
[[Catégorie:Blender 3D (livre)]]
[[Catégorie:Programmation objet et géométrie (livre)|Objets Python sous Blender]]
[[Catégorie:Programmation objet et géométrie (livre)|Objets Python sous Blender]]

Version du 2 août 2014 à 19:25

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

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

from Blender import *
import bpy

La sphère

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

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

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

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

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

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: