LunaNotes

Download Subtitles for Rigging with Matrices - Part 02 FK Tutorial

rigging with matrices - part02 - fk

rigging with matrices - part02 - fk

Jean-Paul Tossings

1323 segments EN

SRT - Most compatible format for video players (VLC, media players, video editors)

VTT - Web Video Text Tracks for HTML5 video and browsers

TXT - Plain text with timestamps for easy reading and editing

Subtitle Preview

Scroll to view all subtitles

[00:00]

First we will build a guided FK control

[00:03]

rig. We will build the controls from

[00:06]

nersps circles and uh nerp circles like

[00:10]

every other geometry type in Maya is uh

[00:14]

if you look at the outliner and show

[00:16]

shapes you have like the the shape

[00:19]

object which has the actual shape data

[00:22]

of the ner curve and uh it is parented

[00:25]

under a transform node. So when you

[00:28]

select anything in a viewport, you

[00:30]

always select the transform node, not

[00:32]

the shape itself because the shape

[00:33]

cannot be manipulated. So cannot be

[00:36]

translated, rotated or scaled, but the

[00:38]

control can. And the transform node of

[00:42]

this control um has a few inputs and

[00:46]

outputs. So basically everything you can

[00:49]

translate, rotate or scale within the

[00:51]

Maya interface is based on a transform

[00:54]

node. The transform node is basically uh

[00:57]

a user interface for manipulating

[00:59]

matrices. A transform node outputs a

[01:02]

matrix uh and that is used to uh

[01:05]

manipulate the data and build

[01:08]

hierarchies. So there's a few inputs of

[01:10]

course there's the translate, rotate and

[01:12]

scale. Uh it also has a shear which is

[01:15]

tucked away in the uh attribute editor.

[01:18]

You can find it here. Um and as well it

[01:22]

has some pivot uh offset options in the

[01:26]

attribute editor. Uh and all these

[01:29]

translate, rotate, scale, pivot and

[01:31]

shear values are used to compose

[01:34]

matrices like I demonstrated in my

[01:37]

matrix video. And all these matrices

[01:39]

multiplied together will uh create the

[01:42]

matrix output plug for the transform

[01:45]

node as well. Since my 2020 with the

[01:48]

matrix workflow update uh another input

[01:51]

uh attribute has been added to the every

[01:53]

transform node which is the offset

[01:55]

parent matrix node. So if you do show

[01:58]

all attributes and then filter on matrix

[02:02]

you will see the offset parent matrix

[02:04]

which is basically another matrix plug

[02:07]

but an input plug. uh and what this is

[02:10]

used for uh after composing the uh local

[02:14]

matrix it is multiplied with the offset

[02:17]

parent matrix before multiplying with

[02:20]

the parent matrix of the parent object

[02:23]

of this uh transform node. So if this

[02:26]

would be parented under another node um

[02:30]

the matrix is multiplied with the offset

[02:32]

parent matrix and then multiplied with

[02:34]

the word matrix of the parent node. So

[02:38]

that's for the input uh plugs. Then

[02:40]

there's a couple of output plugs. Uh the

[02:43]

matrix uh plugs is like I just said and

[02:46]

then you have uh the local DAG matrix.

[02:50]

This is the the cached matrix that is

[02:53]

the matrix multiplied with the offset

[02:55]

parent matrix. So it has been premputed

[02:59]

uh and uh cached uh by Maya on the node.

[03:03]

And then you have the world matrix which

[03:06]

is also a cacheed uh matrix which is

[03:09]

basically the dag local matrix

[03:11]

multiplied with the parent world matrix

[03:14]

that will result in the world matrix of

[03:16]

this node. And then the parent matrix is

[03:19]

also a convenient plug which is just

[03:22]

basically a copy of the cached world

[03:25]

matrix of the parent node. And then all

[03:28]

these matrices also have their inversion

[03:30]

counterpart available uh as precomputed

[03:34]

uh um plugs on the trans on the

[03:37]

transform node. So that being said,

[03:42]

um if we want to uh construct a FK uh

[03:47]

control chain, before you used a an

[03:51]

extra buffer uh transform node in the

[03:54]

hierarchy to create an offset between

[03:56]

the controls while maintaining their

[03:59]

zeroed out rotation, translation and

[04:01]

scale. So for example the lower arm

[04:04]

control it would group the group it and

[04:08]

then parent it under the upper control.

[04:11]

Um and then we call this something like

[04:14]

buffer and we can set the translation

[04:17]

and rotation on the buffer group. Uh and

[04:21]

then the control will remain zeroed out.

[04:24]

Uh but since the introduction of the

[04:26]

offset parent matrix plug, we don't need

[04:28]

this buffer group anymore because we can

[04:30]

set the buffer matrix values on the

[04:33]

offset parent matrix. So we can directly

[04:36]

parent the control under the upper arm

[04:39]

and then of course zero out the

[04:44]

transformation. And if we go to this

[04:47]

node now the lower arm and if we in the

[04:51]

attribute editor go to the uh offset

[04:54]

parent matrix u area. We can look at it

[04:58]

in the composition uh tab which

[05:01]

basically shows the decomposed matrix in

[05:04]

its translate rotate scale and shear

[05:06]

values. uh or you can look at the matrix

[05:09]

um representation which basically just

[05:11]

shows the basis vector x basis vector y

[05:14]

basis vector z and the translation

[05:16]

vector. So this is the actual matrix

[05:19]

values that are stored in this matrix

[05:22]

and Maya offers the composition tab for

[05:25]

convenience because it is difficult to

[05:27]

enter a rotation in the matrix

[05:30]

form. So we can now for example just set

[05:33]

the translation offset to three and

[05:36]

maybe add a rotation on the

[05:40]

y of - 455. So now we have a direct

[05:46]

hierarchy with zeroed out translation

[05:49]

transformation uh and the buffer is

[05:52]

stored in the offset parent matrix plug

[05:55]

and we can do the same for the uh hand

[05:57]

control.

[05:59]

Um, I'll use the uh parent relative mode

[06:04]

so it's parented and Maya doesn't uh

[06:08]

recomputee the uh transformation to keep

[06:10]

its original uh location. You can also

[06:13]

just parent it and then reset it to zero

[06:15]

but it's the same uh the end result is

[06:17]

the same. And for this as well in the

[06:20]

attribute editor let's say we put the uh

[06:22]

translation buffer to three on the

[06:26]

x-axis. So now we have a control

[06:28]

hierarchy with zeroed out control

[06:31]

transformations

[06:32]

uh which is uh basically a simple FK uh

[06:36]

chain setup. However, this is not very

[06:39]

user friendly because if you want to

[06:42]

change the uh the position of the

[06:45]

controls, you have to go to the offset

[06:47]

parent matrix and then manually enter

[06:50]

the values here to change it. then it

[06:52]

can be very difficult to align to a

[06:54]

specific position in the workspace to

[06:56]

align with the model for example. So

[06:58]

what we can do is we can make a guide

[07:00]

hierarchy as well. Uh let me just

[07:05]

unhide my

[07:09]

guides.

[07:11]

So I have created a a hierarchy of uh

[07:16]

locators. So if we were to well for

[07:20]

