Procedural Curves in 3.0 and Beyond

Developer Hans Goudey shares the results of the geometry nodes curve project, and future goals.

Adding a procedural curve editing pipeline in 3.0 has been a large focus for the geometry nodes team and community for the past few months. One of the last larger changes for 3.0, supporting the geometry nodes modifier on curve objects, was committed a few days ago. So I thought it would be a good idea to give an update on the project. Where are we, and what does the future hold?

Just like curve objects, three curve types are supported in geometry nodes:

  • Bezier With control points handles, and handle types, each editable as separate attributes
  • Poly A simple series of connected points
  • NURBS A more advanced spline type with different controls exposed
The current built-in attributes on curve data
The current built-in attributes on curve data

The New Nodes

One of the fundamental ideas of the changes is that it should be clearer when data is a curve and when it is a mesh. Currently Blender doesn’t distinguish very well between the two, because it implicitly changes a curve into a mesh. But we can take advantage of the flexibility of nodes to make the process much more visible.

That flexibility means that now any object that supports geometry nodes can output curve data, not just curve objects!

Curve to Mesh

The curve to mesh node with 16 profile splines
The curve to mesh node with 16 profile splines

This node is the counterpart of the existing “Curve Bevel”, except that the node can accept multiple input profiles, and automatically marks sharp edges.

Curve Fill

The fill node creates a 2D mesh from curves, filling the inside with faces. It was contributed by Erik Abrahamsson, building on the triangulation library built by Howard Trickey for exact boolean. It’s the counterpart to the existing 2D curve fill in 2.93, but it should give better, more predictable results.

Curve Trim

The curve  trim and fill nodes used on curve splines from text characters
The curve trim and fill nodes used on curve splines from text characters

The trim node makes curve splines shorter, with a length or factor input. The node was contributed by Angus Stanton.

Curve to Points

This node generates a point cloud with evenly spaced points on the curve, generating the data needed for instancing like rotation.

Curve Endpoints

Also contributed by Angus Stanton, this node is a simpler counterpart to the curve to points node that only outputs the start and end of each spline.

Resample Curve

Drawing clouds with the points to volume node
Drawing clouds with the points to volume node

This node outputs a new curve, sampling consistent lengths from the input. This is just like the curve to points node, except the output is still a curve.

Curve Subdivide

Like the resample curve node, this node makes a higher resolution curve, but it keeps the original spline type, and doesn’t change the shape at all for Bezier curves. Each segment can have its own number of cuts.

Mesh to Curve

Blender hasn’t had the ability to create a curve from mesh edges procedurally before. Now it does! With a selection input, any of a mesh’s edges can be turned into curve splines, and any extra attributes will be automatically transferred.

Handle Type Nodes

This node procedurally change the left or right handle types of Bezier control points.

Set Spline Type

Suddenly the star primitive gets much more interesting!
Converted to a Bezier spline type with auto handles.
Suddenly the star primitive gets much more interesting!

Contributed by developer Johnny Matthews, this node changes each spline’s type between the Bezier, poly, and NURBS types mentioned above, just like the edit mode operator.

Curve Reverse

Also created by Johnny, this is a simple node that switches the direction of a curve, just like in edit mode.

Curve Length

Another simple node to output a curve’s total length. Created by Johnny as well, who shared it on his YouTube channel.

Primitives

The defaults for each curve primitive node
The defaults for each curve primitive node

Just like the existing mesh primitive nodes, there are now curve primitive nodes, again by Johnny Matthews. These provide a surprisingly useful and flexible base for both 2D and 3D contexts. Many of the nodes have options for different input methods, like finding the circle that passes through three points in space.

The Internals

Curve support in geometry nodes has also provided an opportunity to significantly improve the internals of the curve code. A large portion of the existing curve code in Blender dated back to the it’s initial open source commit, 19 years ago! While that’s not a problem in itself, standard good practices of software development have changed a lot in that time, and it was often confusing and hard to work with. Existing curve data in Blender also didn’t support storing generic attributes, which is essential for geometry nodes.

With the aim of replacing most of the existing code, we created a new implementation for the basics of curves, designed to be more efficient, much easier work with, and properly documented. Already this has been worth it; with an improved foundation we could make progress much more quickly than I expected!

Conclusions

Personally I’ve been interested in curves since I started working on Blender two years ago, so I’ve been happy to take on such a specific area and push it forward for a while. Five months actually– I’ve been very invested in the project, so time has really flown by!

I want to thank the community of developers contributing to this project who made it a joy to work on, and Jacques Lucke for the consistent advice.

The Future

