En animation 3D,
les temps de calcul peuvent être très longs à moins
de réduire la définition des objets en fonction de leur éloignement
de la caméra. Dans Blender, le scripting python permet d'automatiser
cette opération.
Blender offre une option de subdivision de surface de type Catmull-Clarck avec 7 niveaux de finesse (0->6) applicable aux objets de type meshes. Certains artistes se servent de cet outil pour réduire le poids de l'objet en fonction de l'éloignement. Une valeur 4 ou 5 pour les objets les plus proches de la caméra (au-delà le nombre de faces serait prohibitif) et 0 pour les plus éloignés . Automatisation pour l'animation Un seul ennui : cette opération doit être réalisée à la main et n'est pas très pratique pendant une animation car il faut réétalonner la division entre chaque image. C'est le genre de travail qu'un script peut faire en se connectant à l'animation courante pour effectuer le calcul en tache de fond, à chaque changement de frame L'ensemble des objets utilisés dans l'animation courante est regroupé dans une "scène" . En python, ce qui touche à
une scene (les informations de rendu, la listes de objets liés
à cette scène, par exemple) est géré au travers
du module du même nom . La première chose à faire consiste
donc à obtenir une variable représentant l'objet Scene grâce
à la méthode :
Pour faciliter la compréhension,
on écrit toutes les variables en lettre majuscules .
Le lien ne doit être établi
qu'une seule fois, ce qui oblige à récupérer et à
tester la liste des scripts déjà liés
La scène permet d'accéder
aux données de la caméra
qui possède deux limites, avant et arrière , ClipStart et ClipEnd :
Tout ce qui se trouve en dehors ne sera pas affiché. On trie donc systématiquement tous les objets pour ne traiter que ceux qui se trouvent à l'intérieur et dont l'option SubSurf est activée . Accélérer un peu en utilisant la Bounding Box Chacun des objets de Blender contient les données de la boite englobante dans laquelle il est enfermé (Figure 4, tracé rose ) . Quel que soit le nombre de sommets que contient le mesh, en passant par cette boite on connait la position du plus extrème d'entre eux . Il n'y a donc plus que huit tests à effectuer pour savoir si une partie de cet objet se trouve dans les limites de vision de la caméra. Il ne reste plus qu'à effectuer une simple division sur la distance qui sépare l'objet de la caméra et à ranger le résultat dans une liste pour nourrir la fonction M.setSubDivLevels([LOD,LOD]) qui fixera la valeur de subdivision de surface : [Figures 5 et 6]. Des améliorations sont possibles en ne prennant plus en compte les objets qui seraient entièrement en dessous de la limite ClipStart de la caméra, ou encore en dehors de la pyramide visuelle. Le Script
Variable EDITMODE : limiter les effets au rendu de l'animation Cette modification permet d'alléger l'affichage en mode édition . On peut donc tester l'animation sans avoir la lourdeur d'un mesh subsurfé .
Les questions concernant cette page
peuvent être posées sur :
|