example create the

[07:22]

same

[07:24]

orientation as the uh that we set on the

[07:31]

controls like so what we can now do is

[07:36]

because these guides are parented in the

[07:39]

same way that the controls are parented

[07:43]

um their local matrices if we add these

[07:47]

to the

[07:50]

graph. For example, the hand lower

[07:54]

upper. If we now look at the uh

[07:58]

lower guide, the matrix output plug is

[08:02]

its local matrix relative to its parent.

[08:05]

So, relative to this guide. So, its

[08:08]

local matrix is the buffer matrix. So

[08:11]

what we can do we can just take the

[08:14]

matrix output and plug it directly into

[08:16]

the offset parent matrix. You see

[08:18]

nothing changes and the lower control

[08:22]

now has a connection in the offset

[08:24]

parent matrix which is the same as

[08:26]

before but now it is derived from the

[08:30]

locator or the guide. So we can do the

[08:33]

same for the hand. If we take the matrix

[08:35]

output plug and plug it directly into

[08:36]

the offset parent matrix,

[08:39]

um the offset parent matrix plug by the

[08:42]

way is not always visible. Uh if you

[08:45]

create a new note, for example, a new

[08:48]

transform node, uh which is basically

[08:50]

the same as making an empty group, uh

[08:53]

it's all just transform node. If you

[08:56]

press uh four, it is not visible. If you

[08:59]

press three, it's also not visible. uh

[09:02]

which is kind of annoying because it's a

[09:04]

very important plug. But what you can do

[09:06]

is just

[09:07]

uh right click and choose show all

[09:12]

attributes. If Maya lets

[09:15]

me show all attributes and then filter

[09:18]

by matrix then it's available. So that

[09:22]

way you can uh connect to it or you can

[09:24]

just if you don't do this and you have

[09:28]

this view, you can just basically go to

[09:30]

the look through the list and select it

[09:34]

that way. But it's kind of annoying that

[09:36]

it's not visible by

[09:38]

default. Okay. Um we for completeness uh

[09:42]

for this doesn't change because the

[09:44]

upper control is at the world origin.

[09:46]

But still uh we can do the same for the

[09:49]

upper. we can take the matrix plug and

[09:51]

plug it into the offset parent matrix of

[09:54]

the upper

[09:55]

control. So now we have a uh a buffer

[10:01]

hierarchy of guides. And the nice thing

[10:03]

about this is that because the guides

[10:05]

are will never be time dependent because

[10:07]

only the controls will be animated.

[10:10]

These uh transformation matrices of

[10:13]

these guides will only be calculated on

[10:15]

scene open. After that they will never

[10:17]

change. So they will never be updated.

[10:20]

So um they are not contributing to the

[10:24]

uh performance of the rig.

[10:27]

And now we can change control rig

[10:32]

um by adjusting the guides and the

[10:34]

controls will follow. And so we have an

[10:37]

adjustable uh FK uh control

[10:41]

rig. But the downside of this uh control

[10:44]

setup is that still if you select the

[10:46]

parent control um all the child controls

[10:50]

get selection highlighted. So it's never

[10:52]

completely clear uh or readable what

[10:55]

controls are selected. So to this end I

[10:58]

like to flatten the control rig to

[11:01]

prevent this selection highlighting

[11:04]

issue. But if we now just simply

[11:08]

unparent the

[11:11]

controls then Maya of course compensates

[11:14]

by setting the uh transformation values

[11:17]

so they keep their same world space uh

[11:19]

transformations. And if

[11:21]

we reset

[11:24]

them, so we have the upper lower and

[11:28]

hand uh of course then the the rig

[11:31]

doesn't work anymore because there's no

[11:33]

connection anymore uh between the

[11:35]

controls. So how we can fix this is by

[11:39]

adding the world transformation matrix

[11:43]

of the up control to the offset parent

[11:46]

matrix of the lower control. Since we

[11:49]

have broken the parent child hierarchy

[11:52]

in the outliner, we have to reconstruct

[11:54]

a parent child hierarchy. So we have to

[11:56]

reconstruct it in the node editor. And

[11:58]

we can use the mult matrix note for

[12:01]

this. So if you create a mult matrix

[12:05]

node, this basically uh multiplies

[12:07]

matrices together. So if you have a

[12:10]

hierarchy

[12:12]

uh all these transformation nodes are

[12:13]

basically matrices and the matrix of

[12:16]

this uh object will be multiplied with

[12:19]

the matrix of its parent and that will

[12:21]

be multiplied with the matrix of its

[12:23]

parent and the end result is the world

[12:25]

matrix of this object. So we can do the

[12:28]

same in the outliner. Um we can just

[12:31]

plug in matrices into the milk matrix.

[12:34]

And if we plug in the child and then its

[12:38]

parent and then its grandparent then the

[12:40]

output will be the world uh space matrix

[12:43]

of the

[12:44]

child. So the

[12:48]

order is upside down. So if you have the

[12:51]

transformation order of multiplication

[12:53]

order going from top to bottom in a

[12:56]

hierarchy in the outliner the matrix

[12:58]

multiplication order of the mil matrix

[13:00]

is from top to bottom. the first input

[13:02]

matrix is multiplied with the second and

[13:04]

then with the

[13:06]

third. So that's something to keep in

[13:08]

mind.

[13:10]

So if we now want to recreate the

[13:13]

hierarchy in the note editor, we can say

[13:17]

that the matrix output of the lower FK

[13:21]

guide that would be the child of the uh

[13:26]

upper

[13:28]

control because the buffer in in a

[13:30]

hierarchy the lower FK control would be

[13:34]

uh parented under a buffer and the

[13:36]

buffer would be parented under the upper

[13:37]

FK control. So the child would be the uh

[13:42]

buffer which is the guide and then uh

[13:46]

well Maya doesn't display the second

[13:48]

plug uh by default. So you have to press

[13:50]

one and then three for the second plug

[13:52]

to uh show up in the array. So if we

[13:55]

then take the world space matrix of the

[13:59]

parent and plug it into the second plug.

[14:04]

And if we now take the output of the

[14:06]

melt matrix which is the guide or the

[14:09]

buffer matrix multiplied with the world

[14:12]

space of the parent control. If we plug

[14:15]

that into the offset parent matrix of

[14:18]

the lower control, then now the control

[14:21]

still has the the same orientation and

[14:24]

offset and the parent control moves the

[14:27]

uh lower control. So you can basically

[14:31]

see this as follows. The local matrix of

[14:35]

the object is a child of the matrix that

[14:38]

is the offset parent matrix. And the

[14:41]

offset parent matrix is constructed from

[14:43]

the guide or the buffer being a child

[14:46]

because it's the first block of the

[14:49]

upper. So now we can rename the mod

[14:52]

matrix node.

[14:55]

Um so I'll always use this call this

[14:58]

world matrix because this is the world

[15:01]

matrix basis position for the FK

[15:05]

control. So we can do the same for the

[15:07]

uh hand control. We can make another

[15:10]

modem matrix

[15:16]

node and then we can use

[15:19]

the matrix plug from the guide aka

[15:23]

buffer. Then refresh the inputs and then

[15:27]

we take the world matrix plug from the

