¿Cómo puedo ordenar las posiciones de los vértices secuencialmente índices en un área cerrada?

Aug 20 2020

Necesito ordenar los vértices secuencialmente para hacer un efecto, algo como este video . Sé que debería dibujarlos a mano, pero a veces, cuando subdivido bordes, los índices de vértices cambiarán.

Los vértices de la imagen de abajo son correctos.

Por ejemplo, los vértices en la imagen de abajo se ordenan al azar. ¿Puedes ordenarlos secuencialmente?

Intenté ordenarlos a lo largo del eje x o el eje z, pero no funcionó.

Tenga en cuenta que su solución debería funcionar para formas complejas:

Respuestas

11 batFINGER Aug 20 2020 at 15:08

Ordenar índices de vértices.

Responde aqui https://blender.stackexchange.com/a/36619/15543 muestra cómo ordenar índices de vértices usando bmesh.

Responda aquí ¿Cómo ordenar una lista de vértices según la posición? va de alguna manera para mostrar cómo caminar por los bordes de un pedido.

Para estar seguro, caminará por los bordes como se muestra arriba hasta que se vuelva a encontrar el primer vértice (ya que es un bucle) y use esto para el pedido. Dejaré que usted reconstruya el guión de lo que está aquí.

Como se demostró en la respuesta de @ Leander

Trayectoria más corta

Usando el script de ¿Cuál es el equivalente de bmesh a bpy.ops.mesh.shortest_path_select ()? podría seleccionar el borde como enlace entre el primer y el último índice vertical, eliminarlo temporalmente, encontrar la ruta restante más corta (la única ruta) de los bordes dos verts. Reinstale el borde.

Orden de bobinado frontal

En lugar de un bucle cerrado como el anterior, contend puede rellenarse con un ngon, use los ngon face verts como orden (el orden de bobinado), vuelva a clasificar los verts y elimine la ngon face creada.

import bpy
import bmesh

ob = bpy.context.object
assert ob.type == "MESH"
me = ob.data

bm = bmesh.from_edit_mesh(me)

f = bmesh.ops.contextual_create(
        bm,
        geom=bm.verts[:] + bm.edges[:],
        )["faces"][0]

for i, v in enumerate(f.verts):
    v.index = i
bm.verts.sort()
bm.faces.remove(f)

bmesh.update_edit_mesh(me)

Seleccione un primer vert y en el sentido de las agujas del reloj o en sentido contrario

Para seleccionar el cero vertical y asegurar la indexación en sentido antihorario (desde la vista superior)

Ejecutar en modo de edición, seleccione el vert que desea tener índice 0. Asume que la forma se encuentra en el plano XY. Si la normal de la cara creada apunta hacia abajo, el devanado se invierte.

Orden aleatorio, vert 22 seleccionado, secuencia de comandos a continuación ejecutar

import bpy
import bmesh
from mathutils import Vector

ob = bpy.context.object
assert ob.type == "MESH"
me = ob.data

bm = bmesh.from_edit_mesh(me)
v0 = bm.select_history.active
f = bmesh.ops.contextual_create(
        bm,
        geom=bm.verts[:] + bm.edges[:],
        )["faces"][0]

fverts = f.verts[:]

if f.normal.dot((0, 0, 1)) < 0:
    fverts.reverse()

for i, v in enumerate(fverts):
    v.index = i
    if v is v0:
        iv0 = i

for v in fverts:
    v.index = (v.index - iv0) % len(fverts) 
    
bm.verts.sort()

bm.faces.remove(f)

bmesh.update_edit_mesh(me) 
6 Leander Aug 20 2020 at 14:33
  1. Agrega una clave de forma.
  2. En esa clave de forma, coloque los vértices que van a ser el primero y el último lejos uno del otro en el eje x.
  3. Seleccione todos los demás (entre vértices).
  4. Elija W> Suavizar vértices y establezca un recuento alto de iteraciones. Los vértices se suavizarán.
  5. Ordénelos por eje x. Malla> Ordenar elementos> Eje X
  6. Elimina la clave de forma.

4 Leander Aug 20 2020 at 18:58

Con Python, puede recorrer los bordes y asignarles un nuevo índice.

import bpy
import bmesh

me = bpy.context.object.data
bm = bmesh.from_edit_mesh(me)

# index of the start vertex
initial = bm.verts[0]

vert = initial
prev = None
for i in range(len(bm.verts)):
    print(vert.index, i)
    vert.index = i
    next = None
    adjacent = []
    for v in [e.other_vert(vert) for e in vert.link_edges]:
        if (v != prev and v != initial):
            next = v
    if next == None: break
    prev, vert = vert, next

bm.verts.sort()

bmesh.update_edit_mesh(me)
2 RobinBetts Aug 21 2020 at 15:45

Sin guión:

  1. V divide la malla en el vértice que quieres que sea el primero, si aún no lo está.
  2. Encabezado> Menú Objeto> Convertir la malla en una curva
  3. Modo de edición, menú contextual, cambiar la dirección de la spline, si es necesario
  4. Modo de objeto, menú contextual, Convertir de nuevo a malla.

No sé por qué Convert no está en el menú contextual del modo Objeto para una malla, eso es un poco molesto.

Salvo los refinamientos, según lo proporcionado por @Seyed, el script sería:

import bpy
bpy.ops.object.convert(target='CURVE', keep_original= False)
bpy.ops.object.convert(target='MESH', keep_original= False)