Comment retourner l'extrusion à l'original
Quelle est la meilleure façon de récupérer l'extrusion que vous avez effectuée sur votre objet?
Ci-dessus n'est qu'un exemple, mais devrait décrire le cas. Et je ne cherche pas de réponse comme: dessiner une nouvelle sphère. De plus, "annuler ( Ctrl+ Z)" n'est pas une option (a remarqué l'erreur de conception trop tard).
Jusqu'à présent, j'ai trouvé deux options:
Je sélectionne tous ces visages et les supprime. Mais ensuite, j'ai un trou sur ma sphère. Je peux remplir le bouchon par Fou Alt+ F, mais la surface n'est plus la même.
Une autre option qui me vient à l'esprit consiste à abaisser cela suffisamment près de la surface, puis à utiliser la fusion des sommets. Mais alors ces deux sommets au milieu de ces six faces ne se fondent nulle part, et là encore, la surface ne semble pas correcte.
Réponses
Version script.
Annuler l'extrusion le long des normales de face
- Recherche la normale moyenne de toutes les faces sélectionnées.
- Recherche la longueur d'arête moyenne des arêtes extrudées.
- Retraduit tous les sommets
- Supprime les doubles. (À partir des bords réduits)
En mode édition, sélectionnez les faces, puis exécutez le 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)
Remarques
Une amélioration serait de trouver tous les îlots de face sélectionnés dans la sélection et «non-extrudés» sur une base d'île par île.
C'est "sans extrusion" une extrusion le long de la face normale. Au lieu de la normale de face moyenne, le vecteur défini par l'une des arêtes (ou une moyenne de toutes) conviendrait mieux.
Toute direction de désextrusion
Après l'extrusion, les bords extrudés créés seront tous (AFAIK) le vecteur d'extrusion.
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)
Il s'agit d'une extrusion uniforme, sans mise à l'échelle. Donc..
- Alt-sélectionnez l'anneau des faces générées, Xsupprimez-les
- Survolez - Lsélectionnez le patch isolé
- Avec Snap réglé sur «Vertex», «Active», tout le patch sélectionné et un sommet pratique rendu actif, il suffit de Gremettre le patch en place.
- Tous les verts sélectionnés, Mfusionner> Par distance.
Supprimez l'extrusion, sélectionnez la boucle du bord du trou, appuyez sur CtrlF> Remplissage de la grille , cela remplira le trou et respectera la topologie (vous pouvez modifier certains paramètres dans la case Opérateur ):
- Définissez l'orientation de la transformation sur "Normal"
- Sélectionnez un patch facial extrudé
- Appuyez Gpour saisir et Zcontraindre dans la direction normale
- Faites de votre mieux pour ramener le patch facial à sa position d'origine (Snap devrait aider, mais je ne peux jamais le faire fonctionner pour moi)
- Fusionner les sommets par distance.