- edited description
UPDATED PROCEDURE:
After exploring geometry nodes for a few months, I’ve returned to this issue and refined my workflow. The old caveats below still apply.
Consult #923 for a basic overview of how geometry nodes work and the terminology involved.

The geograft source is stored in its own collection. It is parented to the armature but has no armature modifier. The geograft data will be cloned and procedurally added to the figure’s mesh, so the source mesh doesn’t need to be visible and won’t be deformed by the armature. It'll be grafted to the figure in its A-pose, before the armature modifier is processed, so their origins need to match but that’s it. You’ll also need to do the usual steps of importing custom morphs and transferring shape keys, as if you were merging geografts, but since those are controlled by the figure’s drivers they don’t need a strict hierarchy.
Both the figure and the geograft need a vertex group containing the edge vertices that will be welded. Since geometry nodes use a name lookup they should have the same name for convenience. The figure needs another vertex group containing the area that will be deleted. Also create an attribute for a Vertex Table. If we want to perform operations on the mesh after the geografts are applied we’ll need a cached copy of the vertex indices.
I hoped to divorce the geograft from the figure completely, so geografts can be swapped without adjusting the underlying model. Unfortunately due to the current limitations of geometry nodes I wasn’t able to achieve this. If a geograft has its own bones, then you need to copy the vertex groups over to the figure so the armature deformation works. You don’t need to assign any vertices to them; all you need is an empty group with the same name and they’ll be automatically populated when the geometry nodes are evaluated.
This time I left the geograft’s custom bones attached to the Rigify armature.
Then create this node network. Geometry nodes change the structure of a mesh, so the Capture Attribute node allows you to cache its state and refer back to it later. The topmost capture node stores the original vertex indices (as indicated by the Index node plugged into it) and then sends them directly to the output, where they’re put inside the Vertex Table attribute we created. The bottom two cache the vertex groups from the figure and the geograft source mesh that contain the edges to be welded. Since we gave both the same name, we only need to expose one field on the modifier. They’re then or’d together with a Boolean math node and slotted into the Merge by Distance node so only the edges are welded together.
I haven’t had a chance to test this procedure extensively, but I haven’t noticed any unusual ripping or distortion so far.
ORIGINAL POST:
Following on from #862 I explored whether geometry nodes could be used to make non-destructive geografts and the preliminary results are looking good.
Here is RawArt’s Twi’lek for G8M with a non-destructive geograft for the tentacles.
First I created a vertex group to isolate the geograft area on the G8M mesh, then fed that into the geometry node modifier as an attribute. I hid the geograft source in the scene tree and used the following node setup to nondestructively remove the back of the G8M’s head and instance the Twi’lek tentacles in its place. This uses the 3.1 beta which has a new Merge by Distance node to solve the issues with the weld modifier I mentioned in #862.
I separated the tentacle armature from the base G8M skeleton. Since the tentacle bones were parented to the figure’s head bone I used a Child Of constraint to make the tentacle armature follow the Genesis skeleton.
I attempted to verify that shape keys will transfer over from the geograft source to the combined geometry but the exporter refused to load the tentacle morphs even when I started over from scratch. The system console had this to say:
Making morphs
* Tip Point
Making missing morphs level 0
Building drivers
Building sum drivers
+ Left_13
+ Left_14
+ Right_13
+ Right_14
No rest drivers
Folder loaded in 0.017 seconds
Did not find fingerprint 3430-6843-3414
However when I created a custom shape key on the geograft source it transferred over to the joined mesh without issue:
Using this workflow I completely isolated the geograft from the G8M armature and base mesh. Not only will this let morphs be loaded alongside geografts it’s also useful for sequential art (i.e. to show transformations or wounds) without needing to build separate figures. The geometry nodes can be applied non-destructively like any other modifier. And due to the node-based workflow you can (in theory) chain multiple geografts inside a single geometry node modifier and control them all by exposing parameters.
Caveats:
- Viewport performance is dreadful. Right now it’s better to keep the geograft mesh visible in the viewport and hidden in the render, and vice versa for the geometry node setup. That way the geografting is only applied at render time.
- As mentioned in
#862every material needs to use an Attribute node for the UV coordinates instead of the Texture Coordinate or UV Map node. The Merge by Distance node caused some other dense areas of the body to also merge unless the threshold is extremely low. I believe this can be fixed by using a vertex group to create a selection that isolates the effect but I’m still puzzling out the whole attribute system.- The geometry node modifier must come before the armature modifier. The geometry needs to be merged in the A-pose or else the vertices can tear apart during posing as they cross the merge by distance threshold.
After more experiments I’ve improved my workflow for geografts. The above node setup will theoretically allow you to create any geograft but it’s very confusing to get your head around at first.
In the geograft modifier add a Capture Attribute node before the Delete Geometry node. This will “freeze” the state of the geometry and allow us to use it later. The Index node plugged into Capture Attribute tells Blender what kind of data we’re interested in. Pass the frozen state data out of the geonode setup and in the modifier stack assign the Vertex Table attribute we created to that field.
In the morph modifier create an input field for the Vertex Table and feed it into a Switch logic node. If the geograft isn’t active then using the Vertex Table will result in its own mesh distortion since the vertex order won’t match. So this Switch is hooked up to the driver I made to control the geograft visibility. When it’s active the meshes use Vertex Table. When it’s not active the meshes use their own indices. Plug the index output into the two Transfer Attribute nodes. We now have a vertex table allowing us to morph the base mesh vertices as if there was no geograft.
or too many vertices merge - hope you can see the distortion.
I played with the Distance option, but it seams like the the snapping-resolution is not enough. so more vertices than wanted merge. ‘Use Limit Surface’ for the Subdivision modifier makes it less obvious, but there’s still a notable separation in between.
Just wondering - that’s just the way GeoNodes works (i.e. no real merging) or have I done


Simply copy the vertex-positions of the morphed Figures Edge over to the morphed GeoGraft Edge does the job
)
and no Mannequin Mesh is created (only an empty Collection).
Geonode setup of Fulalicious (I am testing by trying to join FullMontyBBQ over Futalicious)
Right not you can see that I export Vertex Delta from FullMontyBBQ, but I don’t know how to import that in Futalicious node so I just replicate the Vector math again.
Sadly the same trick isn’t working for displacement.
Thomas: You might even consider another Finalize Button, to create the Merged Mesh object (a Makro):