¿Cómo puedo ordenar las posiciones de los vértices secuencialmente índices en un área cerrada?
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
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.

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)
- Agrega una clave de forma.
- 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.
- Seleccione todos los demás (entre vértices).
- Elija W> Suavizar vértices y establezca un recuento alto de iteraciones. Los vértices se suavizarán.
- Ordénelos por eje x. Malla> Ordenar elementos> Eje X
- Elimina la clave de forma.

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)
Sin guión:
- V divide la malla en el vértice que quieres que sea el primero, si aún no lo está.
- Encabezado> Menú Objeto> Convertir la malla en una curva
- Modo de edición, menú contextual, cambiar la dirección de la spline, si es necesario
- 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)