Come riportare l'estrusione all'originale
Qual è il modo migliore per recuperare l'estrusione che hai eseguito sul tuo oggetto?

Sopra è solo un esempio, ma dovrebbe descrivere il caso. E non sto cercando una risposta come: disegna una nuova sfera. Inoltre "undo ( Ctrl+ Z)" non è un'opzione (notato l'errore di progettazione troppo tardi).
Finora ho trovato due opzioni:
Seleziono tutte quelle facce ed elimino. Ma poi ottengo un buco nella mia sfera. Posso riempire il tappo con Fo Alt+ F, ma la superficie non è più la stessa.
Un'altra opzione che mi viene in mente è abbassare questo valore abbastanza vicino alla superficie e quindi utilizzare i vertici di unione. Ma poi quei due vertici al centro di quelle sei facce non si sciolgono da nessuna parte, e di nuovo la superficie non sembra corretta.
Risposte
Versione script.

Annulla estrusione lungo le normali delle facce
- Trova la normale media di tutte le facce selezionate.
- Trova la lunghezza media del bordo dei bordi estrusi.
- Traduce tutti i vertici all'indietro
- Rimuove i doppi. (Dai bordi collassati)
In modalità di modifica selezionare le facce, quindi eseguire lo script.
import bpy
import bmesh
from mathutils import Vector
ob = bpy.context.object
me = ob.data
bm = bmesh.from_edit_mesh(me)
faces = [f for f in bm.faces if f.select]
verts = set(v for f in faces for v in f.verts ) # or from selected verts
edges = [e for v in verts for e in v.link_edges
if not e.select ]
norm = (sum((f.normal for f in faces), Vector()) / len(faces)).normalized()
norm.negate()
d = sum(e.calc_length() for e in edges) / len(edges)
bmesh.ops.translate(
bm,
verts=list(verts),
vec=d * norm,
)
bmesh.ops.remove_doubles(
bm,
verts=[v for e in edges for v in e.verts],
dist=1e-5,
)
for f in faces:
f.select_set(True)
bmesh.update_edit_mesh(me)
Appunti
Un miglioramento consisterebbe nel trovare tutte le isole facciali selezionate all'interno della selezione e "unextrude" isola per isola.
Questo è "unextruding" un'estrusione lungo la normale faccia. Invece della normale faccia media, il vettore definito da uno qualsiasi (o una media di tutti) i bordi sarebbe un adattamento migliore.
Qualsiasi direzione si disestrude

Dopo l'estrusione, i bordi estrusi creati saranno (AFAIK) tutti il vettore di estrusione.
import bpy
import bmesh
from mathutils import Vector
ob = bpy.context.object
me = ob.data
bm = bmesh.from_edit_mesh(me)
faces = [f for f in bm.faces if f.select]
verts = set(v for f in faces for v in f.verts ) # or from selected verts
edges = [e for v in verts for e in v.link_edges
if not e.select ]
v0, v1 = sorted(edges[0].verts[:], key=lambda v:v.select)
bmesh.ops.translate(
bm,
verts=list(verts),
vec=v0.co - v1.co,
)
bmesh.ops.remove_doubles(
bm,
verts=[v for e in edges for v in e.verts],
dist=1e-5,
)
for f in faces:
f.select_set(True)
bmesh.update_edit_mesh(me)

Questa è un'estrusione uniforme, senza ridimensionamento. Così..
- Alt-seleziona l'anello delle facce generate, Xcancellale
- Passaggio del mouse: Lseleziona la patch isolata
- Con Snap impostato su "Vertex", "Active", l'intera patch selezionata e un comodo vertice reso attivo, basta Grimettere la patch in posizione.
- Tutti i vertici selezionati, Munisci> Per distanza.
Elimina l'estrusione, seleziona il loop del bordo del foro, premi CtrlF> Riempimento griglia , riempirà il foro e rispetterà la topologia (puoi modificare alcuni parametri nel riquadro Operatore ):

- Imposta l'orientamento della trasformazione su "Normale"
- Seleziona toppa faccia estrusa
- Premere Gper afferrare e Zper vincolare alla direzione normale
- Fai del tuo meglio per riportare il cerotto nella sua posizione originale (Snap dovrebbe aiutare, ma non riesco mai a farlo funzionare per me)
- Unisci i vertici per distanza.