Comment empiler l'îlot UV en utilisant Python dans Blender?

Sep 18 2020

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:

  1. Sélectionnez l'îlot UV

  2. Accrocher l'îlot UV au curseur 2D

  3. 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

2 lemon Sep 18 2020 at 13:52

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)