Friday, June 24, 2011

Character Development Workshop, Part 2: Rigging

When we last met our friend Generikat he had morphed into sort of a teddy bear. (This same “cat” toon template can be used for bears, bunnies, any anthropomorphized cuddly critter.) We took it to the end of the modeling phase in Tutorial 1, which can be found here.

Cleanup & UVs

Before we start rigging there’s some preparatory work to be done. First, delete the instanced half and duplicate it over again, this time changing the duplicate special options to “copy” rather than “instance.” (Still scale -1 in x). For the new half, Modify→Freeze Transformations and then Normals→Reverse. Then select both halves and  Mesh→Combine and Edit Mesh→Merge (Options): Set threshold to as low as possible (.0001). This should merge only verts directly on top of each other, which should be just the centerline. Finally Edit→Delete all by Type→History.
I also gave him a little tail:

As a model check, run Mesh→Cleanup … Use the settings shown here:

If anything comes up selected, you know you have some problem geometry to deal with.
After all mesh issues are dealt with, we need to get some UVs laid out.

If you are lucky enough to have Bonus Tools installed, just go to “Assign Texture Shader.” Otherwise, create a new lambert texture and map a checker texture to its color swatch. This will help you visualize the uniformity of the UVs.

Start the UV process by getting some … any … UVs on there. Create UVs→Planar Mapping. You’ll get one big shell. Check Window→UV Texture Editor.

Now before we slice these UVs into islands, make a selection set of all the UV border edges. By shift-selecting edges, select all of the edges that will make good seams for your character. Think ahead to how it will unwrap and put in enough edges to minimize distortion, all the while trying to keep the number of UV islands low and placing seams where they are least likely to be noticed (occluded areas, areas of low texture detail or "natural" borders between different textures). When you have all of your edges selected, Create→Sets→Quick Select Set so that you can return to this selection if need be. The following images show where I put mine.

Then go to the UV editor and Polygons→Cut UV Edges. Use the Tool→Move UV Shell Tool to move the shells apart.

With every piece selected, do a Polygons→Unfold and then a Polygons→Layout to get results similar to below. I selected the top and bottom center UV on the face shell (highlighted in the screencap below) before I did a second Unfold on it, with options set to Pin Selected UVs, coaxing it to unfold symmetrically.

Since this is not a UVs tutorial, we'll stop there - the bare minimum you should do is have every piece non-overlapping, as we do. For a real project you should take it further to maximize texel space by carefully arranging and manipulating shells. I highly recommend Headus UVLayout as a tool to quickly achieve good results.

We do most of our UV work before rigging, simply because it tends to create history on our model. Once we get into skinning, we normally don't want to delete history any more, so doing things in this order makes the most sense. Delete history now. At this point I'll create a temporary "animation texture" – it may not get its final texture until after rigging and animating, depending on the project. Final texture mapping is most conveniently done as part of the lighting and rendering phase of production, so there's no rush on the final texture in most character pipelines. It helps the animators to have at least some surface information, though, so you can do some 3d paint in Maya or Mudbox at this point if you choose. I just plopped some colored materials on him: 

At this point, make sure all your geometry and material nodes are named per your naming convention, maybe grouping all geometry to keep it away from the rigging clutter you're about to make. Now may be a good time to run File→Optimize Scene Size to delete any junk nodes left over from modeling.

Rigging the Legs

Remember the point of rigging is to anticipate all of the articulation and range of motion in animation. The best riggers continuously visualize the extremes of movement the character will eventually exhibit throughout the rigging process, and even refer to animation motion reference before beginning. YouTube and Vimeo have lots of reference for human and animal locomotion. Take time to plan before you begin.

Put on your geometry on a template layer for now. You will only need it as a reference while you lay out the joints for your rig.

Switch to the side view and the animation menu set. Choose Skeleton→Joint Tool and click to place 5 joints, as below. Middle mouse moves last joint placed. Enter to complete tool. 

Name the joints hip, knee, ankle, ball, toe. Then shift-select them all in the Outliner and Modify→Prefix Hierarchy Names with left_
In the front view, position the joint chain to fit inside the left leg geometry.

Go to Skeleton>IK Spline Handle Tool (set to ikRPsolver, sticky) and click the hip bone and then the ankle bone. Name this new IK handle left_ankleIK.