What we have now should already be a solid base of features for 3.0, but more is planned for the near future:

  • Curve Fillet Bevel-like behavior in a node from Dilith Jayakody’s 2021 GSoC project.
  • Connect Splines A node to join multiple sections of a curve into one.
  • Curve Parameter A field input node, to output how far along the curve each point is.
  • More complete attribute support: Transfer attributes in the curve to mesh node, expose the handle position attributes.
  • Curve sampling with any arbitrary factor.
  • Convert more of the features from curve objects into nodes.
  • And much more! Now that the project is mostly wrapping up, the developer community will be essential in adding new features.

Further in the future, these changes can be applied to curve edit mode as well. Editing and painting custom attributes will be particularly important.

28 comments 13,006 Views
  1. Very interesting read.

    It’s nice to know that it was a team effort between core dev and community dev 🙂

    Can’t wait to try those out.

    Thx a lot 🙂

  2. The biggest problem with “3D” curves in Blender is still tilting, extrusion and bevel artifacts. Also with 2D curves. Probably the best example is a crazy Möbius Curve. I could swear that other 3D applications I used some decades before solve these problems better. Not perfect but much, much better than Blender. So it’s just a little idea .. Perhaps in this case Blender should think about fundamental changes in terms of curves .. Before it may be very difficult to do new things later in Geometry nodes. This is just my observation and experience.

    • Did you not read the post before you bothered to comment?
      They have already rewrote the entire underlying curves implementation that has been around for almost 19 years.

      • Excuse me!!!

        i’m really looking forward to the new curves implementation.
        Thanks for doing all that new things!

    • Hi Fred, I mostly agree with GifCo here, these were the fundamental changes I think will help in the long term. You mention fundamental changes in your comment, but nothing specific, did you mean anything in particular?

      • Hi Hans,

        by fundamental changes I mean the general behavior when creating and editing curves. It’s just difficult or impossible to create more complex, twisted 3D shapes with traditional blender curves. So it might be good to work on the Blender’s own “old” curve system before the nodes come. I also think nurbs curves should get more attention. With an eye to improved nurbs modeling in the future.
        I was obviously inadvertently making myself a little strange and ambiguous. That was not my intention. I think your work is great! Unfortunately, I am not an English speaker. I use google translator. However. All the best and thanks for the great work!

  3. Thank you all involved so much for this It brings much needed love to bezier curves in Blender and opens up so many possibilities.

    Great read, and excellent work. Keep it up guys

  4. So exciting, I’ve been following the development on dev talk during summer holidays. You are doing a fantastic job, 3.0 will be epic. Thanks for the great work! Can’t wait for more news! Keep it up!

  5. Will this mean that it will be easier to make Nurbs surfaces in Blender from Nurbs Curves?Does this relate to B-Surfaces?I always thought that looked promissing.

    • This doesn’t mean that NURBS surfaces will be supported in geometry nodes, but it does mean it will be more possible if someone can put in the development time to do that. Since the two share many of the same implementation details. Luckily geometry nodes is more generic than previous procedural systems in Blender, so it’s generally easier to support new data types in the future.

      We can also add something like a curve loft node to accomplish many of the same things.

  6. This is really great work, thanks for your contributions, Hans!!

    This does make me wonder where curve caps(specifically round caps) fit in with this, since there was talk of implementing them before. Are they still dependent on another task, as was the case before? Or is their implementation in Geometry Nodes independent of that?

    • Thanks Spenser!

      Actually, rounded caps are possible to create now with the curve endpoints node and instancing. Maybe it’s worth having a dedicated option on the curve to mesh node, but honestly that’s not the highest priority for me anymore now that the nodes provide a flexible base for that sort of thing.

      • Thanks for the reply. I admit, I was mainly curious in regards to the average user who doesn’t know Geometry Nodes but requires a setup like this(as rounded caps is a pretty ubiquitous and widely used design element), and just needs a straightforward option for adding round caps to curves, instead of having a more complicated setup.

        However, I realize that with the new asset browser, if we have the ability to save Geometry Node groups/presets this would make the process of setting this up in different files much less cumbersome than going through the process each time. I suppose I’ll just have to stop delaying and actually start to learn GN!

  7. Huge congratulations! this is an gigantic update, lots of new features.

    I use curves in a daily basis in my job and even if this update includes all this new features let me point two missing features I really hope get into the 3.0 update:

    – 2D curves: this type of curve is important because it offers no deformation on its corners (with handles set to vector) when using a extrusion profile.

    -Normal and tangent attributes exposed: I don’t know why they disappeared, Im sure I’ve seen them in an old version.

    Thanks for this awesome update.

    • Hi Lynchon, thanks.

      I think I’d have to see a picture of what you’re talking about with 2D curves. I hope that the nodes can accomplish the same things as the 2D/3D toggle in the curve object without requiring that same explicit type toggle, since I see it as most important when in edit mode.

      At this moment, curve normals and tangents are only available on the output of the curve to points node, but they will also be available directly on curves in 3.0– just haven’t finished that yet.

      • Thanks for your reply Hans.

        Here an image of what I meant when I point out the difference between 3d curves and 2d curves. This feature is very important when you are dealing with archviz .

        https://ibb.co/3f2Qy0v

  8. wow, I cant learn all of the blender features anymore, I need to choose. So many features,but this, i give a shot

  9. That’s terrific, thank you all for your work on this!

  10. Great work, thank you! I was wondering if there’s plans to implement the handle locations as attributes for bezier curves? Or at least the “scale” and rotation of the handles (not sure how it’s implemented at the code level). It’d be super handy for certain use cases to be able to procedurally scale/rotate the handles in GeoNodes. (I have a project where I’m making copies of the original curve and offsetting the handles, and it’d be great to be able to manually scale/rotate them too to better align the curves)

    AFAIK, right now you can only move the handles around with the “set position” node.

    • Hi Aleski, yes there is plans for those attributes. In fact, they are already implemented, they’re just waiting for some of the design discussions around the fields workflow change in 3.0 to settle down. But they will definitely be in 3.0 🙂

  11. Hi Hans,

    Thank you for the amazing development to you and the whole team and also the GSoC student.
    I have a few questions too.
    Can you tell us how far is Dilith’s curve pen tool from merge?
    Can you tell us about exposing some of these improvements in the properties of a curve (and in edit mode) instead of nodes? You did mention it as a footnote but it’s not secondary from a user standpoint at all.
    I’m thinking:
    – reverse curve direction (in edit mode or maybe in a properties checkbox)
    – new 2D fill algorithm just simply in the 2D curve instead only in nodes
    – yes, exposing round caps to the end user without nodes (I’m 10000% in that camp)

    I like GN. Believe me. But I’m an artist and I use tools. GN is a tool creation environment and I don’t want to make tools to do simple stuff, that’s stone age in some sense 🙂
    I also have past in UX AND I also teach people how to use Blender tools so I have a good understanding how newcomers perceive them.
    It’s weird telling them “you know to do this simple thing, learn a new system or download this and that”.

    I understand the new principles you follow and I’ll also use them as fit but I’m an advocate of exposing most of them in the user’s face. What’s your take?

    • “I like GN. Believe me. But I’m an artist and I use tools. GN is a tool creation environment and I don’t want to make tools to do simple stuff, that’s stone age in some sense 🙂
      I also have past in UX AND I also teach people how to use Blender tools so I have a good understanding how newcomers perceive them.
      It’s weird telling them “you know to do this simple thing, learn a new system or download this and that”.

      I understand the new principles you follow and I’ll also use them as fit but I’m an advocate of exposing most of them in the user’s face. What’s your take?”
      —————————————————————

      Don’t know how why… but it seems to me super close to my thinking. And in my opinion the simple tasks should be possible without Geometry Nodes. And without any problems when creating creating clean geometry or doing simple tasks with twisted curves…. extruded or beveled or whatever.

      All the best to all of you! and Geometry Nodes are super cool and incredible! 😉 And seriousely Great Work! 😉

    • Hi David,
      – Curve Pen Tool: I haven’t started review on this yet, I’d like to talk to the UI team about it a bit, then go from there. I think 3.1 is a reasonable goal.
      – Reverse curve direction: This is already an operator in curve edit mode

      In general I hear your point that people don’t necessarily want to open the node editor to do this stuff. However, I think that a future where things are implemented procedurally with nodes is a much better one for Blender. You can dig inside, change details, share customized operations, etc.
      I still think it should be possible to do all of these common things without the node editor. I imagine the asset browser and bundled procedural node groups becoming very useful here, where you can just drag things like “filled extruded curve” onto an object and adjust some parameters as a modifier.
      Another possible solution is adding a node group automatically when enabling a property, or something like that– time will tell, since I expect this will keep coming up.

      Thanks for your comment!

      • Thanks for your answer Hans!

        And haha, what you mentioned in your last sentence is exactly what I was proposing to Dilith regarding the fillet node on Devtalk:
        “I think a possible way to port this to Edit mode would be a separate parameter but the moment you use it, Blender creates a GN modifier and updates it with everything you do in edit mode. It should be that simple. (similarly to for example how a new particle sim creates the corresponding modifier) Then you can apply it and get to the new points if you want.”

        I’d LOVE this. And I think it’d be a great Blender compatible solution.

  12. Thank you for improving Blender! Is it planned to use curve nodes for particle hair? Hair interpolation would benefit from nodes (e.g. stacking multiple kink types), and there is this old bug about kink interpolation having issues with object rotations, which I hope could vanish with a new hair implementation.

  13. Is there a way to subscribe to the blog so I can get updates in my email inbox?

  1. Leave a Reply

    Your email address will not be published. Required fields are marked *