Text mograph nodes design

Blender Text Nodes

Hi, I’m working on new nodes for Text motion graphics inside Geometry Nodes.

This all started on the Blender Chat where I asked a developer if there are any plans to implement generating text curves in nodes in the future. There was none, but I was perfectly welcome to work on it. Great!

As this is an entirely new thing and noone responsible for the design so far, I’m starting this thread to ask for suggestions and feedback on my work, and overall design for this area.

Node 0 (String to Curve)

I started by creating a node with a String input and the default Bfont. Cool, now I can make text curves! After this I implemented support to set font, adding line breaks with ’\n’, Spacing and Line Distance. Well, still not that useful I quickly realized as it still takes manual input and therefore have no real use in itself. This leads up to the second node.

Value to String

This is a quite simple one. As inputs it takes a Value and number of decimals, and converts it to a String output. Now I could really make use of the node system to get dynamic input for the String to Curve-node. This is when I started to think that ok, this is nice and all, but for this to be useful to anyone, some more text manipulation nodes are needed.

String Join

This nodes takes String inputs from a multi-socket, and a delimiter. It outputs all strings joined with the delimiter in a single String output.

String Substring

Another basic string manipulation function. For developers substr is a common function that everyone knows about. It can extract a part of a string from a specified position and length. For example the string ”Geometry nodes” with position 3 and length 8 would output ”metry no”.

String Length

This node will take a String input, and output the length of the string.

Simple example

To try to make something from all of this, I put together a ”LED timer”.

The string part of this that takes the number of seconds elapsed as input, and outputs a curve string on the format ”HH:MM:SS”. This is then used with ”Attribute Proximity” to turn on or off the LED:s distributed on a grid.

Where to go from here

Now, Blender developers are asking me to put the design of this system together, reach out to artists and basically get this right from the beginning and make it expandable in various directions. If you read all the way here, chances are you already have an opinion and I’d like to hear your thoughts! Any critical features missing, use cases to consider or other things. You can also PM me in Blender chat (erik85) if you are an artist and want to discuss this.

You can also try the current patch yourself: D11522

58 Likes

This is awesome!
The first thing that comes to mind when thinking about using this for production for me is that it would be great to be able to treat each letter as a unity after it’s been converted to a curve, to be able to create falloff animations like they do in this video: https://www.youtube.com/watch?v=jCV1ARWsZ18
but without having to convert the text to mesh and separate the letters. I guess that is more a splines handling thing than a text handling thing so this may be out of context here (and maybe it’s already handled, I’m not up to date with how the curve nodes work currently).
Other than that, it would be nice to eventually also have the ability to enter paragraphs, and use alignment settings and that kind of stuff.
But as it is, it looks already quite useful already.

2 Likes

That’s absolutely awesome. Perhaps the string node could be a multi-line input? Also I have always wished for text nodes for materials similar to these, maybe that could be based on the same design and/or underlying code?

1 Like

I just want to say that this is great and I’ll be watching closely. :slight_smile:

4 Likes

Awesome! Thank you for working on this, better text manipulation/animation options are sorely needed in Blender.

I’d say the first thing we need is the ability to animate these properties per character, word, or line, without having to manually convert to mesh and separate it into different objects, which right now is completely destructive and makes working with text in Blender really slow:

  • Anchor point (Origin).
  • Position
  • Scale
  • Skew (and Skew Axis)
  • Rotation
  • Opacity
  • Extrusion

With these options it would be possible to make all sorts of different falloff animations for text while keeping it editable, and having it as a node system means you could do it just once and then apply the same node tree to other text objects. :star_struck: :nerd_face:

5 Likes

Thank you for your suggestions.
There is also the alternative now to download a build if you want to try it (choose D11522)

5 Likes

Unfortunately there is no multi-line UI component in Blender, but that would be nice… Let’s hope someone will make one in the future. Some of these nodes are function nodes but unfortunately the function nodes don’t allow multi-sockets right now so the Join node is a geometry node. Actually not sure if this means it’s unusable in the shader node editor but I would think so.

Thinking a bit further about letter by letter animation, I think it would be very useful, (not only for this but for other motion effects outside of text also) to have some sort of “separate by loose parts” node, that allowed you to treat each island as if it was an independent object, in terms of location, rotation and scale. (For text this would also require a merge by distance node I think, since each letter tends to come in multiple islands when converted to mesh currently).
I guess what it would actually do would be to generate one point per island and vertex groups corresponding to each island and somehow linked to each corresponding point, like if each island was “instanced” on each point.

I was just thinking about this. What I’m considering now is to try to create one node that will generate the character origin points, and another node that will take these points (possibly modified in between) and distribute the individual characters to them. This would mean the user has to specify the same font in both these nodes to get the character spacing right, but maybe that’s not a big problem.

5 Likes

