Rigging nodes

The purpose of this addon is to let the user create rigs by using nodes.
It allows a more non-destructive way of creating rigs and lets the user preview how the rig changes with each node they add.
The goal of this project is to be as versatile as possible and let each rigger create and/or share their own “Node groups” to later reuse on different rigs.
This project is in very early development and still lacks a lot of functionallity and polishing.
For that same reason addon updates will probably require manually updating specific parts of the node trees (expect this until at least the version 1.0.0 is released)

For more information, check the readme:

You can download the latest release from here:

My first goal with this project was to be able to create a simple IK/FK arm with a switch and snap functionality only using these nodes (you can find the example blend file in the readme)

I’d love to hear what you think about it.

15 Likes

Interesting concept.

I wonder if rigging will be a part of the big ‘Everything Nodes’ overhaul of Blender in the near future.

1 Like

Interesting. Sound good to me for retargeting also.

interesting, i had some ideas on animation plugins as well

In the object nodes proposal it mentions that rigging could also happen with nodes and there is a “Node based rigging” task in the Animation and Rigging project, so hopefully we will have this in the future. But I doubted any work would be done in that area any time soon, so I decided to give this a try and keep developing it if people think it could be useful.

3 Likes

Wow! Great, I’ll check it. Thank you so much for your work.

I’ve done rigging with Animation Nodes before, it’s a pleasure to use a nodal system for drivers and such. Performance was an issue though, and linking and relinking node trees for the different rigs in production proved a little toublesome. I will keep an eye on your concepts though! Looking forward to it. Will these tie into the Function Nodes builds?

Thanks for the comment Draise. I’m making this addon completely with python and I’m limited to recreating the whole rig every time there is a change in it, so performance will be an issue unless you separate the tree into “modules” and only execute the part you are currently working on . That was my idea of how working with this addon would look like.

As for relinking the trees, I don’t know how troublesome can it become, I thought it would be quite straightforward, but if there is something I can do to alleviate it then I’ll try to do so.

And about the function nodes, I’m not planning to integrate it into this addon. I’m not even sure how that could be done or what kind of improvements I could see. But I’ll keep an eye on how it develops.

I’ve released the version 0.0.2.
Input nodes have been reworked to be more user friendly.
Nodes for getting and setting object properties have been added.
And now references to the objects created inside the tree are not lost when re-executing it (for example objects with the armature modifier)
The example file has also been updated.

1 Like

I’m on the lookout of some process to better handle hands poses.
I think your system has perhaps potential for this, although it might be, a bit cmplex, will try it out.

Some not though, I think you should keep the normal color scheme for input / outputs.
ea a vector = bleu
It also might be handy to keep certain node input/outputs at the same height.
Head to tail etc (or your lightbleu dots).

Looking at your Git, examples if a whole rigify bone system was done… would it becomme to large in nodes ?.

Hello Aquatic Nightmare,

I’ve been playing with your node-based rigging system for a couple of days, first of all, thank you for putting this together. It is a pleasure to work with and brings rigging in line with other software packages. Fantastic job on this addon!

I have a couple of questions,

Can the Vector Node have an out for X, Y, and Z? Or can there be another node that converts a Vector into its properties? (if this already exists sorry for asking, although I could not find a node that could accomplish this)

Speaking of this, it would be great if all of the inputs on most nodes can also be an output:

This would allow me to add the tail vector as a head vector on another bone, without using a connect option (let me know if there is already a way to expose these nodes that I don’t know about).
Actually this would be great is all inputs can also be exposed as outputs on most nodes.

I ran into one issue with the driver node, I was able to add drivers to constraints, but I could not add a driver to the location of a bone. I tried a couple of things here, but I could not get this to work:

Again, let me know if I am doing something wrong here.

For the driver nodes, I was wondering if this can match the drivers’ panel a bit?

So here, you can have access to the Type, as well as the expression, with the option to add additional variables and inputs if you want.

Again, amazing work on this addon, I know I added a lot of things here, but I’m just really excited about this development :slight_smile: This is honestly the coolest thing I’ve seen in Blender Rigging since Bendy Bones.