Now go back into the IK Handle tool but change the solver to ikSCsolver. Create an IK handle from the ankle to the ball joint, and one from the ball to the toe joint. Name these left_ballIK and left_toeIK.
Select the top bone in the hierarchy, go to Skeleton→Mirror Joint (Options) and mirror across YZ with function set to Behavior. Also, under replacement names, search for left_ and replace with right_.
This will duplicate your leg system across to the right side.

Now we'll set up the feet with a simple reverse-foot setup. Starting at the character's heel, place a joint in the side view and then hold v (point-snap) to place joints at the toe, then ball, then ankle going in the reverse direction from your original chain. Name these joints revHeel, revToe, revBall, revAnkle. (Tip: to accurately place the first joint, you can point-snap it to the ball joint and then middle-mouse-drag it behind to the heel).

Prefix hierarchy names with left_ and then mirror joint on this reverse chain, replacing left_ with right_. Now parent the leg's IK handles under the corresponding joint in the reverse foot (select the handle, than CTRL-select the joint in the reverse foot and hit p to parent) – ankleIK to revAnkle, ballIK to revBall, toeIK to revToe. You can test this setup by lifting and rotating the revHeel bone. Undo after testing to reset foot position. Remember to do this for both feet.

Create a foot control object: character setup involves creating a set of easy-to-select manipulators for animators to set keys on, thereby animating parts of the underlying rig. We will try to make all of our control objects out of NURBS curves, because they don't render by default. Create→NURBS primitives→Circle and with the move tool, v+MMB click on the ball joint to snap the center of the circle around the ball (v=point snap). Scale it to fit around the templated foot geometry.

Switch to control vertex mode (F8 or RMB over the curve to select cv mode) and fashion the cvs of the curve to a shape more approximating the foot.

Name this control object left_footControl. Duplicate a copy flipped negative in scaleX, and then add a negative to the translateX value to pop it over to the right side. Rename this copy right_footControl. Freeze transformations and delete history on both, and then move the pivot points to their respective heel joints (hold d and v while MMB-snapping the pivot point to the heel bone). 

Parent each heel joint under its respective footControl (select heel joint, shift-select footControl, hit p). Now you can move the feet around by their footControl nodes.

Shift-select both footControl objects, then add some custom attributes to help drive the animation. Modify→Add attribute... and in the dialog, set Attribute Name to heelRotX, data type to Float, then click Add. Add all of these attributes before closing the window:

Open Window→General Editors→Connection Editor. Select one of the footControl objects and click the Reload Left button, then select the revHeel joint and hit Reload Right. In the left column, select the Heel Rot X attribute and in the right column, open the Rotate section and select the Rotate X attribute. This creates a direct connection between the two attributes.

Make the following connections:
Heel Rot X to revHeel Rotate X
Heel Rot Y to revHeel Rotate Y
Heel Rot Z to revHeel Rotate Z
Ball Rot Z to revBall Rotate Z
Toe Rot X to revToe Rotate X
Toe Rot Y to revToe Rotate Y
Toe Rot Z to revToe Rotate Z

Now test all the custom attributes on each footControl. If you want to add limits to each control, you can do so by selecting a footControl and Modify→Edit Attribute and turning on Has Minimum or Has Maximum and typing in a value based on your testing (optional).

Select both footControls again and Modify→Add Attribute... create a new attribute,  ikFkBlend, Date Type Float, Minimum 0, Maximum 1, Default 1. Connect each ikFkBlend attribute to the IK Blend attributes of all three IK handles on the respective leg.

Now you can use the Ik Fk Blend attributes on the footControls to disable all IK when you want to animate the legs with FK (for example, when the character is hanging from something with legs swaying).

To clean up each footControl, select Scale X, Y, Z and Visibility in the channel box and RMB in the channel box to Lock and Hide Selected.

Now we'll create Pole Vector manipulators to control the direction of the knees. Text curves make good manipulators for this. Create→Text(options): enter Text: K, Font: Arial, and hit Apply.

Modify→Center Pivot and then scale the "K" icon to a good size. Snap it to the knee joint and then pull it forward in Z so that it is in front of the leg at knee level. Ctrl+D to duplicate it and snap the new one to the other knee and pull forward. Name them left_kneeControl and right_kneeControl. Freeze transformations.

