Blender
Python : 
importer des courbes de Beziers
à partir de quelques formats connus
Version Anglaise
    Début   Index
précédent Insérer un script dans les menus 
Le script "paths_import" Suivant

Dans les logiciels de dessin vectoriel (Adobe Illustrator,  Inkscape, Sodipody, Coreldraw, Sketch) on sauvegarde généralement son travail en utilisant des formats standardisés . Les plus connus sont ceux que les illustrateurs utilisent majoritairement : AI et EPS.
Mais il existe également un projet de standardisation plus poussé et plus concerté pour le WEB,  le format SVG.
Enfin, il y a des formats vectoriels moins connus et plus insolites, comme le format d'export des chemins de GIMP.

Ces formats ne sonts pas encore lus et interprétés par Blender dont l'usage principal est bien la modélisation 3D.  Il offre pourtant des outils de gestion des courbes de beziers et un module python pour les modifier mais, hélas ce dernier n'est  pas encore assez développé pour les créer  et ajouter des points ou sommet (cette commande existe mais pour les courbes NURBS seulement). Ces options seront peut-être disponibles dans quelques mois. 
 
 

Attention
A partir de Blender 2.40, il est possible de crée des courbes en passant par le python . Le script d'import SVG a été mis à jour pour en tenir compte . 

On pourrait imaginer que le problème est sans solution, et il l'est : on ne peut pas construire ces courbes dans Blender mais Il est  possible de le faire à "ll'extérieur" et ainsi de contourner le problème. Pour cela on utilise un commande récente de l'API (elle n'est pas encore dans la version officielle et ne sera disponible que dans la version 2.34):
 

Blender.Load(nom_de_fichier)  ...

Cette commande est le sésame qui va permettre de lire et d'ouvrir un certain nombre de type de  fichier dont, est surtout, les fichiers .BLEND eux-même. Mais aussi les fichiers .DXF,.VRML et ...    VIDEOSCAPE.

Il se trouve que (et cela est indiqué dans la documentation officielle de Blender, au moins celle de 1999, époque où le logiciel était encore un shareware), le format VIDEOSCAPE est un format original utilisé par NEOGEO,  la société de production de film d'animation qui développait les premières versions du logiciel.  Il peut contenir des information sur les courbes POLYLINE, NURBS,  et BEZIER. Mieux encore quand on le charge, ces courbes sont créées automatiquement.  Même, et c'est ce qui fait tout son interêt, dans les dernières versions. Donc pour importer des fichiers AI, EPS, GIMPpath ou SVG, il faut d'abord les traduire au format VIDEOSCAPE.
 

Exemple de fichier VIDEOSCAPE:
 

3DG3
0
1
0 0
1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0 
1
4 0 
32 0 
0 0 
1 0 
1.501234 0.0 1.595448 
1.228398 0.0 1.595448 
0.955562 0.0 1.595448 
2 2
0.734104 0.0 1.394819 
0.734104 0.0 1.147645 
0.734104 0.0 0.900472 
2 2
0.955562 0.0 0.699843 
1.228398 0.0 0.699843 
1.501234 0.0 0.699843 
2 2
1.722692 0.0 0.900472 
1.722692 0.0 1.147645 
1.722692 0.0 1.394819 
2 2

Comme on le voit, c'est un format très dépouillé et si on se doute bien que les séries de 4x4 chiffres sont des matrices carrées et que les autres séries de 3X3 peuvent correspondre à des sommets accompagnés de poignées de contrôle, les autres lignes sont assez hermétiques.

En voici la clef:
 

ligne 1  : 3DG3                      - Nombre magique
ligne 2  : type               - Le type d'objet  (5 pour surface, tout autre valeur pour les courbes de  bezier)
ligne 3  : nombre_d_items -  Le nombre de courbe ou de surface
ligne 4  : ext1 ext2           - La valeur pour extruder numbers, aussi donnée pour les surface. Attention ce ne sont pas des décimaux mais des entiers divisés par 500
ligne 5  : Matrice [4][4]         - Matrice main droite . Utilisée pour déterminer la position, la rotation and le size

