3DS Max Notes
- Trim Textures
- Compare Map Baking vs. Substance Painter
I cut my 3D modeling teeth on Blender, then was introduced to Maya in '08 during Foundation Art & Design at Vancouver Film School. In the following year they gave us 3DS Max in Game Design. During my last tenure as an indie gamedev I exclusively used Max, only dabbling in Blender during a brief period of "every tool I use should be open source". There is no "best" solution when it comes to 3D modeling. I think it boils down to whatever you're most comfortable with. After a decade of thinking about it, I'm coziest with Max.
The bulk of this document is likely to be lists of new features I come across as I reacquaint myself with the software. I'd love to sit here and document everything I've already learned, but there's the matter of time and the limits of my mortality. I'll try to add stuff to a Best Practices section as it occurs to me.
- Smart Extrude: Shift-drag with left click on an Editable Poly. Move will extrude, scale will inset.
- Loop Select: Select vertex, Ctrl+double-click 2nd vertex. Ctrl+double-click edge.
- Ring Select: Select edge or vertex, Ctrl+double-click adjacent edge or vertex.
- Ring Select (Limited): Select edge or vertex, Ctrl+double-click furthest edge or vertex. Use Alt+double-click to deselect.
- Point-to-Point Select: Ctrl+Shift to select first vertex, edge, or poly, then move to select end of path.
- Use Q to clear the selection tool to prevent accidental scale/move/rotate operations.
- Remapped Hotkeys:
- Alt-Middle Mouse: Orbit
- H: Select by Name (also next to Select Object on tool bar)
- D: Repeat last
- V: Select loop
- C: Select ring
- Y: Remove loop
- Ctrl-B: Break UV shell
- B: Stitch selected shell edges
- X: Search all commands
- Ctrl-N (with numeric field active): Calculator
- RC Adaptive Degradation: Open Viewport options
- +/-: Increase/decrease gizmo size
- J: Show/hide bounding box
- Shift-I: Spacing Tool
- Ctrl-Shift-E: Connect (edge, vertices).
- Shift-LC while Swift Loop: loop with flow.
- Ctrl-LC while Swift Loop: select edge.
- Ctrl-Shift-LC while Swift Loop: remove edge.
- Alt-LC while Swift Loop: drag edge.
- Ctrl-Alt-LC while Swift Loop: straighten and drag edge.
- Selecting verts on the edge of an object to Symmetry places the Mirror in the correct position.
- Turbosmooth with Surface Parameters → Separate → Smoothing Groups checked can be used to create a quick control mesh.
- Whenever possible place control loops on a separate Edit Poly modifier to simplify the later conversion from high- to low-poly.
- Tessellate subdivides the current mesh.
- Viewport Configuration → Display Performance → Increase Viewport Images and Textures Display Resolution to higher numbers, like 4096.
- RC the Move, Rotate, or Scale tools opens a type-in box.
Ribbon Tools (Legacy)
Freeform → Grid → Draw On: Surface
- Pick: mesh to follow topology of.
- Set the Offset to a value high enough to produce new topology above the Picked mesh.
- PolyDraw → New Object.
- Step Build.
- Draw 4 Vertices and Shift-Drag in the direction to draw the new polygon.
- Experiment with other tools.
Modeling → Loops → Flow Connect
- Adds loops and tries to follow the edge flow of the object.
Modeling → Polygons → GeoPoly
Polygon Sub-object Mode → Selection → By Numeric
- Selects polygons based on boolean comparison criteria, super useful for finding ngons and tris.
These are legacy notes from 2015. At the time of this writing (2020), I'm still wondering what the best way is to bake normal and ambient occlusion maps. It would seem that the industrial-strength tools in 3DS Max would produce the best results when tuned correctly. It's understanding what's the correct tuning that's the hard part.
Substance Designer and Painter both come with built-in bakers. They simplify the process but may not produce tip-top quality results. The question then becomes: how important is having a tip-top quality bake on a 3D asset in a videogame? The answer may be "not very".
Normal Maps: Basic
- Animate the low-poly mesh a short distance from the high-poly for ease of use.
- Apply a Multi/Sub-Object Material of at least 4 unique colors to the high-poly model, then apply a Material modifier to all the high-poly objects, then make the Material modifier unique.
- Set separate colors for areas that are intersecting or adjacent.
- Assign same Material IDs in both the high-poly and low-poly meshes as per corresponding objects.
- Detach To Element any planes that require higher than average projection distance.
- Select all Vertexes and Connect to triangulate the mesh for baking.
- Add a Projection modifier to the low-poly mesh.
- Reference Geometry → Pick List → select all the corresponding high-poly meshes.
- Reposition the meshes so they overlap (return to frame 0).
Put the low-poly mesh into X-ray mode.
- Cage → Display → check Cage and Shaded.
- Push → Amount → add a small amount to cover most of the mesh then Export… a copy.
- Hide the low-poly mesh and move the working Cage into the high-poly layer.
- Manipulate the Cage to cover all the necessary geometry.
- Unhide the low-poly mesh.
- Import the adjusted Cage into the low-poly Cage modifier.
- ENSURE DEFAULT SCANLINE RENDERER IS SELECTED
- Render to Texture… (0)
- → Output → Add… CompleteMap
- → Projection Mapping → Enable Projection and Options… → Resolve Hit → enable Hit Only Matching Material ID
- → Mapping Coordinates → Object and Sub-Objects → Use Existing Channel
- Use Smoothing Groups from UV Shells in PolyUnwrapper for first-pass smoothing. Manually add any polygon groups that need additional smoothing to high-numbered smoothing group. Delete Unwrap UVW modifier and move the SG From Shells modifier under the Projection modifier.
- Ensure the low-poly mesh is centered on the grid.
- Unhide the high-poly mesh.
- Apply an all-white Material to both meshes.
- Add a Skylight to the scene (On, Multiplier 1.0, Sky Color white, Map 100.0)
- Rendering → Light Tracer… → Rays/Sample 350
- Select low-poly mesh → Rendering → Render To Texture… (0)
- Selected Object Settings → Enabled → Padding: 32
- Projection Mapping → Options… → disable Ray miss check
Filtering Options → Global Supersampler → Setup… → Global SuperSampling → Enable Global Supersampler → Max 2.5 Star
- Output → CompleteMap and NormalsMap
Normal Maps: Extended
There are several options under the base Align tool in the toolbar:
- Quick Align will perform a pivot-to-pivot alignment on the selected objects.
RC a target camera to select its target.
Polygon Sub-object Level → Graphite Ribbon → Selection → Non-Quads will highlight all the non-quad polygons.
Convert to Editable Mesh → Explode (180) will detach all elements into individual editable objects.
Controlling High-poly Smoothing with Smoothing Groups
- Set up the mesh for ease of viewing. Display Panel → Display Color → Shaded: Object Color
- Viewport Settings → Shaded to hide shadows.
- Go over the mesh and ensure it is built with quad polygons and that joints have sufficient geometry for deformation.
- Also ensure limb symmetry for ease of rigging.
- Ensure the mesh is centered on the [0,0,0] point in space and the feet are sitting directly on the ground plane.
- Ensure the X-plane bisects the character.
- T-stance characters are easier to rig than others.
- Ensure the scale factor is 100%. Reset X-Form as required.
Rotations and Layers
- As much as possible favor the Z-axis for rotations. Build legs and spines from the Left view, and arms from the Top view. The reason for this is that game engines evaluate rotations from XYZ, meaning that changes to X and Y rotations affect Z, but changes to Z are solitary.
- Place meshes into a new Mesh layer.
- Create Controllers layer.
- Create Bones layer.
Creating the Skeleton
Freeze the Mesh layer.
- Spine (1,2,3, etc)
- Neck (1,2,3,4)
- Left/RightFootExtraFinger(1,2,3,4 – Big Toe)
- Work on Bones layer.
- Work in Left view.
- Create → Systems → Bones
- Generally, a games character requires only 2-3 spine bones.
- Bone Parameters → Bone Object → Width: 1.0 | Height: 1.0
- Draw 3 spine, 1 neck, and 1 head bone from bottom to top. RC to end.
- Bone size is largely irrelevant when using Vertex weight rigging.
To reposition joint positions, Animation → Bone Tools → Bone Editing Tools → Bone Pivot Position → Bone Edit Mode (Enabled).
- Centering the spine bones in the torso mass helps when rigging the character.
- The third spine bone should be large enough to encompass the rib cage.
- Whenever changing bone positions Bone Tools → Object Properties → Reset Stretch.
- If the last bone in a chain has been changed delete the nub, select the last bone, and Bone Tools → Bone Editing Tools → Bone Tools → Create End.
- Rename the bone chain: Spine1, Spine2, Spine3, Neck, Head, and Head-nub.
- Create a pelvis, drawing down a single bone with nub. Do not draw too close to the spine bone to avoid accidentally connecting the two.
- Align the pelvis bone to Spine1_bone in XYZ Pivot Point to Pivot Point. Ensure Align Orientation is disabled.
- Adjust, recreate the nub, and reset the stretch as necessary.
- Rename the bones Pelvis and Pelvis-nub.
- Set a name prefix for easier identification. Select the bones, Tools → Rename Objects… → Disable Base Name and enable Prefix, and select a recognizable prefix followed by an underscore, for example avatar_ → Rename.
- Add an _bone suffix for easier identification.
- Resize the Pelvis for easier identification. Select the bone → Bone Parameters → Bone Object → Width | Height.
- Work in the Left view.Draw a bone chain downward for thigh, knee, heel, and ball of the foot. Do not start too close to the Pelvis to avoid accidental connection.
- Adjust joint positions in Bone Edit Mode. The thigh joint should start high, almost centered to the pelvis. Also create a slight angle between thigh and calf bone by adjusting knee joint.
Delete/recreate nub as necessary.
- Work in Front view.
- Exit Bone Edit Mode and select the thigh bone. Center the chain in the character's left leg.
- IMPORTANT: In Bone Edit Mode never break the linear plane a bone chain.
- If necessary, unfreeze the Mesh layer and reposition leg vertices to better align with the leg bone chain. A useful selection approach is to select the foot and ankle vertices then Soft Selection → Use Soft Selection (Enabled) → Edge Distance (Enabled) → Edge Distance | Falloff. Reposition the selected leg using a type-in value and repeat the process for the other leg. Exit vertex sub-object mode and freeze the Mesh layer.
- Rename the leg bones Thigh, Knee, Ankle, Toe, and Toe-nub.
- Set prefix and suffix as before, appending an _l_ to the prefix to designate left-sided bones.
- Make sure Bone Edit Mode is DISABLED. Mirror the left leg bones by selecting the chain → Bone Tools → Bone Editing Tools → Bone Tools → Mirror → Mirror Axis: X | Bone Axis to Flip: Y. The cloned chain will appear on top of the original.
- Move the cloned chain aside and reposition it on the –X Position of the original chain.
- Rename the bones in the cloned chain by removing the "(Mirrored)" suffix and switching the "l" for an "r".
- Double-click the right thigh to select the entire chain and go to the Hierarchy panel → Adjust Pivot → Affect Pivot Only. Rotate the bones 180 degrees in local Y. Exit Affect Pivot Only mode.
Choose the Rotate tool. Set the Coordinate System to Local in "Use Pivot Point Center" mode.
- Test rotations to ensure the leg chains rotate together and separately in a logical fashion.
- Reset Stretch on right leg chain.
- Bone Tools → Fin Adjustment Tools → Bone Objects → Invert Width and Height values for all bones in the right leg chain.
- Delete and recreate the Toe nub, renaming the new nub to follow convention.
- Link the Spine1, Right and Left Thighs to the Pelvis. Double-check the link by moving the Pelvis, the entire skeleton should move.
Linking Bone Chains Together
- Ensure the hierarchy is in place and the bones chains linked properly together before rigging the skeleton.
- Work in the Top view.Create a bone chain over the character's left arm that includes bones for the clavicle, upper arm, and lower arm.
- In the Front view, select the clavicle bone and move it up to the appropriate height.
- In Bone Edit Mode in the Front view, adjust the position of the bones in a Left/Right direction only.
- Adjust the joints in the Top view.
- Delete and recreate the nub.
- Reset the stretch.
- Exit Bone Edit Mode.
- Rename the bones: Clav, Shoulder, Forearm, and Wrist.
- Rename with "avatar_l_" prefix and "_bone" suffix.
- Select all the arm bones except the Clav and Clone (Copy) them.
- In Bone Tools → Fin Adjustment Tools → Bone Objects increase the Width and Height slightly to differentiate the new bones from the originals. Also change the wirecolor (blue) for better visibility.
- Rename the cloned bones by replacing the suffix with "FK_bone".
- Repeat the cloning process and make a slightly smaller recolored (red) copy and replace the suffix with "IK_bone".
- Delete and recreate the nubs on the cloned chains.
- Exit Bone Edit Mode and Mirror the left bone chains as with the leg chains.
- Select both Clavs and link them to the closest Spine bone.
- Hide the Mesh layer, and the IK and FK chains.Clone (Copy) the left Shoulder bone and rename it ShoulderRoll_bone.
- In Bone Tools → Fin Adjustment Tools → Taper 0.0 and recolor for visibility.
- Unlink the ShoulderRoll from the Clav.
- Bone Tools → Bone Editing Tools → Bone Tools → Refine to cut the ShoulderRoll in half, deleting the half closest to the wrist.
- Link the ShoulderRoll to the Shoulder.
- Repeat with the Forearm.
- Refine the ForearmRoll into thirds and delete the third closest to the elbow.
- Link both ForearmRoll bones to the Forearm.
- Rename the bones ForearmRoll1 and ForearmRoll2, starting from the wrist.
- Repeat the procedure for the right arm. DO NOT USE MIRROR TOOLS.
- Unhide FK/IK chains and Mesh layer.
Hand and Finger Bones
- Work in the Front view.Set the hand mesh to X-ray and Edged Faces mode.
- Work on the Bones layer.
- Set the Bone Parameters → Bone Object → Width | Height to half their size value.
- Create a single bone and nub from the wrist (but not so close as to risk connection) and rename them Hand and Hand-nub.
- Align the Hand bone to the Wrist bone, pivot to pivot on all 3 Position axis with only the Align Orientation (Local) X Axis enabled.
- Reposition the nub if necessary, moving only on the XY-plane.
- Widen the Hand in Bone Tools if desired.
- Delete and recreate the nub. (possibly unnecessary)
- Reset the stretch.
- In Front view, create a 3-bone chain for the index finger.
- Rename the new bones as Index_1, Index_2, Index_3, and Index_3-nub.
- In Top view, relocate the finger chain with the base of the Index_1 bone under the knuckle of the index finger of the mesh.
- Rotate the Index_1 bone on Local Y-axis to align it with the geometry.
- In Front view and Bone Edit Mode adjust the joints as necessary.
- Delete and recreate the nub.
- Reset the stretch.
- Clone (Copy) the Index chain to create Middle_1, 2, 3, and 3-nub.
- Adjust as necessary.
- Repeat for Ring and Pinky fingers.
- Create a 3-bone chain for the Thumb in the Top view.
- Move the chain up to the correct height.
- Local X and Y rotations may be required to orient the chain to follow the geometry.
- Adjust the joints in Bone Edit mode, keeping to the Local XY plane.
- Link the Thumb and Finger base bones to the Hand bone.
- Link the Hand to the Wrist.
- Use Rename to add the prefix and suffix to the bones.
- Mirror the entire hand with Bone Tools → Bone Editing Tools → Bone Tools → Mirror → Bone Mirror → Mirror Axis: X | Bone Axis to Flip Y.
- Unlink the mirrored Hand from the Wrist.
- Invert the X value to relocate the mirrored Hand to its proper position.
- Rename the bones to remove the (Mirrored) suffix and replace l with r.
- Select the entire mirrored hand, enable Affect Pivot Only, and using Rotate in Local mode, apply a relative 180-degree rotation on the Y-axis using the transform type-ins.
- Exit Affect Pivot Only mode.
- Reset the stretches on the hand and finger bones and then invert the bone sizes.
- Delete and recreate the nubs.
- Link the right Hand to the right Wrist.
Verify the Hierarchy
- Graph Editors → New Schematic View.
- Select all nodes, RC → Arrange Selected.
- Ensure Options → Move Children (Enabled).
- Layout → Free All.
- Go through the nodes to ensure the names and links are correct.
Testing the Skeleton
- Hide the Mesh layer.
- Freeze the transforms on the skeleton to create an original pose position by selecting all bones in the scene, Alt+RC → Freeze Tranform.
- To reset, Alt+RC → Transform to Zero.
- Animate all bones through extremes, 20 frames each:
- Turn Auto-Key on.
- Move ahead 20 frames and rotate a selected bone to an extreme but natural angle.Move ahead another 20 frames and shift-drag the frame from 40 frames period into position.
- Move ahead another 20 frames and rotate the bone in the other direction.
- Move ahead and shift-drag the resting frame into position.
- Move ahead another 20 frames, select the next bone up the chain, RC on Timeline → force a Rotation Key.
- Repeat rest frame dupe, moving up the chain.
- It is only necessary to animate the toe, ankle, knee, arm, hand, and finger bones for one side of the character.
- It is unnecessary to animate the roll bones.
Bone Animation Guide
- Left Toe: Up, down.
- Left Ankle: Down, up, left, right, twist left, twist right.
- Left Knee: Back.
- Thighs: left forward, right forward, both forward, both splits, both back, left forward/right back, right forward/left back. (640)
- Pelvis: none.
- Spine1-3: right (to upper body 90 T), left (same), right twist (same), left twist (same), back (same), forward (same). (880)
- Left shoulder: down at side, raised (Clav up, shoulder rotating palm forward), forward (Clav forward, shoulder forward more), back (Clav back, shoulder back more), roll forward (palm up), roll back (palm almost up) (1120)
- Left forearm: forward 45 degrees. (1160)
- Left hand: down, up, turn forward, turn back. (1320)
- Fingers: down from 3 to 1.
- Thumb: all curl from 3 to 1, base back/forward/down/up. (2040)
- Finger bases: all curl, all spread, all down. (2280)
- Neck: turn left, turn right, bend left (head 90), bend right (same), bend forward (head 45+), bend back (same). (2520)
- Nubs and roll bones are not required for the skinning process.
- Freeze the Mesh layer.
- Select all the bones in the scene.
- Alt-click all nubs.
- H to open Select From Scene. Ensure Select → Select Children (Disabled).
- Ctrl-click to deselect FK and IK chains.
- Close Select From Scene by clicking OK.
- Create a Selection Set named "SKIN_BONES".
- Unfreeze the Mesh layer.
- Disable XRay mode on the character mesh.
- Select the character mesh and apply a Skin modifier. (You'll deal with the head later).
- In the Skin modifier Parameters → Bones: Add, select the SKIN_BONES Selection Set. (The Selection Set operator might be hidden by the window size, look for the >>).
- Parameters → Edit Envelopes (Enabled) | Select: Vertices (Enabled).
- Display → Show No Envelopes (Enabled).
- Advanced Parameters → Bone Affect Limit: 4.
- Edit Envelope Mode (Disabled).
- Isolate a section of geometry for focus. For example, select the left foot polygons or element and Hide Unselected.
- If necessary, use Time Configuration to focus the necessary frames of animation for the isolated selection.
- Block out the skin by assigning vertices to their closest bone. The Lasso selection tool is handy at this stage.
- Set the Selection Center to Transform Center for proper orbiting.
- Select a group of vertices.
- Select the target bone.
- Weight Properties → Abs. Effect: 1.0
- Move up the bone chain, repeating the vertex selection and absolute effect adjustment.
- Scrub through the animation looking for crashing and over-rotating loops.
- Adjust any vertices that are not following a natural deformation by either adjusting the Abs. Effect of the bones or using the Weight Table and bone selection to assign ratios of influence.
Quick Weighting Script
- Copy the QuickSkinVertextweight.mcr to Program Files\Autodesk\3ds Max 2013\Macroscripts
- Restart 3DS Max if necessary.
- Customize → Customize User Interface.
- In Category → Custom Skin Tools assign a hotkey to the script.
- In Category → Skin Modifier assign hotkeys for Loop Selection (Skin) and Ring Selection (Skin)
- Shift+1, Shift+2, and Shift+3 are the recommended keys.
- Open QuickSkinVertextweight.mcr with MAXScript → Open Script…
- Edit the gridDist modifier to 0.01 or 0.02 to adjust the sensitivity.
- With the Skin blocked out, select a Ring or Loop of vertices, select the target Bone, and activate the script. Click and drag to slide through the weighting.
Mirroring Skin Data
- Skin Mirror tools allow the transfer of weighting information from one part of the mesh to another. They work best when the mesh is symmetrical.
- With an asymmetrical mesh, it is best to assign a proxy symmetrical mesh then transfer the skin data back using the Skin Wrap modifier.
- Copy the mesh and name it "mesh_proxy".
- Select the original mesh, remove the Skin modifier, and hide the mesh.
Select the proxy mesh and add a Symmetry modifier between mesh and Editable Poly and Skin.
- Set the Parameters → Threshold: 0.0 on the Symmetry modifier.
- Collapse the Symmetry modifier.
- Select the Skin modifier and Mirror Parameters → Mirror Mode (Enabled).
- Mirror Paste copies the weight data on selected vertices.
- The last two icons in Mirror Parameters allow wholesale pasting of vertex data from left to right or right to left.
- If, after pasting, certain verts have not copied correctly, lower the Mirror Thresh. and paste again.
- Block out the hips and lower spine bones.
- Move through and adjust vertex weights.
- For the central verts, follow this procedure:
- Select the central vertices on the hip.
- Open the Weight Properties → Weight Tool (Wrench) and select the left thigh bone.
- Click the .25 preset button to assign 25% influence.
- Select the right thigh and assign 25% influence.
- Select the middle bone in the Weight Tool dialog (should be the left thigh) and assign 100% influence.
- Select the last bone (should be right thigh) and assign 50% influence.
- Select the pelvis bone and assign 75% influence.
- Now adjust the center vertices in relation to the pelvis bone as normal.
- Block out the chest (Spine3).
- Move up the spine and adjust vertex weights.
- Hide the FK/IK branches for the arms if necessary.
- Select shoulder vertices and assign them to the Shoulder Roll bone.
- Select vertices closest to the collar and using the Weight Tool assign 10% influence to the Clav bone.
- Select the next group of vertices along the trapezius and assign 25% influence to the Clav bone.
- Again move outward and adjust the weighting, assigning influence to the Clav bone.
- Fine tune vertices with the Quick Weight script.
- Certain vertices will need weighting from the Spine bone to ground them.
- Vertices below the armpit should be blended with the Shoulder bone, not the roll bone.
- Block out the vertices, moving down the arm and assigning weights to the roll bones as they are crossed.
- Move through and adjust vertex weights.
- Block and blend.
- In some extreme poses, weighting verts to the middle of the forearm may be required.
- Mirror the vertex weights.
- Check for an inconsistencies and adjust as necessary.
- Unhide the original mesh (asymmetrical workflow).
- Apply a Skin Wrap modifier to the original mesh.
- Set Deformation Engine to Face Deformation and Falloff: 0.001.
- Add the proxy mesh.
- Click Add again to cancel.
- Hide the proxy mesh.
- Click Convert to Skin.
- Delete the Skin Wrap modifier.
Reset the Skin modifier to work in Vertex mode and Show No Envelopes, and Bone Affect Limit is restricted to 4.
- Weight and blend vertices in the asymmetrical parts of the mesh.
- To recover weighting information from a previous iteration:
- Open another 3DS Max session with the target iteration file loaded.
- Utilities → More… → Skin Utilities.
- Extract Skin Data to Mesh.
- Select the new mesh, SkinData_mesh.
- Isolate the skin data mesh and then in vertex sub-object mode isolate the vertices to restore.
- Invert the selection and delete everything except the vertices of interest.
- Save Selected into a separate file with a name + _fix.
- Close the new session and return to the working session.
- At frame 0, merge in the _fix file.
- Load Skin Utilities if necessary.
- Select _fix mesh and target mesh and click Import Skin Data From Mesh.
- Click Match by Name, then OK.
- Delete the imported _fix mesh.
- Test the animation.
- Mesh component notes: head mesh, tongue, upper teeth, lower teeth, left eye, right eye.
- Parent components to head bone.
- Hide the body mesh.
- Apply a Skin modifier to the head mesh.
- Add Bones → Select Bones → Expand All → select Spine3, Neck, and Head bones.
- In the Display rollout, enable Show No Envelopes and under Advanced Parameters set the bone limit to 3.
- Enable Vertices mode.
Block. Collect all the head vertices including the jaws and chin areas, and assign them to the Head bone.
- Assign the neck verts to the Neck bone. Assign the bottom two loops to the Spine3 bone.
- Blend. Remember it is only necessary to blend one half of the mesh, and use Skin Mirror tools to transfer vertex data later.
- Once satisfied with the head skinning, test the entire animation. Clear the animation by selecting all the keyframes and deleting them.
- The skinning is complete!
Foot Helpers and IK Chains
- Hide and freeze the mesh geometry.
- Unhide the IK/FK chains if necessary.
- Select the left ankle bone and then Animation → IK Solvers → HI Solver and click the left thigh bone.
- This creates a gizmo at the ankle that can be used to manipulate the IK chain. Rename it "mesh_l_heel_IKGoal".
- Repeat between toe bone and ankle bone, renaming the new IK Goal: "mesh_l_ball_IKGoal".
- Repeat between toe nub and toe bone, renaming: "mesh_l_toe_IKGoal".
- Create a Size: 4.0 Box (Enabled) Point Helper in the scene, renaming: "mesh_l_HeelPeel_hlp".
- Align the helper to the left toe bone, pivot to pivot, in position and orientation modes.
- Clone (Copy) the helper, renaming: "mesh_l_Heel_hlp".
- Align the clone to the ankle bone in position only.
- Clone (Copy) again, renaming: "mesh_l_ToeLift_hlp".
- Align the clone to the toe nub in position only.
- Clone (Copy) the HeelPeel_hlp in place, renaming: "mesh_l_ToeTap_hlp".
- Set the clone's size to 5.0 (larger).
- Set the Heel_hlp Z-position to 0 and move it to the back of the foot mesh.
- Set the ToeLift_hlp Z-position to 0 and move it to the tip of the foot mesh.
Foot Hierarchical Links
- Link ball_IKGoal and heel_IKGoal to HeelPeel_hlp.
- Link toe_IKGoal to ToeTap_hlp.
- Link HeelPeel_hlp and ToeTap_hlp to ToeLift_hlp.
- Select the ball_IKGoal and Motion → IK Solver Properties → Parent Space: IK Goal.
- Link ToeLift_hlp to Heel_hlp.
- Unhide the mesh for reference.
- Draw a simple Line around the left foot.
- Select the line and Rendering → Enable In Viewport (Enabled), Thickness: 0.5, Sides: 4.
- Adjust the line to fit outside the contours of the foot and hide the mesh.
- Align the line's pivot point to the Ankle bone in Position only.
- Rename the line: "mesh_l_Foot_ctrl".
- Link Heel_hlp to Foot_ctrl.
- Select all foot helpers and the control shape, and Alt+RC → Freeze Transforms.
Foot Custom Attributes
- Select the Foot_ctrl and add an Attribute Holder modifier.
- Animation → Parameter Editor (Alt+1).
- Add to Type: Selected Object's Current Modifier.
- Parameter Type: Float, UI Type: Spinner, Name: Heel Peel.
- Float UI Options → Size → Width: 100.
- Range → From 0.0 To: 10.0.
- Alignment: Right.
- Add another, Range → From -10.0 To 10.0, Name: Toe Tap.
- Add another, Range → From -10.0 To 10.0, Name: Toe Twist.
- Add another, Range → From 0.0 To 10.0, Name: Toe Lift.
- Add another, Range → From -10.0 To 10.0, Name: Heel Lift.
- Add another, Range → From -10.0 To 10.0, Name: Heel Twist.
- Animation → Reaction Manager.
- Click Add Master (Green Plus) and click on the Foot_ctrl in the viewport, no scene manager.
- Select Modified Object → Attribute Holder → Custom Attributes → Heel Peel.
- Select the newly-created Heel Peel Reaction, then select the HeelPeel_hlp and click Add Selected (White Plus).
- Select Transform → Rotation → Zero Euler XYZ → Z Rotation.
- Note: Never use the Frozen Rotation track!
- Click Create State (icon next to Create Mode in the Reaction Manager dialog).
- Change the State002 value to 10 to match the custom attribute's maximum spinner value.
Change the Z Rotation Value to -60. This means that if the spinner is set to 10, the point helper will be rotated -60 degrees.
- Test the spinner.
- Add Master for the Toe Tap attribute.
- Select the Toe Tap Reaction, and the ToeTap_hlp, and Add Selected using the Z Rotation.
- Create two new states.
- For State002 set the value to 10 and the Z Rotation to 45 degrees.
- Set State003's value to -10 and Z Rotation to -45 degrees.
- Wire the remaining reactions, working on appropriate axis as necessary for twists:
- Toe Twist: ToeLift Y, 60/-60
- Toe Lift: ToeLift Z, -60
- Heel Lift: Heel_hlp, Z -90/90
- Heel Twist: Heel_hlp, Y
- When determining values always overestimate the rotation degrees to allow for more freedom of animation.
- Select the heel_IKGoal and go to the Motion Panel.
- Select IK Solver Properties → Parent Space: IK Goal.
- Add a custom attribute to the Foot_ctrl for the knee swivel angle.
- Range → From -10.0 to 10.0, Name: Knee Swivel.
- In the Reaction Manager, add a new Master Reaction based on the newly created Knee Swivel custom attribute.
- Select the heel_IKGoal and Add Selected to wire the Swivel angle to the custom attribute.
- Add two new states and set the maximum and minimum values to range from 90 to -90 degrees.
Rig the right leg.
- Create a Spline → Circle with Radius: 15.0 (large enough to go around the body geometry.
- Enable the spline rendering in viewport and set the Thickness to 0.4.
- Reduce Sides: 3 and Interpolation → Steps: 3.
- Name: mesh_COM_ctrl (Center Of Mass).
- Align the COM_ctrl to the Pelvis bone, Pivot to Pivot in Position XYZ only.
- Create a smaller Circle with Radius: 13.0, Name; mesh_Hip_ctrl.
Align the Hip_ctrl to the Pelvis bone, Pivot to Pivot in both Position and Orientation XYZ.
- Convert the Hip_ctrl to Editable Spline and go to Selection → Spline.
- Using Local rotation, rotate the spline 90 degrees on local Y axis.
- Clone (Copy) Hip_ctrl, Name: mesh_SpineBase_ctrl.
- Align SpineBase_ctrl to Spine1 in Position and Orientation XYZ.
- Scale down the SpineBase_ctrl in Spline sub-object mode.
- Clone (Copy) SpineBase_ctrl, Name: mesh_NeckBase_ctrl.
- Align NeckBase_ctrl to the neck bone in Position and Orientation XYZ.
- Scale down the NeckBase_ctrl in Spline sub-object mode.
- Clone (Copy) the Neckbase_ctrl, Name: mesh_Head_ctrl.
- Align Head_ctrl to the head bone in Position and Orientation XYZ.
- Make the COM_ctrl red and the others blue.
- Choose a darker blue for the Hip_ctrl.
- Blue is for FK situations and red for IK situations.
- Isolate Hip_ctrl.
- Enable In Viewport (Disable).
- In Segment sub-object mode select the four segments that make the circle.
- End Point Auto-Welding → Divide: 7 (click).
- In Top view, select every other vertex and scale them in to create a wave pattern.
- Exit vertex mode, Enable In Viewport (Enable).
- Exit Isolate mode.
- Link Pelvis and Spine1 to COM_ctrl.
- Link blue controllers to COM_ctrl.
- Select all the shape controllers and Alt+RC → Freeze Transforms.
Linking vs. Constraining
- Ensure that hierarchy is established before freezing transforms.
- If neglected, it is always possible to re-freeze the transforms later.
- If re-frozen after wiring expressions, it will undo that work.
- If the work must be preserved, select and unlink the children and then Animation → Contraints → Position Constraint to parent.
- For each child, Motion Panel → Position Constraint → Keep Initial Offset (Enabled).
- Freeze the transforms.
- Select the Pelvis and Animation → Constraints → Orientation Constraint to Hip_ctrl.
- Repeat for Spine1 to SpineBase_ctrl.
- Repeat for Spine3 to NeckBase_ctrl.
- Repeat for Spine2 to Hip_ctrl.
- Select Spine2 and Motion Panel (PRS Parameters: Rotation) → Orientation Constraint → Add Orientation Target: NeckBase_ctrl. Keep Initial Offset (Enabled)
- Constrain Orientation of Head_bone to Head_ctrl.
- Constrain Orientation of Neck_bone to NeckBase_ctrl.
- Add Head_ctrl as Orientation Target to Neck_bone.
- Wire rotation axis between Spine1 and Hip_ctrl:
Test the controllers then reset Transforms to zero.
- Select Spine1 → Motion panel → (Rotation) Assign Controller → Rotation (Expand): Select Available and Add Euler XYZ controller.
- Right-click Spine1 → Wire Parameters → Transform → Rotation → Euler XYZ → X Rotation.
- Note: Select the X Rotation of the newly-added Euler XYZ track, not the original on top.
- Click Hip_ctrl → Transform → Rotation → Zero Euler XYZ → X Rotation.
- In Parameter Wiring dialog ensure Right to Left (second icon in center) is enabled.
- Click Connect.
- Add a negative sign to the expression Spine1_bone :: X_Rotation and Update.
- Add a "divide by 2" (/2) expression and Update.
- Repeat for Spine2_bone with a higher divide by value (3.5).
Arms FK Rigging
- Double-click the shoulder FK bone to select the FK chain.
- Isolate the selection.
- Create a circle sphere by first creating a circle, enabling it in viewport, then rotate-copying 2 more iterations to form a sphere shape.
- Rename: mesh_l_Shoulder_FK_ctrl.
- Align to the shoulder bone, pivot to pivot, in position and orientation.
- If necessary, enter Spline sub-object mode on the controller and rescale.
Fine tune the shape if necessary and re-color to match the FK bones.
- Copy the controller and rename: mesh_l_Elbow_FK_ctrl, then align to the forearm.
- Copy once more and rename: mesh_l_Hand_FK_ctrl, then align to the wrist nub.
- Resize the controllers if necessary.
- Link hand to elbow and elbow to shoulder.
- Constrain wrist nub orientation to hand controller.
- Constrain forearm bone orientation to elbow controller.
- Contrain shoulder bone orientation to shoulder controller.
- For the elbow controller, Hierarchy panel → Link Info → Lock X and Y rotations.
- Delete the reduntant rings on the elbow controller.
- Lock the positions of the controllers on all three axis.
- Exit Isolate mode and link the shoulder controller to the clavicle bone.
- Freeze the transforms on the controllers by selecting them and Alt+RC.
Arms IK Rigging
- Select and isolate the arm IK chain.
- Select the shoulder bone and Animation → IK Solvers → HI Solver to wrist.
- Select the IK goal and rename: mesh_l_Hand_IKGoal.
- Reduce the goal size in IK Display Options → Goal Display → Size: x.x
- Create a circle sphere, then set snaps to Endpoint.
- In Spline sub-object mode → Geometry → Create Line draw a cross shape between the rings and delete the rings. Rename: mesh_l_Hand_IK_ctrl.
- Align the shape to the wrist nub, pivot to pivot, in position and orientation.
- Scale it at sub-object level if necessary.
- Recolor to match the IK chain.
- Link the IK goal to the controller.
- Freeze transforms on the controller.
Select the controller and apply Attribute Holder modifier.
- Alt+1 to open the Parameter Editor.
- Name the attribute: "Elbow Swivel" and set Width: 100.
- Range: -10 to +10.
- Alignment: Right.
- Add the attribute to the modifier.
- Animation → Reaction Manager…
- Add Master (Black Cross icon) and click the controller → Modified Object → Attribute Holder → Custom_Attributes → Elbow Swivel.
- Select the IK goal and Add Selected (White Cross icon) → Transform → Swivel Angle.
- Add two new states and set them to 10/90 and -10/-90.
- Test and reset the transforms to zero.
Arms Clavicle Rigging
- Create a 3-ring controller, name: mesh_l_Clavicle_ctrl.
- Align to left clavicle, pivot to pivot, in position and orientation.
- Exit sub-object mode and relocate the controller somewhere above the left shoulder.
- Adjust scale and thickness at sub-object level if necessary.
- Link the controller to Spine3.
- Match the controller color to the FK color.
- Alt+RC to freeze the Transforms.
- Constrain the clavicle's orientation to the controller.
- Test and reset.
Arms Blending IK/FK
- Double-click the left clavicle bone to select the whole hierarchy.
- Add the clavicle and IK controllers to the selection and isolate.
- Ensure all arm controllers are transformed to zero.
- Select the mesh_l_Wrist_bone and constrain its orientation (Animation → Constraints) to the Wrist_IK_bone and the Wrist_FK_bone.
- Set the Motion panel in Rotation mode. It is important that the IK_bone is above the FK_bone in the Target panel.
- Constrain the Forearm_bone to the IK_Forearm_bone then the FK_Forearm_bone.
- Constrain the Shoulder_bone to the IK_Shoulder_bone then the FK_Shoulder_bone.
- Select Hand_IK_ctrl and go to the Modify panel.
- Press Alt+1 to access the Parameter Editor dialog.
- Name the new Custom Attribute: IK/FK Blend, Width: 100, Range 0 to 100, Justification: Right.
- Make sure the Hand_IK_ctrl is still selected and Alt+5 for Parameter Wiring Dialog.
- On the Left pane, click the Refresh icon to display the IK controller node.
- Expand → Modified Object → Attribute Holder → Custom_Attributes → IK/FK Blend.
- Select the Wrist_bone.
- On the Right pane, click the Refresh icon to display the Wrist_bone.
- Expand → Transform → Rotation → Orientation Constraint. There are two entries, Weight 0 for the IK weight, Weight 1 for the FK weight.
- Select Weight 1 and select the Hand_IK_ctrl in the viewport.
- Set the control direction from left to right and click Connect.
- Select Weight 0, set the control direction from left to right, and set the Expression to read "100-IK_FK_Blend" and click Connect.
- Select the Forearm_bone and refresh the right pane in the wiring dialog.
- Repeat the wrist steps.
- Repeat for the Shouler_bone.
- Close the wiring dialog and select the Hand_IK_ctrl.
- Test the IK/FK Blen attribute.
- Ctrl+drag the Custom Attribute modifier to the other arm controllers.
- Reset all arm controllers to zero.
- Select the Hand_IK_ctrl and go to the Modify panel.
- MAxScript → Open Script.
- Select the IK_FK_SNAP.ms file (included in tutorial).
- Modify the transform labels to match the current mesh and side.
- Tools → Evaluate All (Ctrl+E).
- Select the Shoulder_FK_ctrl and set the IK/FK Blend: 100.0.
- Create a Point helper in the scene: Box, name: mesh_l_ShoulderTwist_hlp, size: 1.0.
- Align the helper to the Shoulder bone, pivot to pivot, in Position and Orientation.
- Position constrain (Animation → Constraints) the helper to the shoulder bone.
- Orientation constrain the helper to the shouder bone and the clavicle bone.
- LookAt constrain the ShoulderRoll_bone to the forearm bone.
- Note: the LookAt Axis may need to be flipped for proper orientation.
- Select the ShoulderRoll_bone and Motion panel → Select Upnode: World (Disabled) and select the ShoulderTwist_hlp as the Upnode (clicking the None button).
- Test the rotation by rolling the Shoulder_FK_ctrl and adjusting any vertex weights if necessary.
- Note: mirror the vertex information to the opposing side if changed.
- Select the ShoulderRoll_bone and reduce the Viewline Length to a more reasonable value (7).
- Select ForearmRoll1_bone.
- LookAt constrain the roll bone to the wrist bone.
- Use the same wrist bone as an Upnode in the roll bone's parameters.
- Select ForearmRoll2_bone.
- Orientation constrain the roll2_bone to the roll1_bone and the forearm_bone.
- Reduce the Viewline Length on ForearmRoll1_bone.
Rig the right arm.
- Create a 3-ring controller for the pinky finger, name: mesh_l_Pinky_ctrl.
- Align the controller to the Pinky_1bone, pivot to pivot in position and orientation.
- Adjust the size of the controller in sub-object spine mode.
- Shade the controller FK blue.
- Copy the controller, name: mesh_l_Ring_ctrl.
- Align to Ring_1bone.
- Repeate for Middle, Index, and Thumb.
- Check the sizes of the controllers against the mesh geometry.
- Link each finger base bone to its appropriate controller.
- Link all 5 controllers to the hand bone.
- Select all 5 controllers and Alt+RC Freeze Transforms.
- Lock the X Rotation and all Move and Scale functionality on finger controllers.
- Add an Attribute Holder modifier to the Pinky_ctrl.
- Alt+1, name: Pinky Curl, Width: 100, Range 0 to 10, justify right. Add.
- Animation → Reaction Manager → New Master control for this attribute.
- Select Pinky_2 and Pinky_3 bones and wire their Z-rotations as reactions (White Cross → Transform → Rotation → Zero Euler XYZ → Z Rotation).
- Create a new state for 90 when 10.
- Test the attribute. If the rotation is going in the wrong direction, reverse the rotation values in the States.
- Create custom attributes for the other fingers and thumb.
- Instance the modifier (Ctrl+drag) to the other controllers.
- Use the Reaction Manager to establish reactions between finger controllers and their respective finger joints.
Rig the right hand.
Final Check and Wrap Up
- Create a controller shape, position it at 0,0,0 and name: mesh_Main_ctrl.
- Link the foot and COM controllers to the Main controller.
- Freeze the Main controller transforms.
- Color the foot controllers to match the IK color (red).
- Reduce the foot IKGoal sizes to make them less prominent.
- Hide the arm IK/FK bones.
- Lock al position and scale axis on FK controllers.
- Rename the Attribute Holder modifiers to match their function.
- Select the entire rig and create a selection set name: "Complete Rig".
- Set the Selection Filter (next to smart select icon) to Shapes and select all the shapes in the scene. Create a selection set name: "Anim Controls".
- Reset the Selection Filter to All.
- Place the controllers on the Controllers Layer.
- Create a new Helpers Layer and add the helpers to it.
- Create a 3-ring controller and position it in front of the head and link to the head bone.
- Align the orientation of the controller to match one of the eyeballs.
- Freeze the transforms on the controller and both eyeballs.
- Orientation constrain the eyeballs to the controller.
To reset the pose, select the Anim Controls selection and reset the transforms to zero. Zero out any Custom Attribute parameters that may have been changed.
Tips and Tricks
- Customize User Interface → Polar Snapping Mode → assign hotkey.
- Based on Angle snapping settings.
As Animated Reveal Masks
- Add a UVW Map modifer to object → Channel: Map Channel: 2.
- Target object uses standard Arch & Design material.
- Create Gradient Ramp in the Material Slate Editor.
- Wire it to the Cutout Map of the material.
- On the Gradient Ramp:
- Coordinates: Map Channel: 2.
- Gradient Ramp Parameters → Interpolation: Solid.
- Gradient Ramp Parameters → Noise: Amount: variable, Size: variable.
- The gradient flags can be animated using Auto-Key. Once set up, adding an Unwrap UVW to the object and manipulating the position of the UV shells using the UV coordinate position as a "time line" will control how much of the mesh is revealed and when.
As Texture Generator
- Create a Gradient Ramp and wire it to the Diffuse slot of the material.
- Gradient Ramp Parameters: Interpolation: Solid.
- Colors: variable, add a 4th flag.
- Coordinates → Angle: W: 90.0.
- Duplicate the Gradient Ramp and wire the duplicate to the Flag #1 Texture input.
- NOTE! RC Gradient Ramp flags to allow input of any type of map, not just solid colors.
- Used to create different states of the scene. Useful for setting up different lighting modes or experimenting with settings.
- Rendering → State Sets…
Max Creation Graph
- Visual programming language for tool creation. Create mesh tools, modifiers, and utilities using a node-based graph system.
- Accessed via Scripting → Max Creation Graph Editor.
- Left panel consists of drag-and-droppable Operator Nodes.
- Selecting a dropped Operator activates the Operator Description panel in the bottom left; this jumps to the documentation for that Operator.
- Input/Output sockets can be wired out to add more Operators to the Graph.
- MMB to pan, MouseWheel to zoom, quick-navigation clicks via the map in the top right.
- Use X to open an Operator Search box anywhere.
- Anything built in the MCG Editor is retained when closing the window.
- Creating a new graph while an existing one is open will add a new tab containing the new graph to the MCG Editor.
- When entering Constant values, use decimal places to define floats. Values without decimals will be treated as integers.
- When creating a graph to be used as a modifer, drag off from the mesh socket and find the corresponding Modifier Operator.
- In order to activate a new graph, use Ctrl+E in the MCG Editor.
- When creating modifiers, it's best practice to start with the Output: modifier Operator.
- It is also common to know the type of input the graph will receive, so in the case of a TriMesh mesh, an Implicit parameter Modifier: TriMesh can be dropped in the graph as well.
- Operator nodes are color coded:
- Purple: Compound operators, "graph-within-graph" functions. The can be RC → Open Compount in New Tab to view contents.
- Shift+Move an Operator to clone it in the graph.
- Ctrl+Alt+Move an Operator to move it along with any child operators.
- Multiply Operator allows combination of outputs into one input.
- Ctrl+Move an Operator over a connecting wire to insert it between Operators.
- RC on Operator → Generate Parameters to quickly create parameters for open input sockets, automatically naming them based on the inputs.
- When working with angular degrees, a ToRadians Operator will more accurately convert Parameter values into workable amounts.
- Build → View MAXScript to see the graph translated into script.
- A method for customizing the UI for a MCG is to copy the relevant UI script from the script editor into the Edit → Edit Graph Properties… → Custom UI tab. There it can be reordered and scripted accordingly.
- Collapsing part of a graph into a Compound Operator involves copy and pasting the target Operators into a new view (RC the tab bar of the editor), adding an Output: compound Operator at the end and generating Input Operators at the beginning. Save these graphs as .maxcompound files. Remember to Operators → Reload Operators to enable access to new Compound Operators.
- Note! As of this writing (15-04-23) Compound Operators must be saved in the default Compounds folder of Autodesk/3ds Max 2016.
- Best practice is to follow Parameter: Inode with a CheckNodeValidity Operator.
- MeshFromNode operator extracts mesh information from input object.
- The Map Operator transforms one array into another via a function.
- When defining a graph for mesh creation, the name given in Graph Properties → Category: is where it will appear in the Creation panel.
- In order to share and install MCGs, their dependencies must be packaged via File → Package Max Creation Graph…
- Once packaged, restart 3ds Max and Scripting → Install Max Creation Graph (.mcg) Package…
- Tools installed this way appear in C:/Users/username/Autodesk/3ds Max 2016/Max Creation Graph / Tools / Downloads so in order to remove them they must be deleted from this location and 3ds Max restarted.
- In the event of a 3ds Max re-install, kill all files under the Max Creation Graph folder. There's also a hidden folder that needs to be murdered, refer to this video for details.
3ds Max → Unreal Engine 4.27 and Substance (January 6, 2022)
I'll start by simply noting the steps I took in establishing the pipeline. My goal is to have everything set up across the three applications to maximize efficiency in export while maintaining a high degree of "what you see is what you get" (WYSIWYG) visualization.