[15:30]

lower FK

[15:32]

control. I plug it into the second. So

[15:36]

the buffer is multiplied by the uh world

[15:39]

matrix of the lower FK control. And then

[15:42]

we take the result and plug it into the

[15:44]

offset parent matrix. And then the hand

[15:47]

control also has the same orientation as

[15:50]

the guide.

[15:51]

And its parent drives the

[15:56]

control. And now we can adjust the

[15:59]

guides and the rig will

[16:02]

follow however we manipulate it and

[16:06]

still work as intended as a

[16:10]

whole. But the downside of this if we

[16:13]

would have aligned this to our model and

[16:16]

the hand would be nicely oriented and

[16:20]

positioned in the wrist but the shoulder

[16:22]

was off and we need to adjust it. We

[16:25]

cannot change the position of the parent

[16:28]

guide without affecting the child guide.

[16:30]

So then we have to redo the the hand

[16:33]

position which is kind of annoying. Of

[16:35]

course, we can unparent the guide and

[16:41]

then

[16:43]

change the the guide of the upper and

[16:46]

then reparent it and then the rig will

[16:50]

uh realign itself uh and now still

[16:54]

function as intended. But this is kind

[16:56]

of a well stupid way to adjust it and

[16:59]

it's uh uh prone to errors. So let's

[17:04]

look at another way to set this up

[17:06]

correctly. So if we want to have a um a

[17:10]

way to change a parent guide without

[17:13]

affecting its children, we have to ditch

[17:17]

the hierarchy in the outliner for this

[17:19]

uh as well. So let's just unparent the

[17:23]

guides as well and reorder them so that

[17:26]

they're in the correct order. Uh now of

[17:29]

course the rig is broken because the uh

[17:32]

we're using the um matrices of the

[17:36]

guides as buffers but now the these

[17:40]

objects are in world space. So their

[17:42]

world space um transformations will be

[17:45]

used as buffer and they're not relative

[17:47]

to the parent. So if we want to recreate

[17:50]

the local matrices relative to the

[17:54]

parent guide, we can do this by using

[17:58]

the inversia world matrix.

[18:03]

If we create another milk matrix

[18:07]

node

[18:09]

and if we want to create recreate

[18:13]

the lower lower guide matrix or its

[18:17]

local matrix relative to its parent

[18:20]

guide. We can do this by taking the

[18:24]

world matrix of the lower

[18:27]

guide and plug it into the first plug of

[18:30]

the mode matrix

[18:33]

node and then refresh the input list.

[18:36]

And if we now multiply this world matrix

[18:39]

of this guide with the inversion world

[18:42]

matrix of the guide that is its parent

[18:45]

then we get the local matrix or aka the

[18:49]

matrix that gets me from this matrix to

[18:53]

this matrix. So let's do this. Let's

[18:56]

take the world inversion matrix, plug it

[18:58]

into the

[19:00]

second

[19:02]

input. And now the output of this mil

[19:05]

matrix node is the local matrix as if

[19:09]

this guide were a child of this guide,

[19:13]

which they aren't in the outliner, but

[19:15]

we are recreating this parent hierarchy

[19:18]

inside the note editor with this melt

[19:20]

matrix node. So if we now take the

[19:22]

output of this melt matrix node and plug

[19:25]

it into the first input of the uh world

[19:28]

matrix uh melt matrix node, you see that

[19:32]

the control uh is or again aligned with

[19:35]

the

[19:36]

guide

[19:39]

and the control rig functions again like

[19:43]

it's supposed to be. the transformations

[19:45]

are still

[19:46]

zero and the uh hierarchy is now created

[19:50]

in the node editor. So this node

[19:54]

basically is the new offset parent

[19:57]

matrix or buffer matrix if you want. So

[20:01]

usually I call this something like

[20:04]

parent offset matrix or you could use it

[20:07]

uh a buffer matrix which doesn't really

[20:09]

matter but this is my uh acronym that I

[20:12]

that I always use. So we can do the same

[20:14]

for the uh lower uh guide. So if you

[20:19]

take another world matrix

[20:22]

note and we plug the world matrix of the

[20:27]

hand guide into the first plug of the M

[20:30]

matrix node and then because we want

[20:33]

this matrix as a relative matrix to be

[20:36]

lower we take the inversible world

[20:38]

matrix of this

[20:40]

guide. So take the inversible world

[20:43]

matrix of this guide, plug it into the

[20:46]

second plug, and then the output of this

[20:48]

matrix is the matrix that brings me from

[20:50]

this matrix to that

[20:53]

matrix. So we take the output and plug

[20:56]

it into the first input of the mode

[20:59]

matrix note that we have not named

[21:02]

correctly. So let's do that quickly.

[21:07]

It's the world matrix for the

[21:10]

control and this is

[21:15]

the

[21:17]

again I call it parent offset matrix. So

[21:20]

now you can see that the hand control is

[21:22]

also in the correct orientation and the

[21:25]

rig is still correctly functioning. And

[21:28]

the nice thing now is that we can just

[21:30]

reposition this control or this guide

[21:34]

without affecting the other guides and

[21:36]

the rig still functions as intended. So

[21:39]

now we have a nice way to adjust guides

[21:42]

without affecting its children. But now

[21:44]

we have a system that is quite difficult

[21:47]

to align. And if your rig is perfectly

[21:50]

aligned to the grid like this is, it's

[21:53]

relatively easy maybe to rotate the uh

[21:56]

guides so that they point to the next

[21:58]

control which you basically always want

[22:00]

in a rig. But if for example these have

[22:02]

arbitrary uh

[22:05]

positions and you want this control to

[22:08]

correctly aim with the x-axis to the

[22:12]

next control, it is almost impossible to

[22:15]

do by hand without using constraints of

[22:18]

some sorts. So let's automate this uh

[22:23]

alignment of the guides by creating a

[22:26]

new matrix based on the positions of the

[22:30]

guides. That is a matrix that has the

[22:33]

position of the guide but has the

[22:34]

correct

[22:37]

orientation. So first let's remove the

[22:40]

rotations because we're not going to use

[22:42]

the rotations of the guides and uh lock

[22:46]

them. And then we are going to use an

[22:49]

aim matrix to create a matrix that is

[22:53]

oriented in the correct way.

[22:58]

So let's create an a matrix

[23:03]

node and the upper guide oriented matrix

[23:08]

will be based on the upper guide. So

[23:12]

let's take the world matrix plug of this

[23:15]

upper guide and plug it into the input

[23:19]

matrix of the A matrix because this is

[23:21]

the matrix that we're starting with and

[23:23]

this is the matrix that we're going to

[23:26]

align. So now we want to point this

[23:30]

matrix with the x-axis to the next

[23:34]

control. So we take this uh lower guide

[23:39]

world matrix

[23:41]

and we plug it into the primary target

[23:45]

matrix. And if we look in the attribute

[23:48]

editor, you have the primary section

[23:51]

where we can align uh well the primary

[23:54]

axis or a primary axis and in the

[23:57]

secondary uh uh segment we can align the

[23:59]

the secondary uh uh axis. So we want to

[24:04]

align the x-axis. So if we have the 0 1

[24:09]

0 0 and that is multiplied by the uh