Select left_kneeControl, shift-select left_ankleIK and Constrain→Pole Vector. Do the same for the other leg. Test by moving the kneeControls and witness the knees rotating. Lock and Hide all attributes except for translate on the kneeControls.

Rigging the arms

Go to the top view and place joints for the arm according to the picture below. Place the first joint halfway between the neck and shoulder – name it clavicle; next one in the center of the shoulder – name it shoulder; third one elbow, fourth one wrist. Switch to the front view to lift the chain off the grid and place the bones inside the arm geometry. Continue to create a joint in the middle of the palm (hand) and then do the fingers (pinky1, pinky2, pinky3, index1, index2, index3, middle1, middle2, middle3, thumb1, thumb2, thumb3). Note that we are leaving out the third knuckle on each finger to keep with the cartoon-hand convention – a realistic character would have another joint in each finger. Tip: In the input field of the status line there’s a drop-down that switches it to rename mode – you can use this to rename multiple objects at once and they will automatically be given index numbers.

Tips: To continue placing joints from an existing joint, just click on the joint first with the joint tool before adding new ones. To navigate up/down the hierarchy while placing joints, use arrow keys. Backspace while placing joints deletes most recently placed joint. Insert key with the move tool moves a joint without moving its children. Always move joints into place (rather than rotating or scaling) for best practices – by keeping rotational values clean you can always “zero out” a joint later to return it to its default position, and it allows you to auto-correct rotation axes with Skeleton→Orient Joint).
Use the Skeleton→Insert Joint Tool to create a forearm joint between elbow and wrist. (This ensures it is in a straight line with the other bones). Select the clavicle and Prefix hierarchy names with _left.
Create left_armIK from the left_shoulder and the left_forearm. Set the solver to ikRPsolver in the IK Handle tool settings, and set Stickiness to off.

Go to the outliner and find the end effector under the forearm joint; select it and, with the move tool, hit insert to snap the end effector pivot to the wrist joint. Then toggle off pivot mode (insert). Go into the attribute editor for the IK handle and under IK Handle Attributes, set Stickiness to sticky. (The reason we create a forearm joint is to divide the rotation of the forearm between two joints to minimize distortion of the skin. We’ll create a utility node to handle this, below.)

Create→NURBS Primitives→Circle and hold v to snap it to the wrist bone. Rotate in 90 in Z and scale it so it fits outside the surface of the character’s wrist. Name it left_armControl.

Freeze transformations and delete history on the armControl. Select left_armIK and shift-select left_armControl and hit p to parent the IK under the control. Select armControl and shift-select the wrist joint, then Constrain→Orient(Options), make sure Maintain Offset is checked, and hit Add. Now the armControl both moves the hand in IK and rotates it in FK. Lock and hide its scale and visibility attributes.

Create→Text(Options) and create the letter E in an Arial font. Snap this to the elbow and pull back in Z so that it is behind the character’s elbow. Freeze transformations and rename it left_elbowControl. Select it, shift-select the arm IK, and Constrain→Pole Vector. Lock and hide its rotation, scale, and visibility.

Select the top of the hierarchy and mirror joint, remembering to set the options to search and replace prefixes. You also need to create right_armIK since IK only mirrors if it's attached to the root joint you're mirroring (which ours is not). Don’t forget to move the end effector.
Set up armControls and elbowControls for the right side as well.

Now to create clavicle controls. Create→EP Curve Tool(Options) and set Curve Degree to Linear. In the front view, hold x to snap to grid to draw the following arrow:

Name it left_clavicleControl and Modify→Center Pivot. Move and scale it so it is above the left shoulder. Snap its pivot to the clavicle joint. Parent it to the clavicle bone, and then group it (name it left_clavicleGRP) and unparent the group. Freeze transforms on the clavicleControl. This causes the clavicleControl to inherit the local rotation axis of the shoulder. Now select the clavicleControl, shift-select the clavicle joint, and Constrain→Parent(Options). Set Maintain offset to On and constrain. Lock and hide its translate, scale, visibility.

Select the armControl and Modify→Add attribute...
Name: ikFkBlend
Data type: Float
Minimum: 0
Maximum: 1
Default: 1

