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

Related Videos

Download Subtitles for PATH TRACER Explained - Unreal Engine

Download Subtitles for PATH TRACER Explained - Unreal Engine

Enhance your understanding of Unreal Engine's PATH TRACER tool by downloading accurate subtitles for this video. Captions make it easier to follow complex concepts and improve accessibility for all viewers.

Download Subtitles for Azure AI Foundry Basic Agent Setup

Download Subtitles for Azure AI Foundry Basic Agent Setup

Enhance your learning experience by downloading accurate subtitles for the Azure AI Foundry Basic Agent Setup video. Follow step-by-step instructions easily with clear captions, ensuring you don't miss any crucial details. Perfect for accessibility and improved comprehension.

Download Subtitles for The Guillotine Choke Masterclass Video

Download Subtitles for The Guillotine Choke Masterclass Video

Enhance your learning experience with downloadable subtitles for The Guillotine Choke: A Complete Masterclass. Perfect for following along, improving comprehension, and mastering every technique showcased in this instructional video.

Download Subtitles for The 2025 Guide to Rendering in Unreal Engine 5

Download Subtitles for The 2025 Guide to Rendering in Unreal Engine 5

Enhance your learning experience with downloadable subtitles for The 2025 Guide to Rendering in Unreal Engine 5 video. Accurate captions make it easier to follow complex rendering techniques and ensure accessibility for all viewers. Get your subtitles now to master Unreal Engine 5 effectively.

Download Subtitles for Lighting Interiors in Unreal Engine 5

Download Subtitles for Lighting Interiors in Unreal Engine 5

Enhance your learning experience by downloading accurate subtitles for the Lighting Interiors in Unreal Engine 5 tutorial. Captions help you follow along with detailed lighting techniques and improve comprehension, making complex concepts easier to grasp. Get your subtitles now for more effective and accessible video content.

Most Viewed

Download Subtitles for 2025 Arknights Ambience Synesthesia Video

Download Subtitles for 2025 Arknights Ambience Synesthesia Video

Enhance your viewing experience of the 2025 Arknights Ambience Synesthesia — Echoes of the Legends by downloading accurate subtitles. Perfect for understanding the intricate soundscapes and lore, these captions ensure you never miss a detail.

Download Subtitles for Girl Teases Friend Funny Video

Download Subtitles for Girl Teases Friend Funny Video

Enhance your viewing experience by downloading subtitles for the hilarious video 'Girl Teases Friend For Having Poor BF'. Captions help you catch every witty remark and enjoy the humor even in noisy environments or for non-native speakers.

تحميل ترجمات فيديو الترانزستورات كيف تعمل؟

تحميل ترجمات فيديو الترانزستورات كيف تعمل؟

قم بتنزيل ترجمات دقيقة لفيديو الترانزستورات لتسهيل فهم كيفية عملها. تعزز الترجمات تجربة التعلم الخاصة بك وتجعل المحتوى متاحًا لجميع المشاهدين.

C Language Tutorial Subtitles for Beginners with Practice

C Language Tutorial Subtitles for Beginners with Practice

डाउनलोड करें C Language Tutorial के लिए सबटाइटल्स और कैप्शन्स, जिससे यह वीडियो और भी समझने में आसान हो जाता है। नोट्स और प्रैक्टिस प्रश्नों के साथ यह सीखने का आपका अनुभव बेहतर बनाएं।

離婚しましたの動画字幕|無料で日本語字幕ダウンロード

離婚しましたの動画字幕|無料で日本語字幕ダウンロード

「離婚しました」の動画字幕を無料でダウンロードできます。視聴者が内容をより深く理解し、聴覚に障害がある方や外国人にも便利な字幕付き動画を楽しめます。

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!