Resultados 1 al 2 de 2

Cómo añadir y dar valor a coordenadas UV de una malla

  1. #1
    Fecha de ingreso
    Feb 2008
    Mensajes
    109

    Cómo añadir y dar valor a coordenadas uv de una malla

    Hola estoy pasando un viejo script de Blender 2.49 que hice para leer un archivo muy simple que contiene una malla.

    Ya he adaptado todo el código excepto la parte en la qué leo de mi archivo las cordenas UV y se las paso a la malla creada. Mi problema es que en no sé cómo se le añaden ahora coordenadas UV a una Maya mediante script y se fina sus valores.

    La parte del script que no logré traducir son estas líneas que deje comentadas en el script:
    For que in range(len(malla[i].polygons)):
    #malla[i].faces[q].mode = Blender. Mesh. FaceModes[TWOSIDE].
    #malla[i].faces[q].transp = Blender. NMesh. FaceTranspModes[ALPHA].
    #malla[i].faces[q].uv=Mathutils. Vector(uv[a[q]), Mathutils. Vector(uv[bb[q]), Mathutils. Vector(uv[cc[q]).

    Print(i).

    Nuevo:
    Código:
     import bpy.
    
    Def read_some_data(context, filepath, use_some_setting):
    Print(running read_some_data.).
    
    File = open(filepath, 
    , encoding=utf-8).
    
    Print(file, readline()).
    
    File, readline().
    
    CfType=file, readline(), replace(Type=,\).
    
    Print(cfType).
    
    Scene_name=cfType.
    
    Sc=bpy, data, scenes, new(scene_name).
    
    For scrn in bpy, data, screns:
    If scrn, name == Default:
    Bpy, context.window.screen = scrn.
    
    Bpy, context, screen, scene=sc.
    
    Numeroparts=int(file, readline(), replace(Number of blocks=,\)).
    
    Print(numeroparts).
    
    Numerovertxpart=[].
    
    Numerofacexpart=[].
    
    File, readline() t t t.
    
    For i in range(0, numeroparts):
    Line=file, readline().
    
    Print(line, split()[0]).
    
    Print(line, split()[1]).
    
    Numerovertxpart, append(int(line, split()[0])).
    
    Print(numerovertxpart[i]).
    
    Numerofacexpart, append(int(line, split()[1])).
    
    Print(numerofacexpart[i]) 	 t t t t t t t.
    
    Malla=[].
    
    Ob=[].
    
    For i in range(0, numeroparts):
    Malla, append(bpy, data, meshes, new(name=2k_Part+str(i))).
    
    Uv = [].
    xyz= [].
    
    For in range(0, numerovertxpart[i]):
    Line=file, readline().
    x, y, z, u, =float(line, split()[0].replace(,.)), float(line, split()[1].replace(,.)), float(line, split()[2].replace(,.)), float(line, split()[3].replace(,.)), float(line, split()[4].replace(,.)).
    
    Uv, append((u,)).
    xyz, append((x, y, z)).
    
    Print(x, y, z).
    #malla[i].vértices, add(1).
    #malla[i].vértices[i].co=(float(x), float(y), float(z)) t	.
    
    A = [].
    
    Bb = [].
    
    Cc = [].
    
    Faces= [] 	 t	.
    
    For in range(0, numerofacexpart[i]):
    Line=file, readline().
    
    A, b, c=int(line, split()[0]), int(line, split()[1]), int(line, split()[2]).
    
    Faces, append((a, b, c)).
    
    A, append(a).
    
    Bb, append(b).
    
    Cc, append(c).
    
    Print(a, b, c).
    
    Malla[i].from_pydata(xyz, [], faces) t t.
    
    For que in range(len(malla[i].polygons)):
    #malla[i].faces[q].mode |= Blender. Mesh. FaceModes[TWOSIDE].
    #malla[i].faces[q].transp = Blender. NMesh. FaceTranspModes[ALPHA].
    #malla[i].faces[q].uv=Mathutils. Vector(uv[a[q]), Mathutils. Vector(uv[bb[q]), Mathutils. Vector(uv[cc[q]).
    
    Print(i) t t	 t	.
    
    Scn =bpy, context, scene.
    
    Objeto=bpy, data, objects, new(Part+str(i), malla[i]).
    
    Objeto, modificadores, new(Subsurf, type=SUBSURF).
    
    Objeto, modificadores, new(Subsurf, type=SUBSURF).
    
    Scn, objects, link(objeto).
    
    Scn, update().
    
    File, close().
    # would normally load the data here.
    
    Return {FINISHED}.
    # ImportHelper is a helper class, defines filename and.
    # invoke() function which calls the file selector.
    
    From bpy_extras, io_utils import ImportHelper.
    
    From bpy, props import StringProperty, BolProperty, EnumProperty.
    
    From bpy, types import Operator.
    
    Class ImportSomeData(Operator, ImportHelper):
    \This appears in the toltip of the operator and in the generated docs.
    
    Bl_idname = import_test, cf_import # important since its how bpy, ops, import_test, some_data is constructed.
    
    Bl_label = Import CF.
    # ImportHelper mixin class uses this.
    
    Filename_ext = .cf.
    
    Filter_glob = StringProperty(.
    
    Default=*.cf.
    
    Options={HIDEN}.
    ).
    # List of operator properties, the attributes will be assigned.
    # to the class instance from the operator settings before calling.
    
    Use_setting = BolProperty(.
    
    Name=Example Bolean.
    
    Description=Example Toltip.
    
    Default=True.
    ).
    
    Type = EnumProperty(.
    
    Name=Example Enum.
    
    Description=Chose betwen two items.
    
    Items=((OPT_A, First Option, Description one).
    (OPT_B, Second Option, Description two)).
    
    Default=OPT_A.
    ).
    
    Def execute (self, context):
    Return read_some_data(context, self, filepath, self, use_setting).
    # Only neded if you want to add into a dynamic menu.
    
    Def menu_func_import(self, context):
    Self, layout, operator(ImportSomeData, bl_idname, text=Text Import Operator).
    
    Def register():
    Bpy, utils, register_class(ImportSomeData).
    
    Bpy, types. INFO_MT_file_import, append(menu_func_import).
    
    Def unregister():
    Bpy, utils, unregister_class(ImportSomeData).
    
    Bpy, types. INFO_MT_file_import, remove(menu_func_import).
    
    If __name__ == __main__:
    Register().
    # test call.
    
    Bpy, ops, import_test, cf_import(INVOKE_DEFAULT).
    .
    Última edición por jor1980; 01-04-2014 a las 12:15

  2. #2
    Fecha de ingreso
    Dec 2025
    Mensajes
    0
    Para añadir coordenadas UV a una malla en Blender mediante script (versiones actuales como 2.8+), debes trabajar con los datos de la capa UV del mesh. El código antiguo que usaba malla[i].faces[q].uv ya no es válido.

    Primero, necesitas crear una capa de datos UV para la malla. Después de crear la malla con from_pydata, debes acceder a sus loops (bucle de vértices por cada polígono) y asignar las coordenadas UV.

    Aquí está la adaptación para el bucle que tienes comentado. Reemplaza el for que in range(len(malla[i].polygons)): con lo siguiente.

    Debes asegurarte de que la malla tenga una capa UV. Añade esto antes del bucle: malla[i].uv_layers.new(). Esto crea una capa UV activa.

    Luego, en el bucle, accede a los loops de cada polígono. Cada polígono tiene un índice de loop. Para un triángulo, cada polígono tiene 3 loops. Puedes iterar sobre los loops de la malla y asignar las UV usando los índices a, bb, cc que ya tienes.

    Un método directo es usar el atributo uv de la capa UV. Después de crear la capa UV, obtén una referencia a ella: uv_layer = malla[i].uv_layers.active.data.

    Ahora, para cada polígono, sus loops están en un rango específico. El índice del loop para un polígono q se calcula como: loop_start = malla[i].polygons[q].loop_start. Cada polígono tiene loop_total (para triángulos, será 3). Luego asignas a cada loop (vértice del polígono) su coordenada UV.

    Así quedaría el código modificado. Primero, justo después de malla[i].from_pydata(xyz, [], faces), añade la capa UV. Luego, el bucle:

    uv_layer = malla[i].uv_layers.new().data

    for q in range(len(malla[i].polygons)):
    poly = malla[i].polygons[q]
    loop_indices = poly.loop_indices
    uv_layer[loop_indices[0]].uv = (uv[a[q]][0], uv[a[q]][1])
    uv_layer[loop_indices[1]].uv = (uv[bb[q]][0], uv[bb[q]][1])
    uv_layer[loop_indices[2]].uv = (uv[cc[q]][0], uv[cc[q]][1])

    Nota que en tu código, uv es una lista de tuplas (u, v). Asegúrate de que uv se haya llenado correctamente con dos valores (u y v). En tu lectura actual, parece que solo estás guardando un valor. Debes cambiar uv.append((u, v)) en la lectura de vértices. Actualmente tienes uv.append((u,)) lo cual es incorrecto. Debe ser uv.append((u, v)) donde v es el quinto valor de la línea.

    Corrige la línea de lectura: x, y, z, u, v = float(...), float(...), float(...), float(...), float(...). Luego uv.append((u, v)).

    Respecto a las otras líneas comentadas sobre mode y transp, en Blender actual, las caras (polygons) no tienen esos atributos directamente. Para caras de doble cara, debes ajustar el shading. Puedes usar poly.use_smooth = True o False. Para transparencia, eso se maneja con materiales y nodos shader, no directamente en la cara. Puedes omitir esas líneas o buscar métodos equivalentes en la API actual si son esenciales.

    En resumen, los pasos clave son: crear una capa UV con uv_layers.new(), obtener sus datos, y luego asignar a cada loop del polígono las coordenadas UV usando el índice del loop. Asegúrate de que los datos UV se lean correctamente como pares (u, v).

Temas similares

  1. Añadir detalles curvos sobre malla cuadricular
    Por PulsarEnter en el foro Modelado
    Respuestas: 2
    : 01-07-2019, 23:03
  2. Cómo seleccionar vértices por valor de un eje
    Por vinylatex en el foro Modelado
    Respuestas: 5
    : 08-05-2016, 15:41
  3. Blender Cómo añadir coordenadas UV a un vértice en Blender
    Por jor1980 en el foro Plugins y Scripts
    Respuestas: 1
    : 24-05-2009, 06:54
  4. Covertir coordenadas UV por caras a coordenadas UV por vértice
    Por jor1980 en el foro Plugins y Scripts
    Respuestas: 4
    : 23-05-2009, 12:25
  5. Añadir un vertex a mi malla
    Por Gepetto en el foro Modelado
    Respuestas: 2
    : 15-03-2006, 22:35