Sounds good. It could be shipped also as a nodegroup connecting the same font and exposing the modifíable properties loc rot scale.

Great work, Erik! Really looking forward to one day being able to have a geometry nodes setup that can output frames for a new video animation with different text simply by changing one node’s string value. Way to go!

1 Like

Here’s some feedback from a team of animators with over 3000 motion graphic templates made in Blender.

The String to Curve node is a great start along with the ability to now have splines in GNodes.

Typography being a whole subject to itself, we’ll need a lot more options to meet the needs of those that work with text on a more regular basis. Having all text options available on a single node would be cumbersome.

It would be much better if curves would be formed from existing text objects using all the text options available (font, font size, spacing, font styles, text boxes, text box overflow settings…) Getting string from existing text objects in the scene would also be beneficial instead of entering string in geometry nodes as it can make animation setup much easier.

For animation we would require the ability to differentiate between characters, words and lines; in order to apply transformations on a per character, word and line basis. This is the most common text effect that’s missing in Blender and giving headaches to animators working with text effects. After separating text into several objects or islands within the same object some sort of procedural animation capabilities should be implemented, like controlling time delayed transformation of each character (scale, rotate, translate).

In animation nodes, it used to be done by using string length, then instancing separate text objects for each character in an object list and animating them using loops. In later iterations of AN, it was achieved by decompose text node.

Some other notes:

A fill option for text would be great as now only empty curves are generated. I understand that this might be a difficult request as points can be manipulated in any way and the fill feature on text is intended for planar curves.

A trimming feature would be nice. For achieving typewriter effect. Also, anything that helps manipulate string in a creative procedural way, like “decoder effect” when text transitions in by randomly shuffling characters and then stopping on actual string characters.

Option to toggle cyclic and closed curve would allow making some interesting text outline effects by animating start and end values of curve’s bevel. However, turning off the cyclic option on text can result in gaps. In Geometry Nodes if we could have a toggle that would turn off cyclic on a spline, copy the first/start point of the spine and make that copy the last point in the spline. This will allow start and end mapping without any gaps.

The Curve to Mesh node is pretty cool. Would nice to have a node that can do something similar using the radius attribute of the spine.

Notice that you can import instances of any text or curve using the Object Info node. An Instance to Geometry node that can turn instances into geo would be invaluable, allowing us to do things like boolean a dynamic text object.

12 Likes

Thank you for you many good suggestions… I’ll go definitely go through them and prioritize.
A fill node is coming, called something like “Curve to Mesh 2D”. I have been working a bit on getting the delaunay triangulation functions already available in Blender to also consider holes, but after that it should be pretty much ready.

I was working last night on what i posted above, outputting the character origins as points which is working now, and also outputting size (float) and character (int) attributes. These attributes can be modified before they are routed to the “Character distributor”-node that will output the curves in the right spots. This way we get individual control over location/rotation/scale of all characters with attributes, and separate the “text layout” from the “text rendering”.

If you have a common use case you can describe, it would be nice to see what needs to be implemented to make it work.

9 Likes

I actually made a big blog post about text and other motion graphics stuff several years back. Here: Blender Motion Graphics Artist’s Wishlist – Relja Trajković (reljatrajkovic.com)

Some stuff from this list like text autofitting to text box has been implemented by Dalai Felinto.

But here are some examples of effects we usually need:

Also add to that ability to fade in characters one at a time. Because that requires each character to have a material of it’s own with different keyframes for fade in and out, we came up with just using AN to move characters slightly at an axis pointing to camera (so motion is not very visible) and map color ramp along that axis to control material opacity. I wonder if more elegant, straightforward solution can be found.

3 Likes

Since I can’t add more than two links in a comment, here are others:


3 Likes

@ecke101 this is not strictly related to the main topic, but it’s related to one thing you said you are working on, and it’s extremely important.

Could you make the delauny triangulation as a node to triangulate not just 2d areas (which is already good) but also to meshes in general?

This is a good step for many things, the 2D is useful for text, but also for cloth patterns and simulation, and the 3d one helps with cloth simulation over modelled cloth and as a previous step for a full remesher like quadriflow.

So having it as a node that is able to triangulate any object, 2d or 3d, is something VERY useful.

Other than that, the work you are doing and planning with text is VERY much needed, and it looks awesome :slight_smile:

1 Like

Here’s a test I made where I modify point loc/rot/size and ascii code.

16 Likes

That’s awesome @ecke101 Do you think time offset might be possible there?

Haven’t thought about time offsets yet, but my initial thought is if I make an attribute with char index, it should be possible to use it to compare with the frame number in some way. Or maybe there already is an attribute, I will investigate further when I get home.

Awesome!! From what I see in the video it should already be possible to animate with offset by using an object controller and using it’s clapmed positive distance to each point as the mix factor for the transformations, right?

1 Like