Comment empiler l'îlot UV en utilisant Python dans Blender?
Je cherche une aide / solution à ma question "Comment empiler l'îlot UV en utilisant Python dans Blender.
Je n'ai pas loin du début mais c'est tout ce que j'ai jusqu'ici:
import bpy
me = bpy.context.object.data
uv_layer = me.uv_layers.active.data
for poly in me.polygons:
# Here I want to move the selected poly in the location of my 2D cursor
# So eventually all my polygons are stacked into the same pile
C'est une question très débutante et toute l'aide et les conseils sont très appréciés.
------------------ÉDITER---------------------
Voici l'illustration de ce que je veux réaliser avec le script:
Sélectionnez l'îlot UV
Accrocher l'îlot UV au curseur 2D
Répétez les phases 1 et 2 pour chaque face du maillage, pour que finalement toutes les faces soient empilées les unes sur les autres
Réponses
Ici, nous avons besoin de trois choses:
- Trouver la position du curseur 2D
- Vérifiez le mode dans lequel nous nous trouvons avant de traiter les coordonnées UV
- Utilisez le calque UV pour trouver les coordonnées UV
Pour chaque face, une fois les coordonnées UV trouvées, calculez leur centre et décalez les coordonnées de la différence avec le curseur.
Notez que si aucun éditeur UV n'est ouvert, ne trouve pas le curseur et ne fait rien.
Code commenté:
import bpy
from mathutils import Vector
def find_cursor_location():
# Look through area and find the first image editor
for area in bpy.context.screen.areas:
if area.type == 'IMAGE_EDITOR':
return area.spaces.active.cursor_location
return None
obj = bpy.context.object
cursor = find_cursor_location()
if cursor:
#Check the mode as we cant do it in edit mode
mode = obj.mode
if mode != 'OBJECT':
bpy.ops.object.mode_set(mode='OBJECT')
me = obj.data #Need to get it here in case mode is changed
uv_layer = me.uv_layers.active
if uv_layer:
for poly in me.polygons:
# Get all Uv coordinates of the face
uvs = [uv_layer.data[loop_index].uv for loop_index in poly.loop_indices]
# Its center
center = sum(uvs, Vector((0,0))) / len(uvs)
# The needed offset
delta = center - cursor
# Shift UV coords
for uv_data in [uv_layer.data[loop_index] for loop_index in poly.loop_indices]:
uv_data.uv -= delta
#Back to the mode we were in
if mode != 'OBJECT':
bpy.ops.object.mode_set(mode=mode)