Blender (jusqu'à 2.49)
|
Python
:
Créer
et uvmapper un mesh
et
Mélanger
les textures UV disponibles
dans
le fichier courant.
(English
version)
|
|
Créer
et uvmapper un mesh
Dans cette version
du script il ne serait possible d'assigner qu'un seul materiau à
l'ensemble du mesh.
#this seems to work
import Blender
from Blender import *
me=NMesh.GetRaw()
v=NMesh.Vert(1.0,0.0,0.0)
me.verts.append(v)
v=NMesh.Vert(1.0,1.0,0.0)
me.verts.append(v)
v=NMesh.Vert(0.0,1.0,0.0)
me.verts.append(v)
v=NMesh.Vert(0.0,0.0,0.0)
me.verts.append(v)
f=NMesh.Face()
f.v.append(me.verts[0])
f.v.append(me.verts[1])
f.v.append(me.verts[2])
f.v.append(me.verts[3])
uv=[]
uv.append( (0.0,0.0))
uv.append( (1.0,0.0))
uv.append( (1.0,1.0))
uv.append( (0.0,1.0))
f.uv=uv
im=Image.Load('f:/maincrystalpalace3.jpg')
f.image = im
if Blender.Get('version')>=228:
C = NMesh.FaceModes
else:
C = NMesh.Const
f.mode=C['LIGHT']
f.mode|=C['TEX']
f.mode|=C['TWOSIDE']
me.faces.append(f)
newmat = Material.New('newmat')
newmat.mode = newmat.mode | 2048
me.materials.append(newmat)
#
#f.mat=1
f.transp=NMesh.FaceTranspModes['SOLID']
f.flag=NMesh.FaceFlags['ACTIVE']
tex = Texture.New()
tex.setType('Image')
tex.image = im
newmat.setTexture(0, tex)
mtex = newmat.getTextures()
mtex[0].texco=Texture.TexCo.UV
NMesh.PutRaw(me,"Plane.002")
Blender.Redraw() |
Mélanger
les textures UV disponibles dans le fichier courant.
télécharger
le script
#!BPY
"""
Name: 'UV Texture Randomizer'
Blender: 232
Group: 'UV'
Tooltip: 'a script to blend the uv textures with random'
"""
__author__ = "Jean-Michel Soler (jms)"
__url__ = ("""Script's homepage, http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_python_uvmap.htm""",
"""Communicate problems and errors, http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender""")
__version__ = "11/2004"
__bpydoc__ = """
This script blends all the uvtextures of the current file face by face.
Usage:
run the script from the UV Scripts Menu. All UV textures
will be collected and
connected by face.
"""
#-------------------------------------------------
# script pour melanger les texture uv sur l'ensemble des
# mesh .
#-------------------------------------------------
import Blender
IMAGES=Blender.Image.Get()
#-------------------------------------------------
# BY_OBJECT=0
# textures blended by faces
# textures melangees par faces
# BY_OBJECT=1
# textures blended by object
# textures melangees par object
#---------------------------------------------------
BY_OBJECT=1
#---------------------------------------------------
# Fonction :
# Tester les objets constitues de segment sans aucune
# face exportable. Retourne faux si au moins une face
# est un triangle ou un quad
#---------------------------------------------------
def onlysegment(o):
for f in o.getData().faces:
if len(f.v)>2:
return
0
return 1
#---------------------------------------------------
# Fonction :
# detecte la presence de coordonnee uv
#---------------------------------------------------
def hasUV(m):
for f in m.faces:
#print f.uv
if f.uv:
return 1
return 0
#---------------------------------------------------
# Operation :
# Creer la liste des objets meshes
#---------------------------------------------------
OBJ=[o for o in Blender.Object.Get()
if o.getType()==
'Mesh' and
(o.getData().faces!=[] or
not onlysegment(o))]
print OBJ
if Blender.Get('version')>=228:
C = Blender.NMesh.FaceModes
else:
C = Blender.NMesh.Const
for o in OBJ:
m=o.getData()
if hasUV(m) ==1 :
if BY_OBJECT==1:
val=int(Blender.Noise.random()*len(IMAGES))
img=IMAGES[val]
print img, val
for f in m.faces:
if BY_OBJECT==0:
img=IMAGES[int(Blender.Noise.random()*len(IMAGES))]
print
img
f.image=img
f.mode=C['LIGHT']+C['TEX']+C['TWOSIDE']
m.update()
Blender.Redraw() |
3/
Comment savoir si un vertex est sélectionné dans la fenêtre
UVeditor ?
A cette date, 1er octobre 2005, il n'y
a rien dans la documentation de l'API qui permette de savoir comment procéder
. On peut imaginer que les informations à ce sujet doivent
pourtant être accessibles simplement . Les coordonnées
uv sont liées aux faces et les faces sont dotées d'un flag/drapeau
qui permet de savoir s'il elles sont selectionnées ou cachées
ou affichées .
Le dictionnaire Blender.NMesh.FaceFlags
ne donne que 3 valeurs, une pour chaque possibilité . On peut
les afficher facilement avec le script suivant :
import Blender
for k in dir(Blender.NMesh.FaceFlags):
a=Blender.NMesh.FaceFlags[k]
print k,' : '
for b in [(a & 1<<n)>>n for n in range(15,-1,-1)]:print
b,
print |
Attention : observez comment les clefs
de ce dictionnaires sont obtenues :
dir(Blender.NMesh.FaceFlags)
normalement ce dervait être Blender.NMesh.FaceFlags.keys()
mais
cette focntion renvoie une erreur . |
Résultats
ACTIVE
: 2
0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0
HIDE :
64
0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0
SELECT
: 1
0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 |
Comme ces données ne prennent que
3 bits sur les 16 disponibles on peut se poser des question sur ce que
blender fait du reste . Il ne reste plus qu'à tester chaque
cas de figure et observer ce que le script suivant affichera .
import Blender
from Blender import NMesh
ME=Blender.Object.Get('Sphere').getData()
print dir(ME.faces[0].uv)
SEL = NMesh.FaceFlags['SELECT']
FA=[f for f in ME.faces if (f.flag & SEL)]
a=FA[0].flag
for b in [(a & 1<<n)>>n for n in range(15,-1,-1)]:print
b, |
Cas numero 1 : aucun vertex
sélectionné
0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 |
Cas numero 2 : 1 seul vertex
sélectionné
0 0 0 0 0 0 0
0 0 0 0 1 0 0 1 1 |
Cas numero 3 : 2 vertices
sélectionnés
0 0 0 0 0 0 0
0 0 0 0 1 1 0 1 1 |
Cas numero 3 : 3 vertices
sélectionnés
0 0 0 0 0 0 0
0 0 0 0 1 1 1 1 1 |
Visiblement les bits 2 à 5 sont
utilisés pour marquer la sélection d'un vertex dans la fenêtre
UVeditor . Il ne reste plus qu'à déterminer quel bit correspond
à quel vertex dans la suite des coordonnées uv . On
modifie légèrement les script pour afficher les cordonnées
uv dans l'ordre :
import Blender
from Blender import NMesh
ME=Blender.Object.Get('Sphere').getData()
print dir(ME.faces[0].uv)
SEL = NMesh.FaceFlags['SELECT']
FA=[f for f in ME.faces if (f.flag & SEL)]
print FA[0].flag
a=FA[0].flag
for b in [(a & 1<<n)>>n for n in range(15,-1,-1)]:print
b,
print
n=0
for a,b in FA[0].uv:
print n,'uv : ', a*256,' X'
print n,'uv : ', b*256,' Y'
n+=1
print
|
et on compare avec les valeurs affichées
en Properties quand on appuie sur la touche N :
ME=Blender.Object.Get('Plane').getData()
FA=[f for f in ME.faces if (f.flag & 60)]
UV=[]
for f in FA:
for u in f.uv:
if f.flag & 1<<(f.uv.index(u)+2):
UV.append((round(u[0]*256,2),round(u[1]*256,2)))
print UV[0] |
UV
vertex selector
Ce script permet de sélectionner
une des coordonées uv par face et dans toutes les faces sélectionnées
. Une fois sélectionnés, les sommets positionnés sur
le point (0.0,0.0) et peuvent être déplacé tous
ensembles par l'utilisateur .
Mode d'emploi :
A priori on suppose que
l'objet mesh est déjà sélectionné ainsi que
les faces que l'on souhaite modifiées et, bien sûr, on se
trouve en mode Faceselect .
1/ Très important : Dans la
fenêtre uvedito, désélectionnez
tous le ssommets avec la touche A.
2/ Lancez le script , soit à partir
d'un des menus UV ou Scripts, soit à partir de la fenêtre
d'édition de texte .
3/ Dans la boite popup choisissez
le numéro du sommet que vous souhaitez traiter pour l'ensemble
des faces . le choix d'étend de 1 à 4 .
4/ Appuyez sur OK sinon le script
ne fonctionnera pas .
Dans toutes les faces sélectionnée,
ce sommet UV va être activé et envoyé aux coordonnées
(0.0,0.0)
5/ utilisez le raccourci G
en faisant attention de ne pas cliquer avec la souris dans la fenêtre
UV edtor car vous perdriez toutes les sélections
et déplacez vers la position souhaitée .
6/ IMPORTANT:
après avoir terminé de positionner les sommets
n'oubliez
pas de tout désélectionner de nouveau ..
#!BPY
"""
Name: '[WIP] UV vertex selector'
Blender: 232
Group: 'UV'
Tooltip: ''
"""
__author__ = "Jean-Michel Soler (jms)"
__url__ = ("""Script's homepage, http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_python_uvmap.htm""",
"""Communicate problems and errors, http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender""")
__version__ = "09/20/2006"
__bpydoc__ = """
This script selects and moves to 0.0 location one
of the uvcoords by face but in all the selected
faces .
Usage:
1/ In the uveditor window, unselect all the uv vertice
.
2/ Run the script from the UV Scripts Menu. In the pupbox
choose the number of one uv vertex (up
to 4) .
3/ Press OK . in all selected faces, this uvvertex
will be
activated and located on 0.0 .
3/ Push Gkey (be careful of do not clic with the
mouse on
the window, you will loose the selection
) and move all
of them where you want ...
4/ IMPORTANT : do not forget to unselect agin all before
to
choose the next uv reusing th escript .
"""
#-------------------------------------------------
# script pour ...
#-------------------------------------------------
import Blender
from Blender import Object,Scene
f = Blender.Draw.Create(1)
block = []
block.append(("Value: ", f, 1, 4,"Select the UV vertex"))
OBJ= Scene.getCurrent().getActiveObject()
if OBJ.getType()=='Mesh' :
MESH=OBJ.getData()
if MESH.hasFaceUV() :
retval = Blender.Draw.PupBlock("Select UV Vertex", block)
if retval :
FA=[F for F in MESH.faces if (F.flag &
1)]
for F in FA :
F.uv[f.val]=(0.0,0.0)
F.flag|=1<<(f.val+2)
print F.flag
MESH.update() |
Les questions concernant cette page
peuvent être posées sur :
news://news.zoo-logique.org/3D.Blender
|