Pour chaque item:
ligne 6    :type          - type (0 - poly, 1 - bezier, 4 - nurbs. Ajouter 8 à ceci si c'est une courbe 2D.)
ligne 7    :pntsu pntsv       - nombre de sommets dans les direction  u et v 
ligne 8    :resolu resolv     - finesse /résolution dans les direction  u et v
ligne 9:   :orderu orderv    - ordre dans les direction  u et v
ligne 10  :lagu flagv           - Le drapeau 'cyclique' dans les direction  u et v. Cyclique si egal à 1.

Pour  bezier il faut répéter le bloc suivant pntsu fois:
ligne 11  :x y z
ligne 12  :x y z
ligne 13  :x y z            - 3 poignées de controle
ligne 14  :h1 h2           - le type des poignées  (0 - libre, 1 - auto, 2 - vecteur, 3 - aligné)
....

Pour utiliser ces informations dans les scripts, j'ai donc défini 3 classes

  • Bez
  • ITEM
  • COURBE
de la manière suivante:
#===============================
# Blender Curve Data
#===============================
objBEZIER=0
objSURFACE=5
typBEZIER3D=1  #3D
typBEZIER2D=9  #2D

class Bez:
      def __init__(self):
           self.co=[]
           self.ha=[0,0]

class ITEM:
      def __init__(self):
               self.type        =  typBEZIER3D, 
               self.pntsUV      =  [0,0] 
               self.resolUV     =  [32,0] 
               self.orderUV     =  [0,0] 
               self.flagUV      =  [0,0] 
               self.Origine     =  [0.0,0.0]
               self.beziers_knot = []

class COURBE:
      def __init__(self):
              self.magic_number='3DG3' 
              self.type            =  objBEZIER 
              self.number_of_items =  0 
              self.ext1_ext2       =  [0,0] 
              self.matrix          =  """0.0 0.0 1.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0 """ 
              self.ITEM            = {}

Remarque

1/ La matrice doit être modifiée pour donner un affichage correct sinon la forme est sérieusement penchée comme si on avait appliqué une matrice de gauchissement (shear matrix ). Donc :
 

0.0 0.0 1.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0

au lieu de :
 

1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0

2/ L'ordre de présentation des coordonnées doit être orienté sur le plan XZ sinon la forme est complètement écrasée.

3/ L'utilisation de la fonction Blender.Load() suppose une version de Blender au moins égale à la 2.34 ou supérieure (les versions 2.33 compilées à partir du CVS du 20 juillet 2004 sont acceptables). Il est cependant encore possible de récupérer le fichier intermédiaire dans lequel sont stockées les données des courbes avant importation. Ce fichier se trouve dans le meme répertoire que le fichier original, et porte le même nom sans extension et auquel a été rajouté  "OOO.obj". Il n'y a aucune chance que le fichier original soit écrasé.
- Il se peut que dans les prochaine versions des modules d'import de courbes cette possibilité disparaisse pour etre remplacé par un fichier temporaire unique qui sera placé dans le répertoire "bpydata".

4/ Lorsque le fichier objet est chargé, le nom du fichier blender courant est changé. Si on ne fait pas attention, on peut être amené à sauvegarder son travail avec avec un nom d'extension un peu compliqué. Les codeurs de l'API python ont résolu le problème et cette difficulté devrait disparaitre dans Blender 2.34,  version officielle.

5/ Les menus : devant la quantités de plus en  plus importante de scripts, les entrées Paths du menu Import

ont été regroupées dans un sous menu :


précédent Insérer un script dans les menus
Script paths_import Suivant
Vers le  Haut de page

Les questions concernant cette page  peuvent être posées sur  :
 news://news.zoo-logique.org/3D.Blender


 

 

Livre en français
Blender : apprenez, pratiquez, Créez, livre, Ed. Campus Press, coll. Starter Kit
Blender Starter Kit

Forum
FAQ
Lexique
Didacticiels
Compilations
Blender2KT
Débuter
Modelage
Blender python
Materiaux
Lumière
Animation
API python (eng)
Archives nzn
Statistiques
Doc flash Sculptris
Galerie Sculptris

Les Fralibos sur youtube, soutien au personnel de Fralib de Gémenos