[24:13]

input matrix that gives us the x m

[24:16]

x-axis of the matrix. So this represents

[24:19]

the x-axis and then we want to aim it at

[24:23]

the matrix and if we use the aim mode

[24:27]

then uh this vector is multiplied with

[24:31]

this matrix to generate a point in space

[24:35]

in world space uh and that point is

[24:38]

aimed to. So if you would fill in values

[24:42]

here, uh you would create a a position

[24:44]

offset relative to this matrix. But we

[24:47]

don't want that. We wanted to point at

[24:49]

the origin of this matrix. So we'll

[24:51]

leave it at zero. So now uh we can

[24:55]

temporarily make a locator to visualize

[24:57]

this. So if we create a

[25:04]

locator and if we take the output matrix

[25:06]

of the A matrix and plug it into the

[25:09]

offset parent matrix, we can now see

[25:12]

that we have created a matrix that

[25:14]

points with the x-axis nicely to the uh

[25:17]

uh second uh control or second

[25:20]

guide. And now we want to align the

[25:23]

second axis, which I always use the

[25:25]

y-axis for. And I want to point it in

[25:29]

the direction of the elbow so that the

[25:33]

all the three controls will lay in a

[25:36]

plane uh which is a rotation plane of

[25:39]

the arm in this

[25:40]

case. So let's take the uh hand control

[25:44]

for this because the three guides

[25:47]

together uh define a a plane.

[25:51]

So if we take the world matrix of the FK

[25:56]

hand guide, plug it into the secondary

[25:59]

target matrix,

[26:01]

uh we again want to align the y-axis. So

[26:05]

0 1 0 gives us the y-axis and then the

[26:08]

mode is aim and we want to aim at this

[26:13]

um matrix. But now you can see that the

[26:18]

y-axis is pointing in the forward

[26:20]

direction. We want to point it in the uh

[26:23]

backwards direction. So we can just

[26:25]

basically simply flip the uh input axis

[26:30]

to get the negative y-axis to align. And

[26:33]

now we have the negative uh or the

[26:36]

y-axis pointing in the uh backwards

[26:38]

direction.

[26:40]

So now we have created an aligned

[26:44]

matrix. So if you were to create a a

[26:49]

plane and we would parent it under the

[26:52]

temporary

[26:53]

locator, reset its

[26:58]

transformation and have it

[27:01]

generate in the Z

[27:05]

axis and then scale this. You can see

[27:08]

that the plane nicely uh is aligned with

[27:11]

all the uh the guides and if we change

[27:14]

the guide position uh the orientation

[27:17]

plane uh nicely follows all the

[27:23]

positions. So let's remove this again.

[27:26]

So now we have created the new oriented

[27:30]

uh world matrix. So all connections that

[27:33]

previously you were going from the upper

[27:36]

guide, we will now reroute to use this

[27:39]

oriented uh matrix. So let's call this

[27:43]

the guide out world

[27:46]

matrix. We use the matrix plug because

[27:49]

but because this one is in world space,

[27:51]

the matrix is the same as its world

[27:53]

matrix. So the connection of this matrix

[27:58]

we can connect to the output

[28:01]

matrix of the oriented matrix. And now

[28:04]

the rig explodes and that is because we

[28:07]

are also using the inversia world matrix

[28:11]

of this guide to calculate the offset

[28:15]

matrix or the buffer matrix if you want

[28:18]

for the lower control. So we need to

[28:22]

have an inversion matrix of this

[28:23]

oriented matrix as well. And because

[28:26]

this is not a transform node, it is not

[28:28]

available as a plug. So we have to

[28:30]

create an inversion matrix

[28:33]

note. And if we now get the output of

[28:38]

this oriented guide matrix, plug it into

[28:41]

the input matrix of the inversion

[28:43]

matrix. And now if we take the

[28:47]

connection that is was coming from the

[28:48]

inverse world matrix of the upper guide

[28:52]

and connect it to the output of the

[28:54]

inversion matrix. You see that the

[28:57]

control now is uh back to its original

[29:00]

position or correct position. Uh and we

[29:04]

have an

[29:05]

oriented upper control. So this locator

[29:08]

we can remove it was just for a visual

[29:11]

cue. So if we now change the position of

[29:14]

the lower guide, you can see that the

[29:17]

upper control nicely follows and the

[29:20]

guide which we're only using the

[29:22]

position from is not oriented. But it

[29:25]

doesn't matter because we have created

[29:26]

the matrix the oriented matrix in the

[29:28]

node

[29:29]

editor. So let's call this

[29:33]

one the world inverse

[29:36]

matrix and do the same thing for the

[29:40]

lower arm.

[29:43]

So for the uh lower uh guide oriented

[29:47]

guide, we can make another in matrix

[29:52]

node and we plug the world matrix of the

[29:57]

lower FK guide into the input matrix

[30:01]

because that's the matrix that we're

[30:02]

going to

[30:03]

align. And then we want to aim the

[30:07]

x-axis to the hand

[30:09]

guide. So we take the world matrix of

[30:14]

the hand FK

[30:16]

guide, plug it into the primary target

[30:19]

matrix, and again we want the X-axis to

[30:23]

aim at this matrix. So that's set up

[30:29]

correctly. And let's make a temporary

[30:31]

locator

[30:34]

again and plug the output into the

[30:37]

offset parent matrix of the locator. So

[30:40]

now we can see that the x-axis is nicely

[30:42]

aligned to the hand

[30:45]

control. And then we need to align the

[30:48]

secondary axis, the y- axis again to

[30:50]

point in the backwards direction. So for

[30:53]

this we're going to use the guide of the

[30:56]

upper arm again to create this plane. So

[30:59]

we take

[31:01]

the world matrix of the upper

[31:04]

guide, plug it into the secondary target

[31:09]

matrix and then again we want it to

[31:12]

point in the backwards direction. So we

[31:15]

take the negative yaxis for alignment.

[31:19]

So minus one and we want to aim at this

[31:24]

uh guide. So now we have uh this one

[31:29]

oriented as well. You can see that they

[31:31]

nicely line into a

[31:35]

plane. So this is the

[31:39]

lower

[31:43]

guide out world

[31:48]

matrix. Um and then we can do the same

[31:51]

thing. So all the connections from this

[31:54]

guide we're going to substitute with

[31:56]

connections to the oriented matrix. So

[31:59]

we can take the uh world

[32:04]

matrix and plug it into the output

[32:07]

matrix and this one uh not this one

[32:11]

because this connection is used for the

[32:13]

orientation of this

[32:15]

uh um guide matrix and that's only using

[32:18]

the position. So we can leave that

[32:20]

connection and this connection is going

[32:22]

into the orientation itself. So and then

[32:28]

there's still this invers world matrix

[32:31]

connection that we need to

[32:33]

reroute to this matrix. So, we're going

[32:36]

to use another inverter

[32:41]

matrix and we're going to plug the

[32:44]

output into the input

[32:47]

matrix. And

[32:48]

then the connection from the world

[32:51]

inversion matrix, we're going to

[32:52]

reconnect to the output of the invers

[32:55]

matrix node. And we're going

[32:59]

to rename this world inverse matrix

