Help with using geometry nodes to make an audience with idle animations

Hi there, there are two main drives behind me writing this post:

  • I want to create a seated audience, with subtle idle animations. I will use low poly models parented to armatures to achieve this, as I have quite a lot of experience animating armatured meshes.

  • I’m new to geometry nodes and want to gently push my abilities with these as far as a I can.

This picture shows that I’ve been able to make rows of chairs, using, mostly, my first ever geometry node set up! Yup, I’m that much of a rank n00b. I like that instances don’t increase vertex count. The base chair models themselves are not shy on vertex count!

The chairs are distributed on the points of a sub-divided plane (not shown), to which has been added a displacement to introduce a degree of randomness. I’ve done this stage the old-fashioned way, with modifiers, as I can’t see an easy way to bring in that sort of displacement in geometry nodes yet.

Onto my questions. Can I, as a function of the geometry node which distributes objects on the points of the mesh to which the geometry node is assigned, do the following:

  • Change certain aspects of individual audience members’ meshes: for example hair colour.

  • Randomly apply different idle animations to different audience members? i.e. cross legs, scratch head, look from side-to-side etc.

  • Randomly change the starting point of an animation action (or action ‘block’, thinking from the NLA’s point of view), so that, say, the fraction of the audience given the leg-crossing animation doesn’t begin that animation simultaneously.

  • Do something similar to the track-to bone constraint, so the whole audience looks at the same object?

That’ll do for starters. Thanks very much for your time,

JT

Hello @Jester_Tickett and welcome to blender artists !

So, what you’re trying to do isn’t the area where geonodes shine the most,
Sadly, there isn’t really good tools for that in blender , but it’s possible to manage something nonetheless !

I think I’ve seen someone talking about doing crowds with blender at this year blender conference, I think it was a italian VFX company showcasing their work.

This is more a shader thing, look into Object info node / random in the shader editor, that’s the starting point for that.

GN doesn’t have the tools to do that, you’ll have to build a bank of many character with different animation and offset them manually, then you can add variation in the materials.
GN will allow you to instance the character on the chairs, randomize transform as you did with the chair, but not a lot more is possible at the moment, maybe look into Animation node ?

Again, it’s not something easy to do with the current toolset, most of the tools allows to only modify mesh data. What you’re asking for is to control the rig via nodes, or to create a mini rig with nodes to orient the head and eyes :see_no_evil: :hear_no_evil: :speak_no_evil:

If you want to learn GN then the best way is to start without any goal in mind, learn the basic tools and ideas will start to appear.
If you’re most into finishing your project, I think your are on the right path but it’s just that vanilla blender is quite limited for crowds.

Good luck !

3 Likes

Hey, @BlenderBob, do you have any suggestions?

We are dealing with the same issues for our crowd system. Blender is working on a geo node alembic that should be able to do that but at this point it is not possible to randomly offset instances. I’m pushing hard on the devs to make it happen.

:-/

3 Likes

So I guess the only real solution at this point would be to duplicate each instance a ton of times and offset them manually?

yep. And it’s even more complicated for us because we do videogrammetry and the texture changes every frame. I will do a clip about it end of December or January

1 Like

Here is the video I was referring to in my comment :

Blender 2.49 had the time offset feature that allows to offset a group/collection in time.
But with the new depsgraph that functionality is lost.

One way of having it working might be to export in alembic , and I’m pretty sure the modifier allows time modifications.
Then a little script to duplicate N times and offset the time inside the modifier + finger crossed that it loads in geometry nodes when all this is in a collection, but it probably could !

Or for more complex crowds probably using one of the few plugins that handle that could help :

I’d also look into animation nodes since it might have some tools to handle duplicates and offset in time.

another way might be to import the model using overrides and use the NLA to offset the animation.
This is basically like duplicating the rig and character but with more non-destructiveness.

In most of the cases you’ll probably need at least a bit of scripting or an addon. At least for now, given the rapid development of geometry nodes I’m pretty sure this will eventually be made much simpler at some point.

3 Likes

Thank you very much for your detailed replies folks, much appreciated. And the mighty Bob has made an appearance! I have watched your Crowds in Blender - Ask Blender Bob EP4 video sir and found it very helpful and inspiring in terms of tackling this problem.

So I get the gist that the consensus is something like, “no, you can’t use geometry nodes to do that yet, but we all wish it was possible and they probably intend to work on it at Castle Blender if they aren’t already.”

And I’m cool with that answer because sometimes a “no” is just as helpful as a “yes”; it means I won’t waste countless hours chasing a workflow that doesn’t exist.

sozap
This is more a shader thing, look into Object info node / random in the shader editor, that’s the starting point for that.

Gotcha. In fact, I believe this StackExchange post covers in high detail what you’re describing. I think that’s the solution for that part of the problem, at least.

I’m having nice results mucking around with duplicated instances outside of geometry nodes because I’ve found that one can apply to each instance different animation actions and shift those animations’ timings in the NLA. In fact, its only re-texturing that I think I’m going to need the pre-mentioned work-around for. I realised yesterday that I don’t mind having to position the spectators manually; it’s not like I have a stadium to fill. Duplicates means I can keep the vertex count way down (still have no idea how that works, but so long as it does :person_shrugging:)

Again, thanks folks!

3 Likes

Great !

I always forgot about that way of working with instances and NLA, well done !

For randomization of materials, yeah the most useful is the last one , Object info → random.
If you struggle with that, create a topic and poke me from there and we’ll see what we can do.

Doing these character variation isn’t that complex it just need a bit of organisation, to be able to mix different things like hair colors, cloth colors, cloth textures so you end up having all the possible combinations available.

from there it’s fun , each time you duplicate an object you get a different character !

Good luck !

1 Like

If it’s not too much trouble… could you list/describe the steps you took to accomplish this?

Thanks,
Cal

Sure, although I might have used the wrong terminology when I wrote “duplicated instances”. If you take your default cube, you can go to object ==> duplicate linked to make a copy, or Alt-D instead of the usual Shift-D. You’ll know if it works because your vertex count won’t go up and any change you make to the materials of either cube affects both.

Beyond that, it’s business as usual. You can assign different actions to both objects and, once those actions are ‘pushed down’ in the NLA, you can offset the playing-out of those actions as you like.

It might be worth repeating that I could be on shaky ground when I claim that creating a linked duplicate is the same as creating a new instance, but this certainly seems to do the job.