Creating a Ceremonial Armor Covered in Gemstones for Nodevember 2025
Erindale Woodford talked about the Ceremonial Armor project, detailing how he created the armor by making a custom node group, how he set up the gold by using curl noise, and how he deformed the curves and surfaces to add more detail.
Introduction
I'm Erindale, a Technical Director specialising in procedural workflows in Blender. While we don't quite have the prestige of a tool like Houdini, people shouldn't be overlooking what Blender has to offer. If you're interested in learning more, you can check out the YouTube Channel, online courses, or Discord server.
As part of Nodevember (the annual month-long art challenge for procedural artists), I wanted to really push what I could do with Blender's procedural modelling system, Geometry Nodes. The prompt for Day 8 was Bejewelled, and I chose to create some highly ornate, ceremonial plate armor covered with gold filigree and gemstones.
Creating this model relied on four advanced techniques: bi-rail loft, curl noise, deforming to curves, and deforming to surfaces. Everything else was simple selections and instancing.
The Armor
A bi-rail loft allows us to create mesh patches by sliding a profile curve along a pair of rail curves. As the rails get closer and further apart, the profile curve will scale. In my case, I created a custom node group to support this that could also ingest multiple profile curves that would be interpolated along the loft.
This method allowed for a lot of fine control over the contours of what is a fairly complicated surface for the waist, chest, and neck pieces. The arms were much simpler, being tapered cylinders, the shoulders are just a series of extrusions, the collar is a circle lofted along a single curve, and the chain mail base mesh is a pair of icospheres.
The chest piece was created using a pair of rails made up of smaller curve segments and four profile curves that were interpolated across the loft. Using Blender 5.0's new Closure system, we're able to inject a custom float curve into the Bi-Rail Loft node group to adjust where the profiles are mixed in.
Curl Noise
We can create decorative curls of geometry by extruding an edge through a noise field, using the noise output as the extrusion direction. If we have a bunch of points in different places being extruded, then we can visualise the noise field, but an alternative approach is to use multiple points in the same location that each sample a very slightly different noise, either by varying the scale or seed. This results in pretty clumps that we can mesh into leaf motifs.
By selecting bands of geometry from the base meshes, we're able to flood fill with curl noise over larger areas, like here on the shoulders. The direction of the curl noise is the cross product of the noise texture against the surface normal. This made the curls grow across the surface. Anything that extends beyond the edges is simply removed from the extrusion boolean, so it stops growing.
When we create curves from a single point with a slight noise offset, we can create something very decorative, and when mirrored, it appears even more intentional. This was the process used on the additional embellishments as well as the decorations on the brooches.
To create this effect we can set up the nodes like this:
Deforming to Curves
Rather than just instancing an object along a curve, sometimes we want to do a more complex bend where the object is deformed to follow the tangent and normal of a curve. In our case, because we have gone to the trouble of lofting these complex surfaces, it makes sense that we would have our larger embellishments work with that form rather than despite it. For example, the secondary layer of gold curl noise that runs around the edges of the steel follows curves extracted from the main geometry:
The gold itself is just small sections of curl noise that have been mirrored and then instanced in a straight line. That line of gold is then deformed to a curve extracted from the base mesh.
How can we deform something into a curve, though? If we think of our geometry as existing in standard 3D space along 3 linear axes XYZ, what we want to do is convert that to fit the curve's U-axis (along the curve), the Normal axis, and the Bi-Normal axis.
In Geometry Nodes, this is a fairly simple conversion. Using a bounding box, we can normalise the 3D coordinates of our geometry to 0-1 ranges in each axis. Then, using a Sample Curve node, we can sample the position of the curve based on one of our original axes.
This will move all our geometry to a line along the curve. We then need to re-inflate this by adding each of the other axes' amounts scaled into the normal and bi-normal directions. The nodes could look like this:
Deforming Surfaces
One level above a curve deformation would be a surface deformation, or Mesh Wrapping. In this case, we have some geometry laid out in 2-dimensions which we want to wrap around some 3-dimensional surface. This can be extremely useful when we have some complex pattern that is easier to build flat, and some 3D form that is easier to build with simple geometry. The example will be our Gambeson collar:
In this case, creating the quilting design and adding the stitching is much easier done flat on the XY plane, but creating something that looks like it would fit along a neck is something much easier to do with a Curve to Mesh node controlling the radius of a circle along a spline.
Our base mesh for the collar is exactly that, and we can take advantage of both easy options if we know how to bend a flat pattern onto a 3D surface. We will abuse UV coordinates to make this happen.
If we're working largely in the XY plane, then it makes sense that we could remap whatever positions we have to be within a 0-1 space for each axis. This would then make it easy to map this geometry onto the UVs of a 3D object. Our geometry, while laid out flat, still has some thickness, so we need to inflate it by using our Z component as a scalar for the surface normal.
That way, we can stretch the geometry into the UV surface and then thicken it in the correct direction. Our flat collar geometry looks like this:
If we use the Sample UV Surface nodes to sample the position of the base mesh as well as the normal, then we can move this geometry into position:
For fabric, we can also add some creases and crumples, which is something I prefer to do after it's in position to avoid the noise texture obviously following the deformation. I use one noise based on the UV map to follow the surface, and one based on world position to give general deformation.
For a deeper look at the full modelling process, check out the time-lapse here:
Conclusion
You can also download the project file for free on Patreon. I have been using Geometry Nodes almost daily since it appeared as an experimental feature in Blender 2.91 Beta in November 2020. I have been blown away with every release at the amount of improvement we've seen both in performance as well as the range of nodes being added, and still being added.
I accept that this armor model could have been made more efficiently and more realistically using a more blended approach rather than pure nodes, but that wouldn't really be in the spirit of Nodevember.