Blender (jusqu'à 2.49)
|
Python
Déplacer
un objet
sur
un axe.
|
|
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) |
Les questions concernant cette page
peuvent être posées sur :
news://news.zoo-logique.org/3D.Blender
|