[33:03]

whim.

[33:04]

And now you can see that

[33:08]

the guide or the control is uh nicely uh

[33:12]

uh oriented and also has the zero

[33:16]

transformations and the rig still works.

[33:20]

Uh we can delete the temporary

[33:23]

locator and now we can change the

[33:26]

position of the guide and the rig nicely

[33:30]

updates to follow the orientation of the

[33:33]

controls.

[33:36]

So there's only one thing left and

[33:38]

that's the orientation of the uh hand

[33:41]

guide. So there's two options. We can

[33:44]

just basically uh leave it as is because

[33:48]

a hand can have a different orientation

[33:50]

from the lower arm. Uh but for this

[33:53]

purpose I'm going to uh reorient the uh

[33:57]

guide to have the same orientation as

[34:01]

the uh as the lower uh oriented matrix.

[34:04]

So it points in the same direction uh

[34:07]

and it's basically just coming straight

[34:08]

out of the uh the lower arm. So for this

[34:13]

we can use uh uh reuse the oriented

[34:16]

matrix which is the output uh of the

[34:19]

lower guide uh a matrix and we basically

[34:23]

only have to reposition it to the

[34:26]

position of the uh hand guide. So we can

[34:29]

do this with a blend matrix note. So if

[34:31]

we create a blend matrix

[34:34]

node, we're going to take the output of

[34:39]

the aim matrix of the lower guide and

[34:44]

plug it into the input matrix. So if we

[34:47]

now create another temporary

[34:49]

locator, which is something I often do

[34:52]

to check my

[34:55]

matrices, you can see that it's at the

[34:59]

position of the uh lower arm and it has

[35:03]

the correct orientation, the same

[35:04]

orientation as the control because well

[35:07]

this is feeding the control. So now we

[35:09]

want to uh shift this matrix to the

[35:12]

position of the hand. So we can

[35:14]

basically just say okay take the matrix

[35:18]

of the hand guide plug it into the

[35:22]

target matrix uh slot for target zero

[35:25]

and then in the attribute editor at the

[35:28]

target matrix uh parameters we can just

[35:30]

say okay I want everything except for or

[35:33]

I only want translation so I'll just

[35:35]

remove the share rotate and scale

[35:37]

weights set them to zero so I only blend

[35:40]

the

[35:41]

translation and blend it 100% %. So now

[35:45]

you can see that the guide is uh at this

[35:48]

position or the locator is this position

[35:51]

of the hand but has the same

[35:53]

orientation. So now we can call this

[35:57]

the

[36:00]

guide outworld matrix and we can use

[36:04]

this to substitute the connections from

[36:06]

the uh hand

[36:08]

guide. So the uh world matrix uh plug

[36:14]

that's going into the parent offset

[36:16]

matrix for the uh hand

[36:18]

control. We reroute this to the output

[36:22]

of the oriented

[36:24]

uh guide and uh there is no connection

[36:29]

from the invers matrix because there is

[36:31]

no child to this guide. Um, so we can

[36:35]

remove the locator. And now you can

[36:37]

already see that the uh hand control is

[36:40]

nicely oriented in the same uh

[36:42]

orientation as the uh lower arm. And if

[36:45]

I now change the guide, you can see that

[36:47]

the controls uh nicely realign

[36:49]

themselves.

[36:52]

And we have a working realignable uh FK

[36:56]

control setup this

[36:58]

way which also keeps working uh if you

[37:02]

adjust

[37:05]

it. So to summarize we just basically

[37:08]

have used the positions of the guides

[37:11]

and created a new oriented matrix for

[37:14]

every guide. So you can uh if you ignore

[37:18]

the uh bunching up of control connection

[37:21]

lines basically this is the upper guide,

[37:24]

this is the lower guide and this is the

[37:26]

hand guide and the inversion

[37:29]

matrix which we created from them and

[37:33]

that feeds into the uh control setup. So

[37:37]

if we align them nicely, you can see we

[37:40]

have the the buffer or parent offset

[37:43]

matrix that feeds into the n matrix that

[37:46]

multiplies it with the world matrix of

[37:48]

its parent control and then feeds into

[37:50]

the control. And the same happens for

[37:53]

the lower. You have the buffer or parent

[37:55]

offset matrix. It multiplies with the

[37:59]

world matrix of its parent and then

[38:01]

feeds into the control. And for the uh

[38:04]

upper

[38:05]

uh control

[38:09]

um we only have just the connection

[38:12]

because it doesn't have a uh a parent uh

[38:15]

where it moves with. But if you would uh

[38:18]

have like a main control or it's

[38:20]

attached to the shoulder, you would have

[38:22]

the same uh setup as this but then

[38:25]

connecting to the guide of its parent.

[38:29]

So if this is difficult to imagine, you

[38:32]

can always uh just for debugging

[38:36]

purposes use a a locator in between so

[38:39]

you can see the reoriented

[38:41]

guides. But this is basically the setup.

[38:44]

It's simple and it's fast and it's

[38:46]

adjustable. However, there is still

[38:48]

something that it's not very nice about

[38:51]

this setup. For example, if I set the

[38:55]

guides of the upper and

[38:58]

hand on the X-axis of the world matrix

[39:03]

and just for visual purposes create a a

[39:08]

plane again. So, oriented in the Z

[39:13]

direction and

[39:17]

then remove this.

[39:20]

And let's take the output of the

[39:23]

oriented upper guide and plug it into

[39:25]

the offset parent matrix of the plane

[39:29]

and then scale

[39:31]

it so we can see the orientation plane

[39:35]

of the arm. If we now take this elbow

[39:40]

and for example make a straight

[39:43]

arm then the alignment well the elbow

[39:48]

points upwards uh and maybe we want it

[39:51]

to point backwards. So if we now move

[39:54]

the elbow just a little bit, the

[39:58]

orientation plane plane flips. And if we

[40:01]

translate it up or down, the orientation

[40:04]

plane well goes berserk because it's

[40:07]

aligning the orientation plane based on

[40:10]

these three points. So in this setup

[40:12]

it's very difficult to create uh an

[40:14]

almost straight or straight arm and then

[40:17]

correctly uh orient the rotation plane

[40:21]

of the arm. So to circumvent this we can

[40:25]

use another extra guide to orient the

[40:30]

orientation plane of the arm and then

[40:33]

constrain the lower arm guide to this

[40:37]

plane. So let's do this. Let's create

[40:42]

another guide and let's call this one

[40:46]

the

[40:48]

um ball

[40:52]

vector vector guide and the guides.

[40:58]

Well, they don't need FK in the name.

[41:00]

So, let's remove it. I use that when I

[41:03]

copy them. But we're going we're going

[41:06]

to use the guides for FK and IK as well.

[41:10]

Um

[41:12]

so let's position this

[41:16]

uh here for

[41:17]

now. So now we are not going to use the

[41:21]

three guides uh to orient the uh

[41:24]

rotation plane but we're going to use

[41:26]

the upper the hand and the pole vector

[41:29]

to orient the rotation plane. So, we're

[41:33]

going to swap the input of the uh aim

[41:39]

matrix. So,

[41:41]

let's position

[41:43]

them a little bit more friendly. So,

[41:47]

