Blender'da Python kullanarak UV adası nasıl istiflenir?
"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:
UV adasını seçin
UV adasını 2D imlece yaslayın
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
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)