Is it possible to animate text split by words non-destructively?

Hi! I’m trying to find, if possible, a non-convoluted way to non-destructively animate text split by word in Blender, like this:

TRAIN1_3

TRAIN1_11

TRAIN2_3

I’ve been looking into addons or Geometry Nodes setups but I couldn’t find any that works as easy as After Effects (I’m not even trying to find something like Animation Composer). The closest thing I could find was Animation Nodes, which isn’t easy at all, but I got it to work for some animation some years ago (I don’t even know if it still works).

My current simple-ish setup for animating text using geonodes only works with individual characters and it looks like this:

Is there anything that I’m missing in order to be able to animate words or lines separately? Could it be that nobody has solved this yet?

Thanks for your time.

2 Likes

You can use Repeat Zone to separate lines into their own instances then you can animate those:

Good luck.

2 Likes

Careful, your Repeat Zone isn’t actually doing anything… Spline index of 0 separates out everything on repeat 0… all other iterations do nothing (Because Fill Curve makes a mesh so a capture of spline index will always be 0).
Everything is accomplished by the line/frame scaling (the 4 bottom nodes plugged into the lines field).

ooops - thanks for that!

Alright, that’s a start! But is there a way to make it work with more than a word per line, like in my examples?

isn’t that just a matter of where you place the individual words? to put them (back) on one line? @zeroskilz put them individually on their own lines, but with a bit of math in the repeat zone to figure out an x/y location and translate the word to that position, one could have those words on a line. perhaps even with a autowrap of sorts. doing it by letter could even get one even-justified paragraphs with enough words.

1 Like

Hmm, I’ll have to investigate that. I don’t want to have to adjust things too manually, because I’m looking into getting something that’d work for any text and font I throw at it. Thanks!

Edit: clarified a sentence

aye, i get that, manually is kinda against the GN thought process. :smiley:

so, say you’re going word by word… you’ll want one more input/output to your repeat zone, a cursor location (x in zero’s example) … for each new word, can it fit in your area (perhaps the plane you have this geometry node set to, it’s width)… if total width - current cursor >= word width, then put the word at cursor position/current line. out put the current position + width of word (plus space) output on cursor location, leaving line alone (feeding out existing line number). if total width - current cursor < word width, then set cursor position to 0, line at line +1, and put the word there, outputting like you did with the other case.

the only time this would bite you is if you put a word so long that it could not fit… which you can test for with word width > total width AND cursor position = 0… if so, then you could allow it to print on current line anyway, or scale it to fit, or split at a random letter … however complex you want to go.

Hi @AndyCuccaro … Sorry for taking so long, this was actually quite a challenge to figure out…

You require a pre-step to figure out words and then you do the separation as done in my previous post but by words instead:

The overview:

The bit that figures out words:


… note the 1st string compare contains a space character " ".

And then the separation bit similar to previous answer using Attribute Statistics to get max words (adding one since it is using 0-based index):

That will give you as many instances as there are words and you can animate those as you wish.

Good luck!

6 Likes

I’m replying here just to keep it on my radar, I’ve been trying to achieve the same as @AndyCuccaro mentioned on the first post (as well as some other text effects), with little to no luck so far. :frowning:
I think the String to Curves node should have a couple of extra outputs by default, to give the user the ability to turn individual letters, words or lines into instances (Right now the Domain Size node will only give us each letter and space as a separate instance).

I haven’t tried @zeroskilz solution yet, I’m glad you’re taking the time to look into this and propose a solution btw, don’t get me wrong, but it seems like a very complex workaround for something that should be possible by default. This and a proper working bevel option for text are still missing.

3 Likes

Interesting subject !!
As always working with typography in blender isn’t simple even if it gets better with GN.

It’s just a brain fart here, but maybe it’s possible to create a nodegroup that add a few attributes to the letters , in a similar fashion @zeroskilz did !

currently each letter is an instance with an index, which allows to do stuff to individual letters.
If there was on top of that a word index, just like we have island index for geometry,
Also an index per letter per word can be useful too. That way index 0 is the first letter of each word.
Another one could be an index per line.

Then with these 4 sets of indices we should be able to feed that in other nodegroups to actually do stuff to the text.

Having the flexibility and simplicity of the plugin you mentioned @AndyCuccaro seems indeed very difficult. However I’m pretty sure it’s possible to build a few text utilities (nodegroups) which would allows to setup simple and fun text animation very quickly.

Obviously designing such system would takes a bunch of time since GN provides only the building blocks and there are very different ways to provide an interface to these text effectors.

At least it looks like a goldmine for people who sell assets so maybe that will eventually pop on the market…

2 Likes

100% agree. When the Strings to Curves node was first introduced and started to being worked on, I commented in devtalk about this need to have outputs for characters, words and lines domains, but the dev @ecke101 only could add what we have currently. https://devtalk.blender.org/t/text-mograph-nodes-design/19208/

@sozap I don’t have enough geonodes knowledge to confirm or contest what you just said :sweat_smile: But it seems, to me, a very basic need for animating text, that we as a community could be able to find a solution for.

My simple mind only thought of: the program could have an internal way to find space and newline characters, split the string by those characters, and have outputs for each options (words and lines). But I’m probably missing something, lol.

2 Likes

I agree on that, the Foundation shouldn’t have to worry about building these effects (other than a very few as examples, like the hair nodegroups). The community should provide these node groups, just like the After Effects community provides many presets.

In the After Effects community it is indeed a goldmine, with people living exclusively from selling text motion, lower thirds and transition presets. And if these outputs get added (split by character, by word, by line), I could easily see Blender taking After Effects’ space in this specific aspect.

2 Likes

Well, as someone that is desperately trying to ditch Adobe completely (only AE is not easily replaceable) I can tell you that I have been looking for good text mograph addons for a LONG time, and at the same time trying to come up with good GN node groups to be able to sell someday, unfortunately my GN knowledge is not good enough hehe :upside_down_face:

3 Likes

I just gave it a go, in fact lines are already available , I didn’t even notice that :
image

I tried to find ways to isolate words and a first step could be to detect if a character is empty ( no points or curve inside it) , but without success.

At least what @zeroskilz posted works, I was looking for a more lightweight solution but that doesn’t seems easy.

It might be worth posting on RCS and asking for a word index just like the line one.
Maybe with an entry to set a break character, so instead of splitting world with space only , other characters could also be used which might make the tool more generic.

And in the meantime it might be possible to start with @zeroskilz 's solution and prototype a few text effectors.

Maybe if a developer see how cool these effects are and how convoluted it gets to separate by word they might pity us and provide a simpler , builtin solution…

3 Likes

Something like this?

I made 2 node-groups… One to capture the Words and one to Group Instances.

It is an improvement on the above method in that it properly centers the grouped instances.

Sill WIP but let me know if you think ppl will be interested (+suggestions).

9 Likes

That’s awesome! I think it’s exactly what I was looking for. I wish there was a simpler way to do exactly that.

2 Likes

Awesome. I am already interested!

2 Likes

In fact, we don’t really have nodes oriented to manage 3D Text Objects.
We have String nodes instead.
We could benefit from nodes about 3D Text Objects properties.

If there is a World Spacing property that can be modified in properties tab of a 3D Text, it is because Blender is already able to distinguish words.

2 Likes

It’s even in the String to Curves node itself! We just need outputs for these types and we are good to go, lol.