I am trying to make an object like this lance: 1

however am having a hard time wrapping my head around how to approach it. My initial attempt involved using a weave heightmap on a cylinder then tapering it in:


While I did manage to remove the seam that the technique created initially, the attempt is ultimately unfruitful since the flows are bad, edges are jagged even at 10 minion polygons, and most importantly continuing the bands past the point where the cylinder ends would be almost impossible to do cleanly at this density. I'm currently looking to imitate the approach the artist of the original image took, which I assume was using curves with a profile snapped onto the surface of a cone. And here is where I am currently facing difficulties due to the fact that, while I could just twist an array of curves on Z to get the spiral effect then taper it using the simple deform modifier, adding the weave effect on top of that has me beat at the moment. Any advice is welcome.


1 Answer 1


Woven Sleeve with Geometry Nodes

I used geometry nodes to create a woven sleeve of curves. This could be a good jumping off point to create the woven lance in the image you shared.

enter image description here

Create Strands

Start by creating eight strands. Each strand is a Mesh Line with three verts. The strands are instanced on a Mesh Circle with eight verts. Use a Realize Instances node to give the geometry of the strands.

create strands

Twist Strands By a Quarter Turn

We want the tops of each strand to end up one quarter turn away from the base. Use a Vector Rotate node to rotate the Position attribute. Use the Z component of the position as a factor for the rotation. Our strands are one unit tall, so the quarter turn will be complete at their tops.

Note that rotations are in radians so a quarter turn is pi / 2 which you can type into Blender and it knows what you mean.

twist strands by quarter turn

Create Opposite Direction

Create the strands for the opposite direction by using a Transform Geometry node with the X value set to -1.0. Give it some rotation too so that the new strands are offset from the original ones. Join the transformed geometry up with the un-transformed geometry. Also use a Capture Attribute node at this point to grab a boolean indication of which direction each strand is. Traditionally in weaving these directions are known as warp and weft.

opposite direction

Weave Strands with Trig Functions

Use Math nodes set to Sine and Cosine to wiggle the strands as they travel up the Z axis. The offset for the sine/cosine wave for each direction is controlled separately using a Switch node and the the warp vs weft indicator that we set up in the last step. These offsets require some tweaking once the whole structure is assembled to get the strands to actually look woven together.

wiggle with trig funcs

Duplicate Up and Smooth

Up until now we've been working with one chunk of the sleeve. Use an Instance on Points Node to copy the chunk onto each vert of a Mesh Line.

duplicate up and smooth

Bevel The Curve

Use a Curve to Mesh node with a Curve Circle as the Profile Curve input to give the strands thickness. The Curve Circle can be transformed to make the strands look more like ribbons than noodles. You'll notice that the tilt is off at this point.

without tilt

Set Curve Tilt

Use the Z component of the Position Attribute to set the tilt. This takes some tweaking to get it to look right. Use the boolean weft vs warp indicator that we set up earlier along with a Switch node to set the tilt for each direction individually.

finished weave


The weave in the reference looks a little more stretched so multiply the Z component of the Position attribute by some value to stretch the whole structure.

stretched weave

Here are the exact input settings that worked for me that aren't seen in the other screenshots.

geometry nodes modifier input settings for weave

  • $\begingroup$ Thank you for such a well-formed answer. Nicely done :) $\endgroup$
    – Robin Betts
    Commented Oct 1, 2023 at 11:30
  • $\begingroup$ Thank you for the kind words @RobinBetts ! $\endgroup$ Commented Oct 2, 2023 at 20:13

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .