Cómo devolver la extrusión al original

Aug 21 2020

¿Cuál es la mejor forma de recuperar la extrusión que le ha realizado a su objeto?

Lo anterior es solo un ejemplo, pero debería describir el caso. Y no estoy buscando una respuesta como: dibuja una nueva esfera. Además, "deshacer ( Ctrl+ Z)" no es una opción (notó el error de diseño demasiado tarde).

Hasta ahora he encontrado dos opciones:

  1. Selecciono todas esas caras y las elimino. Pero luego tengo un agujero en mi esfera. Puedo llenar la tapa con Fo Alt+ F, pero la superficie ya no es la misma.

  2. Otra opción que me viene a la mente es bajar esto lo suficientemente cerca de la superficie y luego usar vértices de fusión. Pero entonces esos dos vértices en el medio de esas seis caras no se derriten en ninguna parte y, de nuevo, la superficie no parece correcta.

Respuestas

4 batFINGER Aug 22 2020 at 00:37

Versión de script.

Desextruir a lo largo de las normales de la cara

  • Encuentra el promedio normal de todas las caras seleccionadas.
  • Calcula la longitud de borde promedio de los bordes extruidos.
  • Traduce todos los vértices hacia atrás
  • Elimina dobles. (Desde los bordes colapsados)

En el modo de edición, seleccione las caras y luego ejecute el 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)

Notas

Una mejora sería encontrar todas las islas de caras seleccionadas dentro de la selección y "eliminarlas" en una isla por isla.

Se trata de "destruir" una extrusión a lo largo de la cara normal. En lugar de la cara promedio normal, el vector definido por cualquiera (o un promedio de todos) los bordes sería un mejor ajuste.

Desextruir en cualquier dirección

Después de extruir los bordes extruidos creados, todos (AFAIK) serán el vector de extrusión.

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)

Se agregó una prueba a Suzanne. La eliminación de dobles tiene el efecto de anular la selección de una cara dependiendo de qué vert de borde se eliminó ... tener un script actualizado para restaurar la selección

8 RobinBetts Aug 21 2020 at 03:50

Esta es una extrusión uniforme, sin escala. Entonces..

  • Alt-Seleccione el anillo de caras generadas, Xborrarlos
  • Hover - Lseleccione el parche aislado
  • Con Snap configurado en 'Vertex', 'Active', todo el parche seleccionado y un vértice conveniente activado, simplemente Gvuelva a colocar el parche en su lugar.
  • Todas las verts seleccionadas, Mfusionar> Por distancia.
5 moonboots Aug 21 2020 at 22:08

Elimine la extrusión, seleccione el bucle del borde del agujero, presione CtrlF> Relleno de cuadrícula , llenará el agujero y respetará la topología (puede ajustar algunos parámetros en el cuadro Operador ):

3 RonJensen Aug 21 2020 at 03:57
  1. Establecer la orientación de transformación en "Normal"
  2. Seleccionar parche de cara extruido
  3. Presione Gpara agarrar y Zrestringir a la dirección normal
  4. Haga todo lo posible para devolver el parche facial a su posición original (Snap debería ayudar, pero nunca puedo hacer que funcione para mí)
  5. Fusiona los vértices por distancia.