Blender (jusqu'à 2.49)
Python:
dédoubler un objet mesh 
sans copier les rotation et multiplication d'échelle 
de son objet parent
    Début   Index
précédentScript: sauvegarde au format "raw"
Retrouver le répertoire courant... Suivant
Version originale
Mise a jour pour l'api 2.28
Mise au point
Mise a jour pour l'api 2.49

Imiter ctrl-a en masse
Imiter ctrl-a en masse, mise à jour pour B2.49
Imiter le bouton Center New
Imiter le bouton Center Cursor
De l'espace local à l'espace global, version bpy

Par matrice
par fonction dédiée
Correction d'un exemple trouvé sur la doc de l'API python

Version originale

#-------------------------- 
# resize/rotate mesh object jmsoler 2002
#--------------------------
import Blender 
from Blender import Object, NMesh 

def multmat(M,v): 
      x=v.co[0];  y=v.co[1]; z=v.co[2] 
      x1 = (x * M[0][0]) + (y * M[1][0]) + (z * M[2][0]) 
      y1 = (x * M[0][1]) + (y * M[1][1]) + (z * M[2][1])
      z1 = (x * M[0][2]) + (y * M[1][2]) + (z * M[2][2]) 
      v.co[0]=x1; v.co[1]=y1; v.co[2]=z1 
      return  v 

def resetrotsize(obj): 
    me = obj.data 
    mat = obj.matrix 
    new = NMesh.GetRaw(me.name) 

    for v in new.verts: 
       v=multmat(mat,v)

    Newobj=NMesh.PutRaw(new,"fixed") 
    Newobj.loc=obj.loc

obj = Object.Get ("Circle") 
resetrotsize(obj) 

Mise a jour pour l'api 2.28
 

#-------------------------- 
# resize/rotate mesh object jmsoler 2002
#--------------------------
import Blender 
from Blender import Object, NMesh 

def multmat(M,v): 
      x,y,z=v.co
      x1 = (x * M[0][0]) + (y * M[1][0]) + (z * M[2][0]) 
      y1 = (x * M[0][1]) + (y * M[1][1]) + (z * M[2][1]) 
      z1 = (x * M[0][2]) + (y * M[1][2]) + (z * M[2][2]) 
      v.co[0]=x1; v.co[1]=y1; v.co[2]=z1 
      return  v 

def resetrotsize(obj): 
    me = obj.getData()
    mat = obj.getMatrix()
    new = NMesh.GetRaw(me.name) 

    for v in new.verts: 
       v=multmat(mat,v)

    Newobj=NMesh.PutRaw(new) 
    Newobj.setLocation(obj.getLocation())

obj = Object.GetSelected()
if len(obj)>=1 and obj[0].getType()=="Mesh":
     resetrotsize(obj[0]) 

Mise au point 
La multi-définition :  x,y,z=v.co  est acceptée par l'api python mais pas  l'inverse : v.co=x1,y1,z1   qui renvoie une erreur.

Mise a jour pour l'api 2.49
 

#-------------------------- 
# resize/rotate mesh object 
# jmsoler 2009
#--------------------------

from Blender import Object, Mesh, Mathutils
import bpy

sce = bpy.data.scenes.active
objet = sce.objects.active   

def resetrotsize(obj): 
    mat = obj.matrix
    me = bpy.data.meshes.new('myMesh')
    me.getFromObject(obj,1)
    for v in me.verts: 
       v.co=(v.co * mat) - mat.translationPart()
    
    ob = sce.objects.new(me)
    ob.setLocation(mat.translationPart())

if objet and objet.getType()=="Mesh":
     resetrotsize(objet) 

Imiter ctrl-a
Interessant pour appliquer la commande à un groupe d'objet meshes. Ne fonctionne qu'avec les versions datées du 09/05/2005, blender cvs 2.36 ou avec 2.37 et suivants.
 

#-------------------------- 
# resize/rotate mesh object jmsoler 2005
#--------------------------
import Blender
from Blender import NMesh, Object, Mathutils

ob = Object.GetSelected()
for o in ob :
   if o.getType()=='Mesh':
       me = o.getData()
       mat= Mathutils.Matrix(o.matrix[0][:],
               o.matrix[1][:],
               o.matrix[2][:],
               [.0,.0,.0,1.0])
       me.transform(mat)
       me.update()
       o.setEuler(0.0,0.0,0.0)
       o.setSize(1.0,1.0,1.0)

Imiter ctrl-a, mise à jour pour l'api 2.49
 

#-------------------------- 
# resize/rotate mesh object jmsoler 2009
#--------------------------
from Blender import Object, Mathutils
import bpy
sce = bpy.data.scenes.active
ob = [o  for o in sce.objects if o.isSelected() and o.getType()=='Mesh']

for o in ob :
       me = o.getData(mesh=1)
       mat= Mathutils.Matrix(o.matrix[0][:],
               o.matrix[1][:],
               o.matrix[2][:],
               [.0,.0,.0,1.0])
       me.transform(mat)
       o.setEuler(0.0,0.0,0.0)
       o.setSize(1.0,1.0,1.0)

Imiter le bouton Center New
 

Attention : Ne fonctionne qu'avec les versions datées du 09/05/2005, blender cvs 2.36 ou avec 2.37 et suivants.
(Lien elysiun)
 
#-------------------------- 
# center new mesh object, jmsoler 2005
#--------------------------
import Blender
OB=Blender.Object.GetSelected()[0]
ME=OB.getData()
MAT= OB.getMatrix()
ME.transform(MAT)
ME.update()
MAT=Blender.Mathutils.Matrix(
                 [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])
OB.setMatrix(MAT)
BB= OB.getBoundBox()
CU=[BB[0][n]+(BB[-2][n]-BB[0][n])/2.0 for n in [0,1,2]]
MAT= OB.getMatrix()
MAT=Blender.Mathutils.Matrix(MAT[0][:],
                          MAT[1][:],
                       MAT[2][:],
                    [-CU[0],-CU[1],-CU[2],1.0])
ME.transform(MAT)
ME.update()
MAT=Blender.Mathutils.Matrix(MAT[0][:],
                          MAT[1][:],
                       MAT[2][:],
                    [CU[0],CU[1],CU[2],1.0])
OB.setMatrix(MAT)

Imiter le bouton Center Cursor
Voir aussi : Imiter le menu Snap, Cursor to selection (objet)
                    et
                  Snap, Cursor to selection (mode edit )
 

Attention : Ne fonctionne qu'avec les versions datées du 09/05/2005, blender cvs 2.36 ou avec 2.37 et suivants.

(Lien Elysiun)
 

#-------------------------- 
# center cursor mesh object, jmsoler 2005
#--------------------------
import Blender

OB=Blender.Object.GetSelected()[0]
ME=OB.getData()
MAT= OB.getMatrix()
ME.transform(MAT)
ME.update()
MAT=Blender.Mathutils.Matrix(
                 [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])
OB.setMatrix(MAT)
CU= Blender.Window.GetCursorPos()
MAT= OB.getMatrix()
MAT=Blender.Mathutils.Matrix(MAT[0][:],
                                                     MAT[1][:],
                                                     MAT[2][:],
                                                     [-CU[0],-CU[1],-CU[2],1.0])
ME.transform(MAT)
ME.update()
MAT=Blender.Mathutils.Matrix(MAT[0][:],
                                                     MAT[1][:],
                                                     MAT[2][:],
                                                     [CU[0],CU[1],CU[2],1.0])
OB.setMatrix(MAT)
 

De l'espace local à l'espace global, version bpy 
Repositionner les sommets dans l'espace Global. Le centre de l'objet revient au centre du monde 3D.

En utilisant une multiplication des vecteurs sommet  par la matrice de transformation  de l'objet
from Blender import Mathutils, Window
import bpy
sce = bpy.data.scenes.active
ob_act = sce.objects.active
me = ob_act.getData(mesh=1)
mat = ob_act.matrix 

for v in me.verts:
    v.co = v.co * mat

ob_act.setMatrix(mat.identity())
Window.RedrawAll() 

En utilisant la fonction transform
from Blender import Mathutils, Window
import bpy
sce = bpy.data.scenes.active
ob_act = sce.objects.active 
me = ob_act.getData(mesh=1) 
mat = ob_act.matrix 

me.transform(mat)

ob_act.setMatrix(mat.identity())
Window.RedrawAll()
 

Correction d'un exemple trouvé sur la doc de l'API python
Dessine et surtout repositonne correctement les tangentes aux sommets du mesh sélectionné dans l'espace Global. 
 

# ----------------
# 03/03/2009
# ----------------

from Blender import *
import bpy
sce = bpy.data.scenes.active
ob = sce.objects.active
mat= ob.matrix
me = ob.getData(mesh=1)
ts = me.getTangents()
me_disp = Mesh.New()
verts = []
edges = []
for i, f in enumerate(me.faces):
     ft = ts[i]
     for j, v in enumerate(f):
         tan = ft[j]
         co = v.co * mat
         verts.append(co-tan)
         verts.append(co+tan)
         i = len(verts)
         edges.append((i-1, i-2))
me_disp.verts.extend( verts )
me_disp.edges.extend( edges )
sce.objects.new( me_disp )
Window.RedrawAll() 


 
précédentScript: sauvegarde au format "raw"
 Retrouver le répertoire courant... 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