Proposal: Native "Duplicate with Modifiers Applied" / "Create Mesh Snapshot"
Problem & Workflow Bottleneck
Currently, duplicating an object at a specific point in time with all its modifiers pre-applied is unnecessarily tedious.
For instance, when working with a Cloth Simulation , Geometry Nodes setup , or complex Deformation Modifiers , an artist often needs to freeze a mesh at a specific frame and duplicate it as a static snapshot.
To achieve this natively, users currently have to go through multiple manual steps (e.g., duplicating the object, converting to mesh via
Object > Convert > Mesh
, or manually applying and removing modifiers on the copy), which breaks the flow and disrupts non-destructive setups.
Proposed Solution
Add a dedicated operator in the
Object Menu
alongside
Duplicate Objects
(
Shift+D
) and
Duplicate Linked
(
Alt+D
), such as
Duplicate with Modifiers Applied
(or
Create Mesh Snapshot
).
-
Location:
Object > Duplicate > Duplicate with Applied Modifiers - Behavior: It duplicates the selected object(s) at the current frame using the evaluated mesh state (freezing physics, procedural nodes, and deformation modifiers into static geometry) while leaving the original object completely untouched.
Why This Matters
This simple quality-of-life feature bridges a major gap for:
- 3D Artists & Animators: Easily grabbing frozen frames from physics simulations (cloth, soft bodies, particles) without destroying the sim setup.
- Procedural/Geometry Nodes Designers: Quick snapshotting of procedural assets into static meshes for exporting or manual sculpting.
- Environment Designers: Scattering assets and baking specific instances into static meshes on the fly.
Technical Proof of Concept (Python API)
To demonstrate how straightforward this logic is, a basic proof-of-concept can already be implemented using Blender's evaluated dependency graph and
bpy.data.meshes.new_from_object()
:
import bpy
def create_mesh_snapshot(context, obj):
# Get evaluated mesh at current frame
depsgraph = context.evaluated_depsgraph_get()
obj_eval = obj.evaluated_get(depsgraph)
# Extract static mesh from evaluated state
frame = context.scene.frame_current
new_mesh = bpy.data.meshes.new_from_object(
obj_eval,
preserve_all_data_layers=True,
depsgraph=depsgraph
)
new_mesh.name = f"{obj.data.name}_Snapshot_F{frame}"
# Create new static object
new_obj = bpy.data.objects.new(f"{obj.name}_Snapshot_F{frame}", new_mesh)
new_obj.matrix_world = obj.matrix_world.copy()
# Link to current collection
context.collection.objects.link(new_obj)
return new_obj
1 Comment
Visual Geometry to Objectscommand does exactly this.docs.blender.org/manual/en/latest/scene_layout/object/editing/apply.html