Blender (jusqu'à 2.49)
|
Python:
dédoubler
un objet mesh
sans
copier les rotation et multiplication d'échelle
de
son objet parent
|
|
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() |
Les questions concernant cette page
peuvent être posées sur :
news://news.zoo-logique.org/3D.Blender
|