Can I convert a modular control rig into a normal control rig?

hey,
so, i´ve made a few attempts at learning how to build my own control rig from scratch, but never finished due to running into problems and not having enough time to fix it.

Now I made another attempt with the new modular control rig.
I had to do a bunch of work in my dcc to make the skeleton I work with work with the modular rigging logic and I´ve finally set it up.
But I´m struggling with customizing it further and using the modular control rig system seems a bit overkill for my task, as I only need to do this once, if I do it right…

So, the maybe dumb question is:
Can you “convert” a modular control rig asset into a “normal” control rig asset?
Of course I can just open the endresult in the control rig editor, but the logic of obtaining names/adding sockets and connectors etc is a bit above what I understand so far and I´d just like to make some very simple changes, like adding a single control to ONE extra joint or adding some morph target controls etc.

Maybe the solution is very simple and I´m just overthinking this, any pointers would be greatly appreciated!

If you try looking for modular control rig stuff on youtube you just get the same “this is new and this is how it works which is also already documented very well in the manual and not actually hard to do at all if you need zero customisation and work with the standard unreal rig”…:slight_smile:

Don’t have an answer for you, but creating custom modules is pretty much the same.

Here is a video I found very helpful in case you decide to continue with modular CR: https://www.youtube.com/watch?v=eMRmLnqd8sw

Yeah, its not.
Problem is: When you start with the existing modules, they all build on each other.
So, namespaces/connectors etc are defined ANYWHERE in any of these existing modules and they are rather complex.

Even adding an existing module like “Add control” doesn´t simply let you pick an existing parent in the rig, its telling me that its missing a connector.

I was able to follow along with some control rig tutorials on how to add controls to bones etc, but doing this on top of the existing modular rig modules seems a very daunting task…

Thanks for the link though, if I have enough time it will definitely help dissecting the existing rig modules so I can figure out where I need to add what in order to just connect ONE more bone with ONE more control to my setup…

Seems like a bit of an oversight to not make this particular process a bit easier, as I think thats the first thing people would need, after getting the core rig to work…

I mean, especially because the rest works really fantastical for non-riggers (as soon as you figured out naming and hierarchy prerequesites).

I suggest you watch the video when you get a chance.

Yeah, I watched it, like I said, I love the dev channel, he does have the best videos available on the subject.

Unfortunately, I just can´t it to work for what I need to do.
I just want to add a jaw control to the head and I can´t get the control to get parented to the head control, which is being created by the neck module and I just don´t understand wether thats something I´d need to set up differently in the custom jaw module or if it would need to be set up in the neck module (maybe because I need to set up an extra connector directly for the head bone).

If it’s of any help, here is a quick way to get it working:

  • Added this to neck module:

  • For the jaw module: 3 connectors added (Root = Socket, Jaw = Bone, Parent = Control)

  1. Connection Graph:

  2. Construction Graph:

  3. Forward Graph:

Assign it to the head socket and this should be the result:



MCR


Note: also trying to figure this out myself. :upside_down_face:

Oh ■■■■, thanks for trying this out and documenting it like this, looks like its working as intended!

Just for clarification:
You added the jaw socket part to the neck module, could you also just spawn the socket directly in the modular control rig hierarchy (details panel), or would that not be recommended?
Because thats how I tried to connect it. I could add the module to that socket, but no idea if thats “allowed” with the modular system.

The graph actually doesn´t look that different from what I was doing, really curious which part made mine not work…

Hm, I still cannot get it to work.
When I drag the jaw module on the head connection, the only connection popping up is a bone and when I drop it, it just doesn´t resolve.

Ok, I think I found the problem.

One of the tricky parts with the connectors is, that you can manually drag them around and drop them on any bone or control in your rig, which looks like you “parent” them (is that the case though?).
AND you need to set the type rules there as well. They are like variables, but don´t show up under the variables, thats still a bit confusing to me and can easily be overseen.
There is also a “Root” named circle above the rigs root bone, which is confusing, as its NOT the same as the “root connector”, that by default I think is on the side of this “Root” circle thingy.

In your screenshot it looked like you had your root connector “parented” to your head bone and I THINK it started working for me, when I dragged it back from the head bone to the “root” connector of the control rig module, that gets created automatically.
But as always, I keep fiddling around with more than one thing and end up not being sure what exactly “fixed” it for me then.

I MAY also have not set the type rule on the root connector correctly to “socket”…

I just tried and dragged the connector back onto the head bone, as I had originally done and it still worked, so I guess it was the wrong type rule.

Either way, thanks again sooo much, I wish there were more people replying with screenshots and everything as you did!

1 Like

We can, but in this specific case we search for a control that is spawned in the neck module. To my understanding the module hierarchy is the only way we have to guarantee that the neck module creates the control before the jaw is able to search. Source.

Idealy it shouldn’t matter where it is as long as the module is built in a way that is able to search the hierarchy. You can work in the root or with no preview skeleton and it should work exactly the same when applied. It’s just there to help us visualize.

That’s why I pay attention to how the modules behaves in the module rig and pretty much ignore the preview in the module.

I wish there was a button to rebuild the rig in the module rig window; delete everything and execute all Connector events.

It is recommended to give the Primary Connector the Socket Type Rule.. I’ve personally found that sockets created by modules make the hierarchy organization easier and consistent.

It helps to understand the execution order.


Something that I personally struggled to understand: “Candidates” is a list of the created modules/controls/sockets/etc. If we want the jaw to access the neck module, we should make sure its executed after, and for that we make it a child.

The Connector pin in the Get Candidates node is just the current being innitialized. That’s why we have to compare against every connection to work with each:


In short seems like the Connector event is execute once per connection in the module. So it gets called multiple times per module and we have no choice but to incur in the branch costs in every iteration.


Hope this answer some of your questions. I could be mistaken, though. Anyone is more than welcome to correct me. :pray:

Yeah, thanks for clarifying.
I noticed something wonky that might also be explained by that, at some iteration, when I tried to add the jaw module and it couldn´t resolve the parent connector, it also added itself twice.

Anyways, it works now, now I´m trying to figure out how to also control some morph targets with it.
I´m justing the jaw bone in various skeletal meshes referencing that control rig as a skinned bone, but for the body mesh, the Jaw opening actually is done via a morph target.
So, I figured out how to set the curve value using the quaternion rotation of the jaw control, its probably a bit messy, but in theory it works:
I can control any morph target on the mesh with any control I set it up on:

So, I´m picking the jaw control axis for up down, then convert the value to euler value and divide that by the rotation limit I set on the control.
This way I can make sure that the maximum open of the jaw bone for the skinned meshes corresponds to the maximum open of the jaw morph target.

The problem right now is that I can´t for the life of me figure out how to reimport the skeletal mesh with its new jaw morph target and also show up in the editor with the correct curves…

On a different skeletal mesh, referencing the same skeleton, when I reimport it, it actually reimports the correct morph target, but i can´t import the curves from the skeletal mesh I imported the skeleton from.

They are both literally using the same source file, thats something I really don´t understand.
I´ve only read that you actually need to delete and reimport the skeletal mesh, so the new morph targets show up, that seems really counterintuitive and not very reasonable for iterative development…
Any idea whats going on there or how to get this working correctly, without deleting the skeletal mesh?

Just to confirm: It DOES work if you reimport it without using the skeleton.
So: Import under a new name, then consolidate the old skeleton with the new skeleton and now all morph targets show up correctly.

Still seems very counterintuitive and unnecessarily complicated, but at least it works now.

Managed to also set it up so the jaw control drives bothe the bone AND the morphtarget.

1 Like