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 […]
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:
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!
This node is the counterpart of the existing “Curve Bevel”, except that the node can accept multiple input profiles, and automatically marks sharp edges.
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.
The trim node makes curve splines shorter, with a length or factor input. The node was contributed by Angus Stanton.
This node generates a point cloud with evenly spaced points on the curve, generating the data needed for instancing like rotation.
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.
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.
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.
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.
This node procedurally change the left or right handle types of Bezier control points.
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.
Also created by Johnny, this is a simple node that switches the direction of a curve, just like in edit mode.
Another simple node to output a curve’s total length. Created by Johnny as well, who shared it on his YouTube channel.
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.
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!
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.
What we have now should already be a solid base of features for 3.0, but more is planned for the near future:
Further in the future, these changes can be applied to curve edit mode as well. Editing and painting custom attributes will be particularly important.