Please feel free to send me a message if you want to discuss this more, or if you want me to do more testing.

-Level

Hi,

I’m glad you are liking the addon :slight_smile:

Converting vectors to floats has been something I wanted to do from he beginning. I’ll definitely add that node soon.

There is no way to expose inputs as outputs right now. I’ll have to think about this feature. It seems easy to implement but it may cause some problems with some of my nodes.

I think you can solve the problem if you switch the mode of the armature to Pose right before you add the driver (with the “Set mode” node). I avoid switching modes unless it’s necessary because that’s what slows the execution of the tree the most. This node can be used to add driver to objects and to bones, that’s why I’m not switching to Pose mode automatically. But i think I could add this quick tip as a label, or inside the error message to the node, or maybe include a dropdown inside the node to select the mode.

Yeah… my implementation of the add driver is quite rudimentary right now. It definitely needs some love :stuck_out_tongue:

I’ve added your suggestions to my to-do list. I’ll work on them when I have some time.

1 Like

Sounds great! In the meantime I’ve built a couple of custom nodes, for things like a vector and the bone outputs, I’ve done something similar to this in material nodes in the past, I realize now that I can do this it opens up a lot of possibilities.


Here is my custom bone create node:

I’ll try out your recommendations with the driver nodes.
Let me know when you have a new version :grin: I will gladly test it out!

-Level

That was the main reason for supporting group nodes :smiley: letting people come up with their own nodes. I’m really glad to see this, and I’d love to see what you can come up with next :wink:

1 Like

Potentially valuable contribution, to have component elements as nodes and node groups that can cobbled together to create a variety of necessary rigs. I would welcome any contributions to a bird rig that has folding wings. Best to you in your efforts.

Okay, I’ve been playing around with this a lot more :slight_smile: I found the get bone property node extremely useful. This helped with a lot of my vector issues.

I was playing around with the custom scripts, and I managed to get the input read and working, but do you have an example of how to add an output within a custom script? (also this is amazing that these scripts can ship with a node tree when appended into more scenes!)

I’m glad you found a solution. By the way, after re-reading your post I realised why the driver node was not working for you.
The datapath has to be the datapath of the bone, not the datapath to the property you want to be driven. You specify the name of the property in the “Property” socket. And right now that node does not support drivers for only one channel of a property, like you wanted. I’m now working on a reworked/advanced version of that node that should support that, and adding multiple variables and selecting the driver type etc.

For the outputs to appear, you have to create a variable outside any scope inside the script.
for example, just placing this in the script should let you add an integer socket as an output. I haven’t touched this node in a while, let me know if it’s not working.

my_output = 1

Only some types are supported right now(strings, integers, floats, vectors, objects and lists). And be careful with returning an objects that has not been created inside the tree as it can mess things up if you try to edit them later in the tree.

1 Like

Thanks for replying! I’ll play around with some more drivers.
I was adding them to some constraints today and they we’re working perfectly.

I just tested the script! Thanks this worked perfectly! Thank you so much for getting back to me! This is a great feature. I’m playing around with a full human rig right now.

1 Like

@levelpixellevel
The new driver nodes are now working. Here is how they look like:

I think I exposed every single property in the nodes, so there should be no limits as to what you can do with drivers now.

I haven’t made a release yet, but if you want to test it you can download the “develop” branch from my repository. I want to keep cleaning a bit the code, try to find bugs etc. If you find any please tell me.

I uploaded the new version

Added

  • Lateral panel for showing node tree options (in the “Item” tab)

  • New Node Tree Options:

    • Show Execution Times
    • Auto Update
    • Show “Hide” toggle in nodes
  • New Nodes:

    • Drivers:
      • Add Driver Complex
      • Setup Driver
      • Setup Driver Variable
    • Vector:
      • Break
    • Bones:
      • Bone to datapath
      • Does Bone Exist
    • Constants:
      • Enum
    • String:
      • To String
    • Utilities:
      • Is Subtree

Changed

  • Update sockets button moved from the nodes to the side panel

Removed

  • Custom reroute node (trees using the old and removed custom reroute node will not behave properly until those nodes are removed)