Blender'da Python kullanarak UV adası nasıl istiflenir?

Sep 18 2020

"Blender'da Python kullanarak UV adası nasıl istiflenir?" Soruma yardım / çözüm arıyorum.

Baştan çok uzağım yok ama şu ana kadar sahip olduğum tek şey bu:

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 

Bu çok yeni başlayan bir sorudur ve tüm yardım ve ipuçları çok takdir edilmektedir.

------------------DÜZENLE---------------------

Senaryo ile elde etmek istediğim şey şu:

  1. UV adasını seçin

  2. UV adasını 2D imlece yaslayın

  3. Ağdaki her yüz için 1. ve 2. aşamaları tekrarlayın, böylece sonunda tüm yüzler üst üste istiflenir

Yanıtlar

2 lemon Sep 18 2020 at 13:52

Burada üç şeye ihtiyacımız var:

  • 2d imleç konumunu bulun
  • UV koordinatlarını işlemeden önce içinde bulunduğumuz modu kontrol edin
  • UV koordinatlarını bulmak için UV katmanını kullanın

Her yüz için, UV koordinatları bulunduğunda, merkezlerini hesaplayın ve imleçten farkla koordinatları kaydırın.

Hiçbir UV editörü açılmadıysa, imleci bulamayacağını ve hiçbir şey yapmayacağını unutmayın.

Yorumlanan kod:

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)