Use the connection editor to connect this new attribute to the IK Blend of the IK Handle. In the Attribute editor, turn on IK FK Control under the IK Solver Attributes. Also connect the IKFK blend attribute to the armControlWO attribute in the left_wrist_orientConstraint1 node (look under the wrist joint in the Outliner) – this will enable and disable the orient constraint when switching to FK mode so you may manually rotate the hand. Now you can select the IK handle and set its visibility to off to keep it from being accidentally selected.

To automate the roll bone in the forearm, create a Multiply Divide node in the Hypershade, then go to the Connection Editor and load it on the right side. Select the armControl and load it on the left. Connect the Rotate X attribute of armControl to the Input1 X attribute of the utility node. Open the Attribute Editor for the utility node and set Input2 X to 0.5. In the Connection Editor, load the utility node in the left side and the forearm joint on the right. Connect the Output X attribute of the utility node with the Rotate X attribute of the forearm joint. Now half of the x rotation of the wrist will go to the roll bone.

Rigging the Hands

NURBS circles get boring when overused for control objects, and they can get confusing when they all look the same. To mix things up, I suggest a shelf of handmade control objects of various shapes, or you can download a free generator, such as Sin’s rig controllers.
For the hands, I recommend putting finger FK controls on a separate object, since the IK object will be left behind in FK mode. I just doodled an outline of a hand in the top viewport for mine:

Scale it down to not be so big, place it just above or behind the hand, center the pivot, parent it to the hand joint, freeze transforms, delete history and name it left_handControl. Lock and hide all attributes.
Modify→Add Attribute …
Name: indexCurl
Make Attribute Keyable: On
Data Type: Float
Min Value: 0
Max Value: 10
Default Value: 0

Also add:

Then set Min, Max and Default values to -10, 10, 0 for:

Now we'll use Set Driven Keys (SDK) to control the fingers.
Animate→Set Driven Key→Set...
Select handControl and click Load Driver. Select both the index finger joints and click Load Driven. Highlight Index Curl under driver and Rotate Z under driven (with both joints highlighted). Click on Key to set the initial keyframe.

In the SDK window, select left_handControl and in the channel box set indexCurl to 10. Rotate all the index joints until the tip of the finger touches the palm. Press Key.

Test the driven key by selecting the handControl and in the Channel Box, highlight the Index curl attribute and MMB+drag in the viewport to invoke the virtual slider. After testing, return the value to 0. 

Tip: You can see the animation curve in Window→Animation Editors→Graph Editor with one of the driven joints selected. Sliding one of these keys vertically (hold shift) will change the value.