this now is the pole vector guide. So,

[41:51]

now we need to create an extra aim

[41:54]

matrix to generate the matrix that is

[41:58]

the orientation plane of the arm. So

[42:01]

let's create another A

[42:04]

matrix. Um, and we're going to use the

[42:08]

upper guide uh for this as a starting

[42:12]

position. So we take the world matrix of

[42:14]

the upper guide and plug it into the

[42:16]

input

[42:17]

matrix. And then uh let's just directly

[42:22]

plug the output into the rotation plane

[42:25]

so that we can see what's happening. And

[42:27]

then we want to aim it at the hand

[42:30]

because we're going to use the upper the

[42:33]

hand and the pole vector to define the

[42:37]

orientation plane of the arm rotation

[42:39]

plane. So it should point in the

[42:42]

direction of the hand guide and then use

[42:45]

the secondary axis to align to the pull

[42:48]

vector object.

[42:52]

So let's take the world matrix of the

[42:56]

hand

[42:58]

guide, plug it into the primary target

[43:02]

matrix and say uh x-axis align and then

[43:07]

use the aim and no offset. So this is

[43:11]

correct. And then now we're going to

[43:14]

take the world matrix of the pole

[43:16]

vector and plug it into the secondary

[43:19]

target matrix of the A

[43:22]

matrix and then we want to align the

[43:25]

Yaxis or maybe the negative Y-axis

[43:29]

again and then set it to aim. And now

[43:33]

you can see that the orientation plane

[43:36]

is now correctly aligned with the hand

[43:39]

and the uh P vector. So if we change the

[43:42]

pole vector

[43:44]

um and we change the hand the

[43:47]

orientation plane nicely

[43:49]

follows. But now uh we have defined this

[43:53]

orientation plane but the lower or the

[43:57]

the lower guide can still be moved

[44:01]

anywhere. It can be moved off the

[44:02]

rotation plane and we want to constrain

[44:05]

the movement of this guide to the

[44:08]

orientation plane. So what we can do is

[44:13]

uh make this guide

[44:16]

uh live in the space of the oriented uh

[44:20]

rotation plane of the arm. So what we

[44:23]

can basically do is just plug the

[44:25]

orientation

[44:27]

matrix into the uh guides offset parent

[44:33]

matrix. So let's see what happens. um

[44:37]

move

[44:37]

this out of the way. This is the uh

[44:42]

rotation plane. This is the pole vector.

[44:45]

So the output of the A

[44:48]

matrix, if we take that and we plug it

[44:51]

into

[44:52]

the offset parent

[44:54]

matrix of the lower

[44:57]

guide. Of course, now it's the position

[45:00]

changes because it has a new uh

[45:03]

parent. If we now set this to zero, you

[45:07]

will see that the position matches the

[45:10]

upper because we use the upper guide as

[45:13]

a basis for orienting the uh rotation

[45:18]

plane matrix. You can also see it if we

[45:20]

select this one. The origin of the

[45:23]

matrix is at the position of the upper

[45:25]

guide. So what we can now

[45:28]

do is

[45:31]

move the

[45:33]

elbow only in

[45:36]

the XY plane because as soon as we move

[45:40]

it along the Z axis, it breaks off the

[45:43]

rotation plane. And if we now change the

[45:47]

pole vector, the arm orientation plane

[45:51]

adjusts and the elbow guide still is a

[45:56]

child of this oriented matrix uh moves

[46:00]

in this plane. So we can lock the Z

[46:05]

translation. And now we can freely move

[46:08]

the guide in this space and always have

[46:12]

a nicely oriented arm and even make a

[46:16]

straight arm. Um although we can now

[46:19]

still move it in the wrong direction,

[46:22]

the opposite direction. So we can limit

[46:24]

the translate Y as well. So let's say in

[46:28]

the guide limit

[46:29]

section for translation we should limit

[46:33]

the y-axis to not be positive. So set

[46:37]

the max to zero and then we cannot

[46:41]

change it further than the straight arm

[46:44]

and we can make it uh well only bent in

[46:48]

the correct uh direction.

[46:53]

But

[46:53]

still now if we change the hand for

[46:56]

example, make it longer, maybe it should

[46:59]

be nice that the default position of the

[47:02]

lower guide would always be in the exact

[47:05]

middle of the upper and the hand. So we

[47:08]

can use another blend matrix to blend

[47:11]

the position of the guide so that its

[47:14]

default uh position if the values are

[47:18]

zeroed out is the nicely in between

[47:21]

position.

[47:23]

So, let's call this

[47:30]

one left arm

[47:39]

orient

[47:44]

guide.

[47:46]

And if we now make another blend

[47:52]

matrix and we plug the output of this

[47:55]

orientation plane matrix and plug it

[47:57]

into the input matrix. And then if we

[48:01]

take the hand guide because we want to

[48:05]

get in between these two. So we can use

[48:07]

this matrix for this position offset.

[48:10]

Plug it into the target matrix.

[48:14]

And if we now in the attribute editor uh

[48:18]

again disable the scale rotate and share

[48:21]

because we only want to blend the

[48:22]

position and we blend it 50%. So we get

[48:27]

halfway in between and we now plug the

[48:29]

output of the blend matrix into the

[48:31]

offset parent matrix of the lower guide.

[48:34]

The lower guide always is positioned

[48:36]

nicely in between the

[48:39]

uh upper and the hand.

[48:45]

And uh we can use the guide of the pull

[48:50]

vector to align the

[48:53]

uh orientation plane the rotation plane

[48:55]

of the

[48:57]

arm. Okay. So let's remove the plane

[49:01]

because we don't need it anymore.

[49:04]

And let's rename

[49:06]

this

[49:09]

to local guide world matrix because it's

[49:13]

the basis world matrix

[49:16]

uh

[49:18]

position. So now we have uh a redefined

[49:22]

setup where we can without a problem

[49:25]

create a straight arm and still orient

[49:29]

the uh create the orientation for the

[49:31]

arm correctly. And the lower guide is

[49:35]

now the only guide that is

[49:36]

already aligning to the plane because

[49:39]

we're using its uh uh orientation to

[49:42]

limit it to the rotation plane.

[49:50]

So the only downside to this setup might

[49:55]

be uh but this is a more of a preference

[49:59]

that if you for example move the uh uh

[50:02]

upper arm and you want to reposition it

[50:04]

a little bit more up that the

[50:06]

orientation of the arm changes. the it's

[50:11]

now pointing a little bit downwards and

[50:14]

if you want to keep it straight back you

[50:17]

have to also move

[50:19]

the pole vector guide. So you also also

[50:23]

have to take into account the position

[50:25]

of the pole vector always. So another

[50:28]

approach of this would be to skip this

[50:32]

uh extra pole vector guide and use an

[50:36]

axis of the upper guide to orient the

[50:40]

rotation plane in the aim matrix where

[50:43]

we define the uh rotation plane of the

[50:46]

arm. We are now uh using the pole vector

[50:50]

um as an aim position. We're aiming at

[50:55]

the position of the pole vector, but we

[50:57]

can just as well use the negative uh

[51:01]

z-axis of the upper guide as the vector

[51:05]

to align with. So, uh we can take the

[51:08]

world matrix output of the upper guide

[51:11]

and plug it into the secondary target

[51:14]

matrix. And then we can say okay we want

[51:18]

the still the negative y-axis to be

[51:21]

aligned but we do not want to aim it. We

[51:24]

want to align it with another vector and

[51:26]

that vector is the negative

[51:29]

zaxis of the upper guide. So the vector

[51:33]

that points in the backwards direction.

[51:36]

So now we can discard this pole vector.

[51:40]

And now if we use

[51:43]

this rotation again. So we

[51:46]

unlock the rotation again. If we now

[51:50]

rotate this, we use this vector or this

[51:54]

orientation of this guide to orient the

[51:57]

uh rotation plane of the arm.

[52:00]

So if

[52:01]

you have

[52:03]

this guide here for example in the arm

[52:06]

then now the

[52:08]

rotation is uh based on the orientation

[52:12]

of the upper guide. So rotation in the

[52:16]

side direction doesn't really do very

[52:18]

much. It's just the this part of the uh

[52:21]

vector. So the the negative z-axis that

[52:25]

defines the plane. So it's just two ways

[52:28]

to set it up. It's a preference. Um, the

[52:31]

end result is the same. Uh, it's just

[52:33]

another way of manipulating uh the

[52:36]

orientation of the rotation plane of the

[52:40]

arm. So, let's clean this up a little

[52:42]

bit. Um, for the controls,

[52:46]

um, we well, we can we can use

[52:50]

translation as well for the FK controls.

[52:53]

Maybe we can keep it. Um, I usually lock

[52:56]

the translation, but uh, let's leave

[52:59]

them unlocked for now. And scale. Well,

[53:02]

maybe we'll use it again. So,

[53:05]

just remove the

[53:07]

visibility. And for the uh, hand guide,

[53:10]

we're only ever going to use the

[53:12]

translation. So, we'll lock and hide the

[53:17]

rotation.

[53:19]

And for the uh elbow, we're only going

[53:22]

to use the X and Y translation because

[53:25]

it is constrained to the rotation plane.

[53:28]

So we can lock and hide these as well.

[53:31]

And for the upper arm, we are using the

[53:33]

rotation and the translation. So we'll

[53:36]

just use lock the uh

[53:42]

scales. And we're going to leave the

[53:44]

orientation setup as it is right now. So

[53:47]

we can remove the pole vector guide.

[53:49]

It's not

[53:51]

used. So now let's uh compound this into

[53:55]

a module. Um a rig module is something

[53:58]

that I use uh for limbs or legs or body.

[54:03]

It's it's basically a part of a rig that

[54:06]

is a um self-contained um part which

[54:11]

only has a few connections to other

[54:14]

parts. uh and the rest of the nodes are

[54:16]

only internally connected. So uh for

[54:19]

example, my bipad rig is com uh composed

[54:22]

of a few uh modules, the spine, the

[54:25]

head, neck, and an arm, shoulder, and

[54:29]

leg modules. And they're all connected

[54:31]

uh via matrix

[54:33]

plugs. So let's set up this arm as a

[54:36]

module and then create uh a root module

[54:40]

and connect these together to see how

[54:42]

that would work. So I can create all

[54:46]

groups by hand, but I'll just use

[54:48]

uh one of my tools to quickly um create

[54:53]

it. So let's call this arm

[54:56]

left. And basically uh this just creates

[55:00]

an hierarchy of um groups, the transform

[55:04]

nodes. Um, you have like the the module

[55:07]

uh uh group and it has a a setup um

[55:12]

group where I add some attributes that

[55:15]

are for initial setup of the rig. Um

[55:18]

that can be handy to quickly find some

[55:21]

attributes uh to set or change. So then

[55:25]

I have a group that's called inputs

[55:27]

which are basically the time dependent

[55:31]

uh inputs to a parent module as well as

[55:35]

the guide of that uh connection. So uh

[55:40]

I'll show this later on if I connect the

[55:43]

uh the root to this um module. But

[55:46]

basically this u parent in this case is

[55:51]

u for example the control of the parent

[55:55]

module where this module has to move

[55:57]

with and the parent guide is the guide

[56:00]

the oriented guide of that same control.

[56:04]

So I know the animated position or

[56:06]

change position and I know the the guide

[56:09]

position. Then the guides are basically

[56:12]

the guides for this module. So we can

[56:15]

move these into the guides group. Um and

[56:20]

then there is the controls group. Well,

[56:23]

it speaks for itself. That's where the

[56:24]

controls should go. And then I have a

[56:28]

rig nodes group which has every node

[56:31]

that is well part of the rig. for

[56:33]

example, IK handles or deformer um

[56:38]

diagnoses for for whatever for um

[56:42]

latises or bent deformers or and so on.

[56:46]

Then joints where the joints will be

[56:49]

placed in as soon as we create the

[56:51]

joints geometry. This is uh for support

[56:54]

geometry only. It's not the geometry of

[56:56]

the character itself. It's only for

[56:58]

intermediate geometry that is needed for

[57:00]

deformation. Uh helpers are visual um

[57:05]

yeah controllers or visual cues um

[57:09]

visible to the user but they don't have

[57:11]

any u driving capabilities to the rig

[57:15]

and then outputs it's kind of the

[57:18]

counterpart of the inputs which where I

[57:21]

can uh add uh nodes that have the

[57:25]

animation or the position of some

[57:28]

controller. For example, I could add the

[57:30]

uh hand control uh to the output or a

[57:34]

note that uh represents the position of

[57:38]

the hand control because as soon as we

[57:40]

use uh add not F IK uh controls to the

[57:44]

setup um the end result of the arm will

[57:47]

be a blend between the FK and the IK

[57:50]

position. So there will be a an output

[57:53]

matrix connected to a node to the

[57:55]

outputs and then as well the guide that

[57:58]

represents that uh orientation and

[58:01]

position in this dress

[58:03]

pose.

[58:05]

So let's uh add the uh root for example

[58:11]

maybe position the arm without that one

[58:14]

of course a little bit

[58:16]

higher. So, and now add

[58:20]

another let's call it

[58:23]

root. So I just get basically the same

[58:26]

module structure but now for root uh

[58:29]

let's create

[58:31]

um a

[58:33]

locator and put it in the guides and

[58:37]

call it root

[58:40]

main

[58:42]

guide and then add some quick

[58:48]

controls for this uh

[58:54]

uh like

[58:57]

so and add it to the

[59:00]

controls and call

[59:03]

this main

[59:08]

control.

[59:10]

Um yes. So now in

[59:14]

the graph note editor, let's just clean

[59:18]

this up a little bit.

[59:24]

and add it maybe to a different tab. So

[59:26]

the guide and

[59:28]

the control can be connected directly.

[59:33]

In practice the the the control the root

[59:37]

control of a rig will most of the

[59:40]

times stay on the origin of the of the

[59:43]

world. But I have also encountered uh

[59:46]

many times that for example for bipads

[59:49]

that the character was modeled not

[59:50]

center to the uh origin. So the front

[59:55]

legs were here and the back legs were

[59:56]

here. So then the uh the the root

[60:01]

control logically would be placed uh in

[60:04]

between. So to make that uh possible we

[60:07]

could just basically uh grab the world

[60:10]

matrix of the

[60:12]

guide and plug it into the uh offset

[60:16]

parent matrix of the root control or the

[60:20]

main control. And if we now

[60:23]

uh I'll just

[60:27]

quickly change the color. This is

[60:29]

basically a script that sets the uh draw

[60:32]

color overrides on the uh note. So if

[60:35]

you go to draw overrides, I just

[60:37]

basically set these values, enable

[60:39]

override and set the color index. That's

[60:41]

the what the tool does. Um but it makes

[60:45]

it nice to see which locators are

[60:49]

guides. So I can now uh position the uh

[60:53]

the main control anywhere and the uh

[60:56]

same as with the other controls of the

[60:58]

arm the uh transformations stay uh

[61:03]

notified or at the default values. So

[61:07]

then

[61:08]

maybe look and hide the

[61:11]

visibility. Um, and

[61:14]

then I need to set the control and the

[61:19]

guide as outputs uh for this module. So

[61:23]

I can connect it to the uh ARM module

[61:25]

and drive the ARM module with

[61:27]

this. So how I normally do this, I just

[61:31]

make an empty uh group or a transform

[61:35]

node and I call this the uh root

[61:40]

main

[61:43]

output and

[61:46]

then I duplicate it and I call it

[61:50]

main guide output. So, and in this case,

[61:54]

it's it's fairly simple because the the

[61:58]

main output is basically just the world

[62:02]

matrix of the main control plugged into

[62:05]

the offset parent

[62:07]

matrix and

[62:09]

then the guide output is basically just

[62:13]

the world matrix of the

[62:16]

guide. So, this is fairly simple. And

[62:19]

now I have created an interface uh for

[62:23]

other modules to connect to. Um of

[62:26]

course this creates extra transform

[62:29]

nodes uh which take up calculation time

[62:32]

for not for the guide because that is

[62:34]

calculated only once because it will

[62:36]

never be time dependent. But this uh

[62:39]

transform node is always dependent on

[62:41]

the main control which can be animated.

[62:43]

Um so this introduces extra

[62:46]

calculations. Uh but it makes it easier

[62:49]

for debugging and swapping modules

[62:51]

within a rig. Um and if you want to you

[62:55]

can always create a publish post script

[62:59]

to check the connections to this node

[63:02]

and um take all the output connections

[63:05]

uh of the offset parent matrix and then

[63:07]

plug them into the incoming uh

[63:10]

attributes and then delete these nodes.

[63:12]

So you can uh have an extra script that

[63:15]

optimizes your rig for uh to get to get

[63:19]

rid of these uh output nodes. But for

[63:21]

now we'll just leave them in because it

[63:22]

makes it easier to um to work with the

[63:25]

modules. So now we can for example take

[63:30]

the ARM module uh parent input and

[63:33]

parent guide

[63:36]

input. And then what I always do uh you

[63:42]

could take the world matrix of this node

[63:44]

but I'm just going to take the offset

[63:45]

parent matrix and uh make it a pass

[63:48]

through uh

[63:50]

attribute. So if I go to other and take

[63:55]

the offset parent matrix and plug it

[63:57]

into the offset parent matrix of the

[64:00]

input node. I have now just passed

[64:02]

through this connection into the

[64:05]

input and I can do the

[64:08]

same for the guide input and

[64:14]

output. So now I have connected the

[64:18]

input of the ARM module with the output

[64:20]

of the uh the root

[64:23]

module. And now if I go back to my ARM

[64:25]

module, I can add uh these nodes in

[64:29]

here. And now I can drive the upper

[64:32]

control because now the upper control

[64:34]

does not have any uh parent

[64:37]

dependencies. It is basically now at the

[64:39]

same position as the oriented uh upper

[64:42]

guide control. So we can do the same

[64:45]

that we did for the uh other controls.

[64:49]

We can calculate the uh parent offset

[64:53]

matrix. So the offset matrix relative to

[64:56]

its parent and then we can add that or

[64:59]

multiply that offset with the parent

[65:02]

control uh to create the new offset

[65:04]

parent matrix. So in this case for the

[65:08]

upper FK control the parent guide is the

[65:13]

uh input the parent guide input node and

[65:16]

the parent uh driver the uh controller

[65:20]

is the parent input because that's

[65:21]

connected to the uh parent control of

[65:24]

the the main control of the root. So

[65:27]

let's create a melt matrix

[65:32]

node and

[65:34]

then connect the uh guide world matrix

[65:39]

of the upper FK

[65:42]

control and refresh the input plugs and

[65:46]

then multiply it with the inversion

[65:48]

world matrix of the uh input

[65:52]

guide. So the world inversion matrix

[65:56]

of its parent guides basically. And this

[66:00]

will give us

[66:02]

the control par offset

[66:06]

matrix. And now we can multiply the

[66:10]

offset matrix with the uh parent um

[66:15]

control or the input parent input which

[66:17]

is connected to the um root control. So

[66:21]

we create another mult matrix node.

[66:26]

And then

[66:27]

we set the parent offset matrix as the

[66:30]

first bug and then take the offset

[66:34]

parent matrix because we are using the

[66:38]

uh attribute as a pass through. So the

[66:41]

offset parent matrix from the parent

[66:42]

input was connected to the output uh of

[66:46]

the root module and that was connected

[66:48]

to the main control. So we're just using

[66:51]

these input and output nodes as pass

[66:53]

through nodes. So we connect that to um

[66:56]

the second input and then we connect

[66:59]

this to the offset parent matrix. So

[67:02]

nothing changes except for the fact that

[67:05]

we now have connected the ARM module to

[67:07]

the uh root module. So let's call this

[67:11]

root matrix. And now if we change the uh

[67:16]

root control, the uh arm uh moves along

[67:19]

with it and we can still reposition the

[67:22]

root control to wherever we want because

[67:25]

the offsets are always recalculated from

[67:28]

the guides. So it doesn't matter where

[67:31]

the root control is, the uh rig always

[67:34]

stays functional. So, this can be nice

[67:38]

um if you want to change the root

[67:41]

position

[67:43]

uh of a rig or uh when you're still

[67:46]

working on it, tweak the positions. So,

[67:48]

now we have two modules. We have the

[67:50]

root module uh which is a fairly basic

[67:52]

one and we have the ARM module uh which

[67:56]

is also a basic one. It only has FK but

[67:59]

uh we can add uh more to it. But this is

[68:03]

the basic setup.

[68:05]

um of how I build my rigs with modules.

[68:09]

So we have inputs which connect to

[68:12]

another module and we have outputs uh

[68:15]

that also connect to other modules. So

[68:18]

within a module all nodes are only

[68:20]

dependent on nodes that are part of the

[68:23]

module and only via the inputs and

[68:27]

outputs it uh well communicates with

[68:30]

other modules uh and the scene.

Download Subtitles

These subtitles were extracted using the Free YouTube Subtitle Downloader by LunaNotes.

Download more subtitles
Buy us a coffee

If you found these subtitles useful, consider buying us a coffee. It would help us a lot!

Let's Try!

Start Taking Better Notes Today with LunaNotes!