@dfelinto sked me to have a go at seeing what kind of solution I could come up with for creating a procedural birds nest using the curve nodes as a bit of a litmus test.
The initial nest created by @JulienKaspar comes from the Sprite Fright production file:
This example was created manually which does create a lot of opportunity for creative direction but is also very time consuming. The result we see has a solid base mesh to fill in the gaps, presumably to save an artist adding hundreds of manual curve objects.
My approach was to create a curve object and instance it around a procedurally generated nest form. This would create a bit of a mold that defines the shape and then still allows for arbitrarily dense layering of the curves while maintaining visual consistency.
In a real production setting the initial curve object could (should) be made manually and the nest form as well could be created manually for speed and creative direction.
Creating The Nest Form
The profile curve is simply a circle with the top pulled down and then swept around a semi-circle with a very small radius. This is something that would be easier and faster by hand but done with nodes as a test.
Attributes made this slightly more cumbersome than needs be but the logic was fine. Rather than manually creating a semi circle, a spiral node could have been used:
Instancing Curves
Instancing the base curve object onto the nest form was very simple but from a useability point of view we really need to be able to instance curves and geometry directly without needing to create additional objects.
You will find in the file that simply trying to move the objects being instanced is incredibly laggy even though their object transforms are immaterial to the calculations.
Twig Shapes
Using an attribute randomise on the position
of a curve lets you randomise the control points which is great because you don’t end up kinking the edge like you would with a mesh object. In this case a curve subdivide node is used as well to increase the number of control points.
To make these look more twiggy I also randomised the radius. Something that would have been real beneficial here would be more interpolation types. There’s a lot of use cases for having more falloff / interpolation types but even just with this, short of using a Curve Map node, I had very little control over the variations in radius. When we look at the Map Range node in Animation Nodes we see a lot more options.
Even if these weren’t directly added to the node, having a socket that allows you to plug in different interpolation types from a dedicated node would make sense here.
There also really wants to be more selection methods. Selecting by Region as well as Selection by Index. Once these curves were made real there was no way to differentiate between them. Attribute Transfer only works by proximity rather than inheriting attributes from point to instance. Even an object index would be a big benefit. This way you could do something like mask between random curves and make some into feathers and some into twigs, or different kinds of twigs etc.
The base tools on actually generating stuff is good, there’s a solid foundation. Artists still can’t easily manipulate that data though so I’d want to see more data being exposed.
The fields workflow would certainly be more streamlined and artist friendly but still doesn’t quite solve the basic need for more analysis to create data about objects or selecting individual objects out of a set. Generating ~250 curves for this nest but from a user POV, they’re just treated as 1.
Feel free to dive into the file: https://drive.google.com/file/d/1ofL-aaAHz6Ft3OEdtbdLarPEWUzGN791/view?usp=sharing