Repeat this process for the other fingers. Also move the fingers farther apart for fingerSpread=10 and closer together for fingerSpread=-10. Before setting SDK on the thumb, go into component mode and look at Local Rotation Axes (RMB over the question mark icon in the status bar's component selection area and choose Local Rotation Axes to view and manipulate them. You can use the rotate tool to line them up so that rotating the joints on the Z axis folds them inwards naturalistically.

Set keys on the two lower thumb joints for thumbCurl (thumb2, thumb3)

Set SDK on the first thumb joint for Thumb Rot X, Thumb Rot Y, Thumb Rot Z

Don’t forget to set up the right arm as well!

Create the Spine and Head Joints

To setup the spine we’ll introduce deformers for the first time, so now might be your last chance to easily Edit→Delete All by Type→History and File→Optimize Scene Size.

In the side view, start by placing a root joint just above the hip joints of the legs.

From there, draw an s-curve of spine joints up the back, as in the picture below. Try for even spacing and follow the contour of the back near the top. 5 of 6 joints should do.

Name the first joint root, then spine1, spine2, spine3, etc.
Use the joint to click directly on the last spine bone to continue the chain up the neck. Two or three neck joints should do. Name them neck1, neck2, etc.

Then do head – right in the center of the head – and skull – right at the top.

Hit the up arrow to start at head again, and then do jaw and chin – jaw should be placed on a realistic human character right where the mandible meets the maxilla – the origination of the jaw rotation. For our cartoon character, somewhere behind the corner of the mouth will work. These two joints allow us to rig the jaw opening and closing.

Now we’ll create joints to drive the eye rotation. These have to be in the exact center of the eye geometry. Start by creating a joint anywhere and then zeroing out all its translation values in the channel box. You should find it sitting at the world origin. Untemplate the character’s eye geometry so you can select it. Select the joint, then the eye geometry, and invoke Modify→Snap Align Objects→Align Objects (Options) and set it to Mid, World x,y,z and Last Selected object. The joint should pop to the center of the eyeball.  (Note: Align objects only works with joints if they are zeroed out first.)

Name these joints left_eye and right_eye and parent them to head.

Spine setup

Now check the local rotation axes in the spine. Switch to component mode and right-click the question mark on the status line to be in local rotation axis mode. Ideally, all of the secondary axes (Y) should be facing the same way – we see that half of them are flipped.

Select any spine joint rotation axes that are facing the wrong way and type the following in the MEL command line:
rotate -r -os 180 0 0;
This command will rotate 180 degrees in X in relative (-r) object space (-os) mode. You can MMB-drag this command from the script editor to the shelf to make a handy button to execute this. Line up all the Y axes in the same direction. Then leave component mode.

Skeleton > IK Spline Handle Tool (Options). Turn off Auto parent curve. Click on first spine joint (the one above the root) and then click on the last (or second to last) spine joint to set an IK spline handle. This IK creates a NURBS curve running down the center of the joint chain which you can manipulate to shape the joint chain. (Note: we will be creating clusters out of the curve control vertices which we will parent to animation control objects, so we didn’t want to Auto parent curve or this would result in double transformations when the character rig is translated. We could have also kept ON Auto parent curve and later turned on Relative in the cluster attributes to compensate.)

Select the back curve – find it at the bottom of the outliner called curve1 – rename it back-curve and go into CV mode. The curve should have four CVs- one at the bottom, one at the top, and two in the middle. Select the bottom two CVs and Create Deformers→Cluster. Do this for the top two CVs as well. Rotate and translate the “c” icons to test your IK back rig.

The bottom cluster won’t be animated, so parent it to the root bone. You can also turn off its visibility and lock and hide all its attributes. Next make another IK spline handle from the base to the top of the neck. Don’t start on the same bone your spine IK ended on or you’ll be sorry. Instead, start at the next bone up. Create clusters from the top two CVs and bottom two CVs again. Again, parent the lower cluster to the bone below the IK handle (spine6 or 7) and hide it. Name all of your new nodes in the Outliner (neckIK, spineIK, neck_upper_cluster, etc).

Create a polygon cube and then go to Create→EP Curve Tool (Options). Set it to linear. Hold v and snap a curve to every vertex of the cube, making sure to get a curve along every edge. Then delete the poly cube and you are left with a NURBS curve cube you can use as a control object.

Move and scale this to surround the upper torso, then CTRL+D to duplicate and create one to fit around the hips. Name the upper spineControl and the lower rootControl.

Now create two NURBS circles and position them around the neck and the waist at the root bone. Name them neckControl and hipsControl. Freeze transformations and delete history on all new control objects.

Now to rig 'em up. Select spineControl with the move tool and hold d to temporarily invoke pivot point mode, and also hold v to MMB-snap its pivot to the spine cluster. Then select the cluster, shift-select the spineControl and hit p to parent. Test by moving and rotating the spineControl to move the spine. Lock and hide scale and visibility attributes.

Modify→Add Attribute and add twist and ikFkBlend. Set min, max, and default values of ikFkBlend to 0,1,1. Open connection editor and load spineControl on the left side, spineIK on the right. Connect twist with twist, ikFkBlend with ikBlend. Test these attributes by selecting the spineControl object and using twist to rotate the spine and ikBlend to turn off the IK for direct manipulation of the spine bones.
Follow the same procedure for the neck: snap neckControl pivot to the neckcluster, parent the cluster to the neckControl, add attributes for twist and IKblend and wire them from the neckIK.
In the side view, select the joint tool and click on the root joint to highlight it. Then place a single joint just below it, centered between the hip joints. Call this pelvis.

Select both hip joints and then the pelvis and hit p to parent.

Select hipsControl and snap its pivot to the pelvis joint. Select the control and then the joint and Constrain→Orient.
Select rootControl and snap its pivot to the root joint. Select the control and then the joint and Constrain→Parent.
Lock and hide translate, scale, visibility from hipsControl. Lock and hide scale and visibility from rootControl.

Creating the Master Node and bringing it all together

From the top view, draw a four point arrow like this:

Center pivot and snap it to the world origin:

Freeze its transformations. Rename it to masterControl. Lock and hide scale and visibility.
Select left_footControl, right_footControl, rootControl and finally masterControl and hit p to parent them.
Select hipsControl and parent to rootControl.
Select right_kneeControl and left_kneeControl and parent to rootControl.
Select spineControl and parent it to rootControl.
Select left_clavicle and right_clavicle and parent them to the joint above the spineIK (spine6?).
Select left_clavicleControl, right_clavicleControl, neckControl and then parent them to the joint above the spinkIK (spine6?). Note:
Select spineControl, then the joint above the spine IK and Constrain→Orient.
Select left_armControl, left_elbowControl, right_armControl and right_elbowControl and parent to masterControl.

Head and Eyes Setup

Create a NURBS object and snap its pivot to the joint that starts at the base of the head (in my case neck2). I made a little pyramid and placed it over his head:

Name it headControl. Freeze transforms and then orient constrain the same joint (neck2) to the headControl (remember to Maintain Offset in the options). Parent the headControl to the neckControl. Lock and hide translate, scale, visibility.
Optional: you can add a Boolean headOrient attribute to the headControl, connected to the orient constraint’s Head Control WO attribute, to be able to turn on or off orientation driven by the head control. By turning it off you’d basically be using the neck control to orient the head.
Now make another NURBS circle, transform it into position in front of the eyes and pinch its center UVs to create a mask shape:

Name it eyesControl. Create→Locator and snap it to the left eye. Drag it out front in Z, and holding the C key, MMB-click on the eyesControl to snap it to the same Z-plane as eyescontrol. Name it left_eyeControl. Duplicate it and snap the duplicate to the right eye, moving it into the eyesControl Z-plane as well, and naming it right_eyeControl. Resize the eyesControl to fit around the two locators, as pictured below. Freeze transformations and delete history on all three, and then parent the locators to the eyesControl.

Select the left_eyeControl and then the left_eye joint. Constrain→Aim (Options) and set to Maintain Offset. Do the same for the right eye.
Parent the eyesControl under the masterControl. (Some animators prefer to parent the eyesControl under the headControl, but I find this encourages an overall "spaced out" look in the CG character – the eyes shouldn't be following the body movements, they should typically be locked in focus on something. In animation, you can use this totally independent eyesControl to snap or constrain it to objects in your scene so the character appears focused and alert.)
To test these eyes out, go ahead and skin them to the eye geometry. Select the left eye joint and the left eye geometry, and go to Skin→Bind Skin→Smooth Bind (Options). Set Bind to: selected joints. Do the same for the other eye and then move eyesControl to see the eyes rotate.

Clean Up

Now go to your Outliner and make sure Display→DAG Objects Only is on. Delete any empty groups and unused nodes. Select masterControl and group it – name this controlGRP. Select the root joint of the skeleton and group it – name this skelGRP. Select all the geometry and group them – name it geoGRP. Select any IK splines or any other nodes that are left over and group them – name it miscGRP. You should have four groups at the top of your scene graph now.

You could group these four into a main "generikat" group so that it remains discrete when you import or reference this rig into other scenes, but you could also have this happen automatically upon import. You may also be utilizing Maya Assets in your pipeline which will require a little further setup. For best practices, try to keep all of your control objects in one hierarchy, skeleton in another, and geometry in another. In this lesson we cheated a bit and parented a few control objects straight to bones to avoid more elaborate setup. When you do this, however, be mindful that joints have "dirty" attributes that can pass down to a "clean" (zeroed out) control object and make their attributes nonzero. To keep this from happening, always Create→Empty Group and parent it to the joint first, and then parent the control object to the empty group. The group acts as a buffer that will not pass down the dirty attributes so your zeroed out control stays clean.
Check once more that every control object is zeroed out and that you have locked and hidden any unused attributes. Save your scene as a backup, and then optimize scene size and delete all non-deformer history. organize your layer editor so that all geometry is on a layer so you can later make it a reference layer, and everything "hidden" (like IKhandles, joints, etc.) is on its own layer that you can hide.

It's also a good idea to color-code your control objects, because pole vector objects and hand controls get all mixed up during animation. Select each of the left-side objects and color them blue by going under their attribute editors to Drawing Overrides and turning on Enable Overrides – then adjust the color slider to blue. Do red for the right side and green or yellow for the middle.

You are ready for facial setup and then skinning the mesh to the rig, but those are subjects for future lessons.

No comments: