Come posso ordinare le posizioni dei vertici in modo sequenziale gli indici in un'area chiusa?

Aug 20 2020

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

11 batFINGER Aug 20 2020 at 15:08

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.

Ordine casuale, vert 22 selezionato, script sotto eseguito

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

4 Leander Aug 20 2020 at 18:58

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)
2 RobinBetts Aug 21 2020 at 15:45

Senza uno script:

  1. V dividi la mesh al vertice che vuoi essere primo, se non lo è già.
  2. Intestazione> Menu Oggetto> Converti la mesh in una curva
  3. Modalità di modifica, menu di scelta rapida, cambiare la direzione della spline, se necessario
  4. 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)