Blender (jusqu'à 2.49)
Python 
Déplacer un objet 
sur un axe. 
    Début   Index
précédent Script pivot
En chantier Suivant
Dans l'espace global

Pour déplacer un objet sur les axes de l'espace Global comme dans la Figure 1 où l'on voit clairement que l'axe bleu sur l'objet est parallèle à l'axe z de la fenêtre 3d, ce qui correspond à l'espace du monde ou globalworld, on peut utiliser plusieurs plusieurs méthodes.


Figure 1

La plus simple consiste  à modifier directement le paramètre LocZ qui est attaché à l'objet :

import Blender
from Blender import Object, Mathutils, Window
obj = Object.GetSelected()[0]
obj.LocZ = obj.LocZ + 1.0
Window.Redraw(Window.Types.VIEW3D)
On peut aussi passer par une fonction du type setLocation() qui rallonge un peu le code car on est alors obligé de gérer  les deux autres axes et donc  forcé de passer par une seconde fonction getLocation() pour en connaître les valeurs :
import Blender
from Blender import Object, Mathutils, Window
obj = Object.GetSelected()[0]
x,y,z = obj.getLocation()
z = z+1.0
obj.setLocation(x,y,z)
Window.Redraw(Window.Types.VIEW3D)
Dans l'espace local

Pour déplacer, l'objet sur ses axes locaux comme sur la Figure 2, où l'on voit bien que les axes ne sont plus parallèles du tout,..


Figure 2

... c'est un peu plus compliqué car il faut travailer avec la matrice de transformation de l'objet : .mat ou .matrix

Sans parent 
Intuitivement on pensera à préserver la matrice de l'objet pour la remplacer par la matrice identité ce qui enverra l'objet sur le point d'origine du monde. Là, on effectue les déplacements et modifications que l'on souhaite faire. Chacun d'eux transforme à nouveau la matrice courante de l'objet. Il suffira ensuite de multiplier cette matrice par celle que l'on réservée au départ pour remettre l'objet dans l'orientation qui était la sienne modifiée par les transformations que l'on a faites sur le centre du monde 3D. 

import Blender
from Blender import Object, Mathutils, Window
obj = Object.GetSelected()[0]

mat= Mathutils.Matrix(obj.mat)
obj.setMatrix(obj.mat.identity())
obj.LocZ = 1.0
obj.setMatrix(obj.mat*mat)
Window.Redraw(Window.Types.VIEW3D)

Finalement, cela revient à multiplier deux matrices : la matrice  identité transformée et la matrice courante de l'objet. Il n'est peut-être pas nécessaire de déplacer l'objet vers le centre du monde.
import Blender
from Blender import Object, Window
from Blender.Mathutils import *
obj = Object.GetSelected()[0]

mat = obj.mat.identity() * TranslationMatrix(Vector(0.0,0.0,1.0))
obj.setMatrix( mat * obj.mat )
Window.Redraw(Window.Types.VIEW3D)

Attention à l'ordre des matrices : obj.setMatrix( mat * obj.mat ) et obj.setMatrix( obj.mat  * mat ) ne donnent pas le même résultat.

Avec parent : 

Si l'objet est connecté à un parent, la méthode précédente ne fonctionne plus correctement puisque le déplacement setMatrix ajoute aussi la position globale du parent. 


Figure 3

La bonne méthode consiste à récupérer l'orientation de l'objet avec la .fonction mat.rotationPart() et à l'inverser avec mat.invert() puisque on doit avoir une rotation nulle sur le vecteur de déplacement lorsqu'il sera appliqué.

import Blender
from Blender import Object, Window
from Blender.Mathutils import *
obj = Object.GetSelected()[0]

mat = obj.mat.rotationPart()
mat.invert()
translation = mat * Mathutils.Vector(0, 0, 1)
obj.LocX += translation.x
obj.LocY += translation.y
obj.LocZ += translation.z

Window.Redraw(Window.Types.VIEW3D)

précédent Script pivot
 En Chantier 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

mon site de démos sur youtube