Come posso ordinare le posizioni dei vertici in modo sequenziale gli indici in un'area chiusa?
Devo ordinare i vertici in sequenza per creare un effetto, qualcosa come questo video . So che dovrei disegnarli a mano, ma a volte quando suddivido i bordi, gli indici dei vertici cambiano.
I vertici nell'immagine sottostante sono corretti.

Ad esempio, i vertici nell'immagine sottostante sono ordinati in modo casuale. Puoi ordinarli in sequenza?

Ho provato a ordinarli lungo l'asse x o l'asse z, ma non ha funzionato.

Tieni presente che la tua soluzione dovrebbe funzionare per forme complesse:

Risposte
Ordinamento degli indici dei vertici.
Rispondi qui https://blender.stackexchange.com/a/36619/15543 mostra come ordinare gli indici dei vertici usando bmesh.
Rispondi qui Come ordinare un elenco di vertici in base alla posizione? in qualche modo mostra come camminare sui bordi per un ordine.
Per essere sicuri di camminare sui bordi come mostrato sopra fino a quando non si incontra nuovamente il primo vert (dato che è un loop) e usarlo per l'ordine. Lascerò a te il compito di ricostruire la sceneggiatura da ciò che è qui
Come dimostrato nella risposta di @ Leander
Percorso più breve
Utilizzando lo script da Qual è l'equivalente bmesh di bpy.ops.mesh.shortest_path_select ()? potrebbe selezionare il bordo come collegamento tra il primo e l'ultimo indice vert, rimuoverlo temporaneamente, trovare il percorso rimanente più breve (l'unico percorso) dai bordi due vert. Ripristina il bordo.
Ordine di avvolgimento del viso
Invece per un ciclo chiuso come sopra, contend può riempire con un ngon, usa i vertici della faccia ngon come ordine (l'ordine di avvolgimento) riordina i vert e rimuovi la faccia ngon creata.
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)
Seleziona un primo vert e in senso orario o antiorario
Per selezionare il vert zeroth e garantire l'indicizzazione in senso antiorario (dalla vista dall'alto)
Esegui in modalità di modifica, seleziona il vert che desideri avere come indice 0. Presume che la forma si trovi nel piano XY. Se la normale della faccia creata è rivolta verso il basso, l'avvolgimento viene ribaltato.

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)
- Aggiungi uno shapekey.
- In quello shapekey, posiziona i vertici che devono essere il primo e l'ultimo lontano l'uno dall'altro sull'asse x.
- Seleziona tutti gli altri (tra i vertici).
- Scegli W> Vertici smussati e imposta un numero elevato di iterazioni. I vertici verranno smussati.
- Ordinali per asse x. Mesh> Ordina elementi> Asse X.
- Elimina lo shapekey.

Usando Python, puoi camminare lungo i bordi e assegnare loro un nuovo indice.
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)
Senza uno script:
- V dividi la mesh al vertice che vuoi essere primo, se non lo è già.
- Intestazione> Menu Oggetto> Converti la mesh in una curva
- Modalità di modifica, menu di scelta rapida, cambiare la direzione della spline, se necessario
- Modalità oggetto, menu di scelta rapida, Converti di nuovo in mesh.

Non so perché Converti non sia nel menu di scelta rapida della modalità Oggetto per una mesh, è un po 'fastidioso.
Salvo perfezionamenti, come fornito da @Seyed, lo script sarebbe:
import bpy
bpy.ops.object.convert(target='CURVE', keep_original= False)
bpy.ops.object.convert(target='MESH', keep_original= False)