helper joints: advanced deformations on runtime characters jason parks character technical director...
Post on 19-Jan-2016
225 Views
Preview:
TRANSCRIPT
Helper Joints:Helper Joints:Advanced Advanced
Deformations on Deformations on RunTime CharactersRunTime Characters
Jason ParksJason Parks
Character Technical DirectorCharacter Technical Director
Sony Computer Entertainment Sony Computer Entertainment AmericaAmerica
2
Contacts, Reference, Contacts, Reference, CreditsCredits• Email::
– jason@jason-parks.com– jason_parks@playstation.sony.com
• Webpage (Helper Joints-GDC 2005):– http://www.jason-parks.com/HelperJoints
• PAN Arts AVIs by Warwick MellowPAN Arts AVIs by Warwick Mellow• Human Model by Sven Jenson via Human Model by Sven Jenson via
Miller/Thuriot’s MasterClass 2003 Miller/Thuriot’s MasterClass 2003 (Character Creation Toolkit)(Character Creation Toolkit)
• BodyBlend render by Zach GrayBodyBlend render by Zach Gray• Wrinkle R&D by Tyler Crook (SCEA)Wrinkle R&D by Tyler Crook (SCEA)
3
Intended AudienceIntended Audience• ““Advanced – Requires experience Advanced – Requires experience
and familiarity with subject.”and familiarity with subject.”– Maya Technical Artists who ‘Bind Maya Technical Artists who ‘Bind
Characters’ for RunTime or Offline Characters’ for RunTime or Offline usageusage• Paint weights Paint weights (Artisan and Component (Artisan and Component
Editor)Editor)
• Apply deformersApply deformers• Use Set Driven KeysUse Set Driven Keys• Write ExpressionsWrite Expressions• Use Utility NodesUse Utility Nodes
4
TopicsTopics• What are Helper Joints?What are Helper Joints?
– DefinitionDefinition• Why use Helper Joints?Why use Helper Joints?
– New uses for Extra JointsNew uses for Extra Joints– Smooth binding sucks & Where to use Helper JointsSmooth binding sucks & Where to use Helper Joints
• How to use Helper Joints?How to use Helper Joints?– Our Goals, Disclaimer, FusiformsOur Goals, Disclaimer, Fusiforms– Research: The Basic Building BlocksResearch: The Basic Building Blocks
• RunTime RigsRunTime Rigs– SetDrivenKeysSetDrivenKeys– ExpressionsExpressions– ConstraintsConstraints
• Non-RunTime RigsNon-RunTime Rigs– Baking OutBaking Out– Spline IKSpline IK– Jiggle DeformerJiggle Deformer
• Automating ProductionAutomating Production– ScriptingScripting– WorkflowWorkflow– Muscle SystemsMuscle Systems– Procedurally generated Helper JointsProcedurally generated Helper Joints
5
Stop Talking, No more text, Stop Talking, No more text, show some Moving show some Moving Pictures!Pictures!
6
Helper Joints DefinedHelper Joints Defined• ““Helper Joints” are secondary joints Helper Joints” are secondary joints
offset from the standard hierarchy offset from the standard hierarchy which will translate, rotate, or scale to which will translate, rotate, or scale to achieve a “hand sculpted” affect on an achieve a “hand sculpted” affect on an area of vertices.area of vertices.
• They can be within the primary They can be within the primary hierarchy (parented, grouped, rigged), hierarchy (parented, grouped, rigged), or outside of the primary hierarchy or outside of the primary hierarchy (point or parentConstrained)(point or parentConstrained)
• They can be controlled by They can be controlled by SetDrivenKeys, Expressions, Simple SetDrivenKeys, Expressions, Simple Rigs (constraint system), or Super Rigs (constraint system), or Super Advanced Rigs (really any simulation Advanced Rigs (really any simulation you can think of) that are baked-out.you can think of) that are baked-out.
7
Why use any Extra Why use any Extra Joints?Joints?
• Traditional usage of Extra Joints Traditional usage of Extra Joints to animate Props and Accessoriesto animate Props and Accessories
• Extra “Helper Joints” to fix Extra “Helper Joints” to fix Smooth bindingSmooth binding
• Extra “Helper Joints” to create the Extra “Helper Joints” to create the next level in realismnext level in realism
Unlike characters rigged, bound, and Unlike characters rigged, bound, and rendered in Maya or any other high-end rendered in Maya or any other high-end 3D package, your characters at run-time 3D package, your characters at run-time need to follow a very specific rule set need to follow a very specific rule set depending on your Game Engine. depending on your Game Engine. Because all run-time engines already Because all run-time engines already support joints, it is a tool we can exploit support joints, it is a tool we can exploit and push to its limits.and push to its limits.
8
Traditional Extra JointsTraditional Extra Joints
• Traditional usage of Extra Traditional usage of Extra Joints for Props and Joints for Props and Accessories:Accessories:– Props, RopeProps, Rope– Hair, PonytailsHair, Ponytails– Capes, Necklaces, ClothingCapes, Necklaces, Clothing– FatFat
9
New Ideas for Extra New Ideas for Extra JointsJoints•Extra “Helper Joints” Extra “Helper Joints” to create the next to create the next level in realism:level in realism:– Skin slidingSkin sliding– WrinklesWrinkles– Fat/Muscle/Flesh JiggleFat/Muscle/Flesh Jiggle– Muscle bulgingMuscle bulging
10
Fix Smooth bindingFix Smooth binding
•Extra “Helper Joints” to Extra “Helper Joints” to make skin transform make skin transform properly:properly:– Volume maintenanceVolume maintenance– Crease fixingCrease fixing– Complex AreasComplex Areas
• Multiple joints affecting a single vertMultiple joints affecting a single vert
11
Smooth Binding LimitedSmooth Binding Limited
• Vertex deforms by a Vertex deforms by a weighted combination of weighted combination of Linear Translations Linear Translations around a joint rotatingaround a joint rotating
12
Smooth Binding Smooth Binding ShoulderShoulder
13
Smooth Binding Problem Smooth Binding Problem AreasAreas• Elbow and Knee:Elbow and Knee:
– Interpenetration on the inside of the creaseInterpenetration on the inside of the crease– Loss of volume on the outside of the crease (i.e. Loss of volume on the outside of the crease (i.e.
– the elbow tip or knee cap do not become – the elbow tip or knee cap do not become ‘pointy’ when the elbow or knee bends)‘pointy’ when the elbow or knee bends)
• Wrist/Forearm:Wrist/Forearm:– Loss of volume when the forearm/wrist is twisted Loss of volume when the forearm/wrist is twisted
too much down the length of the arm. (i.e. - too much down the length of the arm. (i.e. - ‘Candy-wrapper’ affect)‘Candy-wrapper’ affect)
• Upper Thigh/Gluteus:Upper Thigh/Gluteus:– Interpenetration at the bottom of the butt cheek Interpenetration at the bottom of the butt cheek
when leg goes too far backwhen leg goes too far back
• Shoulders:Shoulders:– Interpenetration in armpitInterpenetration in armpit– Interpenetration at the neck/shoulder junction Interpenetration at the neck/shoulder junction
area (trapezius)area (trapezius)– Lack of representation of scapula movementsLack of representation of scapula movements
14
Our Goals – The “Ideal”Our Goals – The “Ideal”
• What are we really trying to What are we really trying to get?get?
• Reference with MotionReference with Motion– BooksBooks
• ““Anatomy of Movement” by Blandine C. Anatomy of Movement” by Blandine C. GermainGermain
– InternetInternet• PAN Arts by Warwick MellowPAN Arts by Warwick Mellow
– SoftwareSoftware• Absolute Character Tools for 3DSMAXAbsolute Character Tools for 3DSMAX
15
Our GoalsOur Goals
• PAN PAN ResearchResearch– PectoralsPectorals– ShoulderShoulder
ss
16
Our GoalsOur Goals
•PAN PAN ResearchResearch– ClavicleClavicle– ForearmForearm
17
Our GoalsOur Goals• Muscles – Independent ResearchMuscles – Independent Research
18
Our GoalsOur Goals• Muscles - Absolute Character ToolsMuscles - Absolute Character Tools
19
Disclaimer: RunTime Rig Disclaimer: RunTime Rig SupportSupport• Individual Developer code will Individual Developer code will
dictate what will be evaluated in dictate what will be evaluated in Real-Time and what type of Real-Time and what type of relation you can specify between relation you can specify between your primary skeleton’s animation your primary skeleton’s animation and your Helper Joints’ and your Helper Joints’ transformation.transformation.
• Hopefully you can get 1 or more Hopefully you can get 1 or more of these RunTime Rigging of these RunTime Rigging methods supported:methods supported:– SetDrivenKeysSetDrivenKeys– ExpressionsExpressions– ConstraintsConstraints
20
Disclaimer: RunTime Rig Disclaimer: RunTime Rig SupportSupport• NO:NO:
– Source Code provided for Source Code provided for engine side.engine side.
• YES:YES:– Techniques for art-side Techniques for art-side
production of rigs (in Maya)production of rigs (in Maya)
• Applicable to all games on all Applicable to all games on all consolesconsoles
21
How To Get ThereHow To Get There
• Muscles are the drivers in Muscles are the drivers in reality so lets create Helper reality so lets create Helper Joints that mimic the way Joints that mimic the way muscles work.muscles work.
• Simple FusiForm muscles are Simple FusiForm muscles are easy to mimic in Maya so lets easy to mimic in Maya so lets create those and bind them create those and bind them to our skinto our skin
22
Research – FusiForm Research – FusiForm MuscleMuscle• ““FusiForm” muscle: Quick DefinitionFusiForm” muscle: Quick Definition
– ‘‘Tapering at each end; spindle-shaped.’Tapering at each end; spindle-shaped.’
23
Research – The Building Research – The Building BlocksBlocks• Let’s pick the Biceps as our test Let’s pick the Biceps as our test
case to create a muscle and mimic case to create a muscle and mimic its action with a Helper Joint being its action with a Helper Joint being driven by SetDrivenKeys:driven by SetDrivenKeys:– RotatingRotating– ScalingScaling– TranslatingTranslating
• The research explores the The research explores the underlying mechanisms of the rigsunderlying mechanisms of the rigs
• The ‘failed’ attempts still illustrate The ‘failed’ attempts still illustrate how rigs can be put togetherhow rigs can be put together
24
Research – The Building Research – The Building BlocksBlocksUNDERSTANDING HOW UNDERSTANDING HOW
THE RIGS WORKTHE RIGS WORK
IS MORE VALUABLEIS MORE VALUABLE
THEN MY SUGGESTED THEN MY SUGGESTED SOLUTIONSSOLUTIONS
25
Research – Biceps Research – Biceps (NURBs)(NURBs)• Muscle as Muscle as
Influence Influence Object - NURBsObject - NURBs
26
Research – Biceps Research – Biceps (Polys)(Polys)• Muscle as Muscle as
Influence Influence Object - Object - PolygonsPolygons
27
Research – Biceps Research – Biceps (Short)(Short)• SetDrivenKey SetDrivenKey
w/ Single Driver w/ Single Driver AxisAxis– RotatingRotating
• ShortShort
28
Research – Biceps Research – Biceps (Long)(Long)• SetDrivenKey SetDrivenKey
w/ Single Driver w/ Single Driver AxisAxis– Rotating Rotating
• LongLong
29
Research – Biceps Research – Biceps (Scale)(Scale)• SetDrivenKey SetDrivenKey
w/ Single Driver w/ Single Driver AxisAxis– ScalingScaling
30
Research – Biceps Research – Biceps (Translate)(Translate)• SetDrivenKey SetDrivenKey
w/ Single w/ Single Driver AxisDriver Axis– TranslateTranslate
31
Research – Upper Arm Research – Upper Arm (Translate)(Translate)• Single Driver AxisSingle Driver Axis
– TranslateTranslate– Works pretty good for Single driving Works pretty good for Single driving
axis!axis!
Warning: Not anatomically correct!Warning: Not anatomically correct!
32
Research – Biceps Research – Biceps (RollBone)(RollBone)• SetDrivenKey SetDrivenKey
w/ Single w/ Single Driver AxisDriver Axis– TranslateTranslate– Add RollAdd Roll– BREAKS!BREAKS!
33
Research – Biceps Research – Biceps (RollBone)(RollBone)• SetDrivenKey w/ SetDrivenKey w/
Two Driver AxisTwo Driver Axis– TranslateTranslate– Add RollAdd Roll– w/ Extra Keys w/ Extra Keys
compensating compensating for rollfor roll
– Only fixes in Only fixes in when arm is when arm is straight outstraight out
– When arm is When arm is bent it still bent it still BREAKS!BREAKS!
34
Research – Biceps Research – Biceps (RollBone)(RollBone)• Add parent joint w/ another set of Add parent joint w/ another set of
driven keys for rolldriven keys for roll– Rotation of Helper’s parent joint is Rotation of Helper’s parent joint is
percentage of primary hierarchies percentage of primary hierarchies rotationrotation
35
Research – Shoulder (Multiple Research – Shoulder (Multiple Drivers)Drivers)• SetDrivenKey SetDrivenKey
w/ Single w/ Single Driver Axis Driver Axis from Two from Two bonesbones– TranslateTranslate– Combination is Combination is
difficultdifficult
36
Research – Shoulders (Multiple Research – Shoulders (Multiple Drivers)Drivers)• SetDrivenKey SetDrivenKey
w/ Two Driver w/ Two Driver Axis from Two Axis from Two bonesbones– TranslateTranslate– 2 Driving bones 2 Driving bones
= BREAKS!= BREAKS!(kinda)(kinda)
– + 2 Driving axis + 2 Driving axis = BREAKS!BAD!= BREAKS!BAD!
37
RunTime Rigs – RunTime Rigs – SetDrivenKeysSetDrivenKeys• SummationSummation
– SetDrivenKeys are fast, easy to SetDrivenKeys are fast, easy to use and work great for use and work great for “simple” Helper Joints“simple” Helper Joints• 1 drive1 driveRR joint and 1 drive joint and 1 driveRR axis axis
per driveper driveNN Helper Joint Helper Joint• Nest hierarchies of driveNest hierarchies of driveNN Helper Helper
Joints if you have more than 1 Joints if you have more than 1 drivedriveR R joint or axisjoint or axis
38
RunTime Rigs – SDKs for RunTime Rigs – SDKs for Volume PreservationVolume Preservation
• Forearm Helper Joint w/ SDK’s for Forearm Helper Joint w/ SDK’s for Scale and rotationScale and rotation
39
RunTime Rigs – SDKs for RunTime Rigs – SDKs for WrinklesWrinkles
• Scaling of Helper Joints (R&D by Scaling of Helper Joints (R&D by Tyler Crook @ SCEA)Tyler Crook @ SCEA)
40
RunTime Rigs – SDKs for RunTime Rigs – SDKs for WrinklesWrinkles
• Joints are scaling on 2-axis Joints are scaling on 2-axis (bulging), no scaling on length-wise (bulging), no scaling on length-wise axisaxis
• No translation or rotationNo translation or rotation
41
RunTime Rigs – SDKs for RunTime Rigs – SDKs for WrinklesWrinkles• Weighting is very tediousWeighting is very tedious
42
RunTime Rigs – SDKs for RunTime Rigs – SDKs for WrinklesWrinkles
• For shirt it takes many more joints For shirt it takes many more joints because of 3 D.O.F. and larger because of 3 D.O.F. and larger surface.surface.– 6 joints to do it right6 joints to do it right
43
RunTime Rigs – SDKs for RunTime Rigs – SDKs for WrinklesWrinkles
• Different joints scale for each Different joints scale for each direction in each D.O.F.direction in each D.O.F.
• Weighting is time consumingWeighting is time consuming
44
RunTime Rigs – SDKs for RunTime Rigs – SDKs for WrinklesWrinkles• Incorporation:Incorporation:
– Could theoretically add a Could theoretically add a scaling joint as a child of scaling joint as a child of the helper jointsthe helper joints
– Then just weight individual Then just weight individual vertices to these scaling vertices to these scaling joints to cause ‘wrinkling’joints to cause ‘wrinkling’
– Or just make separate Or just make separate scaling wrinkle joints scaling wrinkle joints wherever neededwherever needed
45
RunTime RigsRunTime Rigs
• Done with SDKsDone with SDKs• Start ExpressionsStart Expressions
46
RunTime Rigs – Expressions RunTime Rigs – Expressions (Simple:Elbow)(Simple:Elbow)
• Simple Helper Joints which only need a Simple Helper Joints which only need a TranslationTranslation Expression Expression– Based on 1 axis from driving boneBased on 1 axis from driving bonedj_helper.ty = (base.ty + (maxOffset * (elbow.rz dj_helper.ty = (base.ty + (maxOffset * (elbow.rz
/maxAngle)))/maxAngle)))
47
RunTime Rigs - Expressions RunTime Rigs - Expressions (Complex:Biceps)(Complex:Biceps)
• Complex Helper Joints which need Complex Helper Joints which need TranslationTranslation & & RotationRotation Expression Expression– TranslationTranslation: Use another expression to translate : Use another expression to translate
dj_bicep joint (parented to Bicep_Helper) for dj_bicep joint (parented to Bicep_Helper) for bulge based on elbow rotation.bulge based on elbow rotation.
• Expression 2 – Describes bulge from rotation of Expression 2 – Describes bulge from rotation of elbow’s Z-axiselbow’s Z-axis
dj_bicep.ty = (base.ty + (maxOffset * (elbow.rz dj_bicep.ty = (base.ty + (maxOffset * (elbow.rz /maxAngle)))/maxAngle)))
base.ty = 5, maxOffset = 1.8, maxAngle = 110base.ty = 5, maxOffset = 1.8, maxAngle = 110– RotationRotation: Joint needs to be parented to both : Joint needs to be parented to both
shoulder and bicep-roll joints. Use Expression to shoulder and bicep-roll joints. Use Expression to take percentage.take percentage.
• Expression 1 – Describes rotation of parent joint Expression 1 – Describes rotation of parent joint around bicep-roll joint. (60% from shoulder, 40% around bicep-roll joint. (60% from shoulder, 40% from bicep-roll)from bicep-roll)
Bicep_Helper.rx = ((.4 * bicep.rx) + (.6 * Bicep_Helper.rx = ((.4 * bicep.rx) + (.6 * shoulder.rx))shoulder.rx))
48
RunTime Rigs - Expressions RunTime Rigs - Expressions (Complex:Biceps)(Complex:Biceps)
RotationRotation: Bicep_Helper.rx = ((.4 * bicep.rx) + (.6 * shoulder.rx)): Bicep_Helper.rx = ((.4 * bicep.rx) + (.6 * shoulder.rx))TranslationTranslation: dj_bicep.ty = (base.ty + (maxOffset * (elbow.rz : dj_bicep.ty = (base.ty + (maxOffset * (elbow.rz
/maxAngle)))/maxAngle)))
base.ty = 5, maxOffset = 1.8, maxAngle = 110base.ty = 5, maxOffset = 1.8, maxAngle = 110
49
RunTime Rigs – Expressions & RunTime Rigs – Expressions & Constraints (Complex:Biceps)Constraints (Complex:Biceps)• Complex Helper Joints which need Complex Helper Joints which need ScaleScale
& & RotationRotation Expressions but looking at Expressions but looking at DistanceDistance
• Requires Requires 66 extra parent helpers (can be joints extra parent helpers (can be joints or ‘nulls’)or ‘nulls’)
• Component 1 – Component 1 – ScaleScale (Bulge) (Bulge)– Handled by expression based on distance of Handled by expression based on distance of
‘shock-absorber’‘shock-absorber’bicepHelper.sz = (scaleFactor*(1/(boneLength))) : bicepHelper.sz = (scaleFactor*(1/(boneLength))) :
boneLength = sqrt ((foreArmOffset.tx – boneLength = sqrt ((foreArmOffset.tx – bicepOffset.tx)² + (foreArmOffset.ty – bicepOffset.tx)² + (foreArmOffset.ty – bicepOffset.ty)² + (foreArmOffset.tz – bicepOffset.ty)² + (foreArmOffset.tz – bicepOffset.tz)²)bicepOffset.tz)²)
• Component 2 – Component 2 – RotateRotate– Handled by expression base on % of angle of Handled by expression base on % of angle of
bicep_rollbicep_rollBicep_Helper.rx = ((.4 * bicep.rx) + (.6 * Bicep_Helper.rx = ((.4 * bicep.rx) + (.6 *
shoulder.rx))shoulder.rx))• Requires Requires 22 pointConstraintspointConstraints
50
RunTime Rigs – Expressions & RunTime Rigs – Expressions & Constraints (Complex:Biceps)Constraints (Complex:Biceps)
• ScaleScale Expression Expression based on based on distancedistance
51
RunTime Rigs - RunTime Rigs - ExpressionsExpressions• SummationSummation
– Very difficult to describe a Very difficult to describe a motion of a Complex Helper motion of a Complex Helper Joint based on 2 or more axis Joint based on 2 or more axis from driving joint. Even MORE from driving joint. Even MORE difficult when there are difficult when there are multiple bones acting as multiple bones acting as drivers.drivers.
52
RunTime RigsRunTime Rigs
• Done with ExpressionsDone with Expressions• Start with ConstraintsStart with Constraints
53
RunTime Rigs - RunTime Rigs - ConstraintsConstraints• pointConstraintpointConstraint
– Good for position onlyGood for position only
• orientConstraintorientConstraint– Good for orientation onlyGood for orientation only
• parentConstraintparentConstraint– Good for both position and orientationGood for both position and orientation
• aimConstraintaimConstraint– Robust and elegantRobust and elegant
• vertexConstraintvertexConstraint– Allows the use of musclesAllows the use of muscles
54
RunTime Rigs - RunTime Rigs - ConstraintsConstraints
AIMAIMCONSTRAICONSTRAINTNT
ISIS
DA BOMB!DA BOMB!
55
RunTime Rigs – Constraints RunTime Rigs – Constraints (Complex:Biceps)(Complex:Biceps)• aimConstrainaimConstrain
tt pointing at pointing at forearmforearm– Arc problemArc problem– Handles Handles
rotation of rotation of bicep roll on bicep roll on extension but extension but not flexionnot flexion
56
RunTime Rigs – Constraints RunTime Rigs – Constraints (Complex:Biceps)(Complex:Biceps)
– aimConstraintaimConstraint flexion flexion problemproblem• Handles Handles
rotation of rotation of bicep roll on bicep roll on extension but extension but not flexionnot flexion
57
RunTime Rigs – Constraints RunTime Rigs – Constraints (Complex:Biceps)(Complex:Biceps)
– aimConstraintaimConstraint flexion problem flexion problem handled on XZ plane w/ handled on XZ plane w/ expression for Bulgeexpression for Bulge
Bicep_Helper’sParent.scale = (baseScale + (maxOffset * Bicep_Helper’sParent.scale = (baseScale + (maxOffset * (elbow.rz /maxAngle)))(elbow.rz /maxAngle)))
i.e. - baseScale = 1, maxOffset = .3, maxAngle = 110i.e. - baseScale = 1, maxOffset = .3, maxAngle = 110
58
RunTime Rigs – Constraints RunTime Rigs – Constraints (Complex:Biceps)(Complex:Biceps)
– aimConstraintaimConstraint still broken on Y still broken on Y plane during flexionplane during flexion
59
RunTime Rigs – Constraints RunTime Rigs – Constraints (Complex:Pectoralis)(Complex:Pectoralis)
• Requires 2 extra parent helpers (can Requires 2 extra parent helpers (can be joints or ‘nulls’)be joints or ‘nulls’)
• Requires 1 Requires 1 aimConstraintaimConstraint
60
RunTime Rigs – Constraints RunTime Rigs – Constraints (Complex:ArmPit)(Complex:ArmPit)
• Requires 2 extra parent helpers (can Requires 2 extra parent helpers (can be joints or ‘nulls’)be joints or ‘nulls’)
• Requires 1 Requires 1 aimConstraintaimConstraint
61
RunTime Rigs – Constraints RunTime Rigs – Constraints (Complex:Pectoralis & (Complex:Pectoralis & Armpit)Armpit)• Requires 3 extra parent helpers Requires 3 extra parent helpers
(can be joints or ‘nulls’)(can be joints or ‘nulls’)• Requires 2 Requires 2 aimConstraintsaimConstraints
62
RunTime Rigs – Constraints RunTime Rigs – Constraints (Simple:Neck)(Simple:Neck)
• Look at normal smooth bindLook at normal smooth bind
63
RunTime Rigs – Constraints RunTime Rigs – Constraints (Simple:Neck)(Simple:Neck)
• NURBs muscle as Influence ObjectNURBs muscle as Influence Object
64
RunTime Rigs – Constraints RunTime Rigs – Constraints (Simple:Neck)(Simple:Neck)
• Requires 1 helper joint and 1 Requires 1 helper joint and 1 target null for aimingtarget null for aiming
• Requires 1 Requires 1 aimConstraintaimConstraint
65
RunTime Rigs – Constraints RunTime Rigs – Constraints (Simple:Neck)(Simple:Neck)• ComparisonComparison
66
RunTime Rigs – Constraints RunTime Rigs – Constraints (Simple:Neck - Back)(Simple:Neck - Back)
• Requires 1 helper joint and 1 target Requires 1 helper joint and 1 target null for aimingnull for aiming
• Requires 1 Requires 1 aimConstraintaimConstraint
67
RunTime Rigs – Constraints RunTime Rigs – Constraints (Simple:Neck - All)(Simple:Neck - All)• Requires 4 helper joints w/ 4 extra Requires 4 helper joints w/ 4 extra
target nullstarget nulls
• Requires 4 Requires 4 aimConstraintsaimConstraints
68
RunTime Rigs – Constraints RunTime Rigs – Constraints (SuperComplex – Scapula)(SuperComplex – Scapula)
• Look at normal smooth bindLook at normal smooth bind
69
RunTime Rigs – Constraints RunTime Rigs – Constraints (SuperComplex – Scapula)(SuperComplex – Scapula)• What is scapula really doing?What is scapula really doing?
70
RunTime Rigs – Constraints RunTime Rigs – Constraints (SuperComplex – Scapula)(SuperComplex – Scapula)
• ComparisonComparisonWith Rig Normal Binding
71
RunTime Rigs – Constraints RunTime Rigs – Constraints (SuperComplex – Scapula)(SuperComplex – Scapula)
• ShruggingShrugging
72
RunTime Rigs – Constraints & RunTime Rigs – Constraints & (Exp./SDK) (SuperComplex – (Exp./SDK) (SuperComplex – Scapula)Scapula)– Requires 2 helper joints and 2 target Requires 2 helper joints and 2 target
nulls for aimingnulls for aiming– Requires 2 Requires 2 aimConstraintsaimConstraints & 1 & 1
pointConstraintpointConstraint– Requires expression w/ “if” statement:Requires expression w/ “if” statement:
If (lShoulder.rotateY >0)If (lShoulder.rotateY >0){{
l_scapulaConst.rotateX = ( $scaleFactor* l_scapulaConst.rotateX = ( $scaleFactor* (lShoulder.rotateY/$maxAngle));(lShoulder.rotateY/$maxAngle));
}}ElseElse{{
l_scapulaConst.rotateX = 0;l_scapulaConst.rotateX = 0;} }
Ex: $scaleFactor = 30 degrees and $maxAngle =90 degrees.Ex: $scaleFactor = 30 degrees and $maxAngle =90 degrees.
OR SetDrivenKeyOR SetDrivenKey
73
RunTime Rigs – Constraints & RunTime Rigs – Constraints & (Exp./SDK) (SuperComplex – (Exp./SDK) (SuperComplex – Scapula)Scapula)• Explanation of (SDK or “If” Explanation of (SDK or “If”
statement in expression)statement in expression)
74
RunTime Rigs – Constraints & RunTime Rigs – Constraints & (Exp./SDK) (SuperComplex – (Exp./SDK) (SuperComplex – Scapula)Scapula)• Pros: Full Range Looks GreatPros: Full Range Looks Great• Cons: Complex and Weighting is Cons: Complex and Weighting is
Hard!Hard!
75
RunTime Rigs – RunTime Rigs – Expression/SDK (Complex – Expression/SDK (Complex – ArmPitBack)ArmPitBack)• Normal armpit creaseNormal armpit crease
76
RunTime Rigs – RunTime Rigs – Expression/SDK (Complex – Expression/SDK (Complex – ArmPitBack)ArmPitBack)• New Helper Joint addedNew Helper Joint added
77
RunTime Rigs – RunTime Rigs – Expression/SDK (Complex – Expression/SDK (Complex – ArmPitBack)ArmPitBack)• Translation of Helper Joint Translation of Helper Joint
tip driven by expression or tip driven by expression or SetDrivenKey from shoulder SetDrivenKey from shoulder rotation rotation
• Requires 1 extra parent Requires 1 extra parent Helper Joint w/ percentage Helper Joint w/ percentage rotation of shoulder driven rotation of shoulder driven by by RotateRotate expression or expression or SetDrivenKeySetDrivenKey
78
RunTime Rigs – RunTime Rigs – Expression/SDK (Complex – Expression/SDK (Complex – ArmPitBack)ArmPitBack)• armPitParent Joint rotating 60% of armPitParent Joint rotating 60% of
shoulder jointshoulder joint
79
RunTime Rigs – Exp./SDK RunTime Rigs – Exp./SDK (Complex – ArmPitBack)(Complex – ArmPitBack)• armPitTip joint translating down its armPitTip joint translating down its
local X & Y as a function of shoulder local X & Y as a function of shoulder rotationrotation
80
RunTime Rigs – Exp./SDK RunTime Rigs – Exp./SDK (Complex – ArmPitBack)(Complex – ArmPitBack)• Requires 1 simple expression for parent Requires 1 simple expression for parent
Joint’s rotation:Joint’s rotation:HelperParent.rotateY = (offset angle + ((% arm rotate) * HelperParent.rotateY = (offset angle + ((% arm rotate) *
lShoulder.rotateY)))lShoulder.rotateY)))Ex - dj_armPitBackParent.rotateY = (-35 * (.6 * lShoulder.rotateY));Ex - dj_armPitBackParent.rotateY = (-35 * (.6 * lShoulder.rotateY));
• Requires 1 expression for translation of tip w/ Requires 1 expression for translation of tip w/ “if” statement:“if” statement:
If (lShoulder.rotateY <0){If (lShoulder.rotateY <0){HelperTip.translateX = (base.tX + HelperTip.translateX = (base.tX + ($scaleFactorX*(lShoulder.rY/$maxAngle)));($scaleFactorX*(lShoulder.rY/$maxAngle)));HelperTip.translateY = (base.tY + HelperTip.translateY = (base.tY + ($scaleFactorY*(lShoulder.rY/$maxAngle)));($scaleFactorY*(lShoulder.rY/$maxAngle)));
}Else{}Else{HelperTip.translateX = baseX;HelperTip.translateX = baseX;HelperTip.translateY = baseY;HelperTip.translateY = baseY;
}} Ex: $scaleFactorX = 2 units, $scaleFactorY = -4 units and $maxAngle Ex: $scaleFactorX = 2 units, $scaleFactorY = -4 units and $maxAngle
=65 degrees.=65 degrees.
81
RunTime Rigs – Exp./SDK RunTime Rigs – Exp./SDK (Complex – ArmPitBack)(Complex – ArmPitBack)
• Weighting is powerful and tricky. Weighting is powerful and tricky. Some vertices now have 5 different Some vertices now have 5 different weights.weights.
82
RunTime Rigs – Scaling RunTime Rigs – Scaling Entire RigEntire Rig• What if character needs to be What if character needs to be
scaled? (i.e.- player defined scaled? (i.e.- player defined proportions)proportions)
• A simple ‘Group’ node above the rig A simple ‘Group’ node above the rig mechanism in Maya’s hierarchy will mechanism in Maya’s hierarchy will scale easilyscale easily
• The Trick is figuring out how much The Trick is figuring out how much to scale. This is dependent on what to scale. This is dependent on what ‘space’ the helper joint deforms, ‘space’ the helper joint deforms, and how that space has been scaled.and how that space has been scaled.
83
RunTime RigsRunTime Rigs
• Done with ConstraintsDone with Constraints• Start with MusclesStart with Muscles
84
RunTime Rigs - MusclesRunTime Rigs - Muscles
• Muscles at RunTime Muscles at RunTime allows you to constrain allows you to constrain Helper Joints to the Helper Joints to the muscle surface and get muscle surface and get the effect of the musclethe effect of the muscle
• Requires some sort of Requires some sort of geometryConstraintgeometryConstraint
85
RunTime Rigs – Constraints RunTime Rigs – Constraints & Bind & Blendshape & Bind & Blendshape (Muscles:Biceps)(Muscles:Biceps)• Deformer Object is low-count Deformer Object is low-count
poly muscle rigid (or smooth) poly muscle rigid (or smooth) bound to two joints to handle bound to two joints to handle twisting of biceptwisting of bicep
• Requires a blendShape on Requires a blendShape on deformer object to handle deformer object to handle bulge.bulge.– *Note: blendShape is not *Note: blendShape is not
required on main skinning required on main skinning surface.surface.
• Complex Helper Joint is Complex Helper Joint is ‘‘VertexConstrainedVertexConstrained’ to vertex ’ to vertex on Deformer Objecton Deformer Object
86
RunTime Rigs – Constraints RunTime Rigs – Constraints & Bind & Blendshape & Bind & Blendshape (Muscles:Biceps)(Muscles:Biceps)
• VertexConstrainVertexConstraineded
87
RunTime Rigs – Constraints RunTime Rigs – Constraints & Bind & SDK & Bind & SDK (Muscles:Biceps)(Muscles:Biceps)• Poly Muscle (Simplest Form)Poly Muscle (Simplest Form)
– 1 triangle Rigid (or Smooth) Bound1 triangle Rigid (or Smooth) Bound• Handles rotation of bicepHandles rotation of bicep
– SDK (or simple expression [1 SDK (or simple expression [1 driving bone/axis, 1 driven driving bone/axis, 1 driven translating axis]) driving single translating axis]) driving single vertex for bulgevertex for bulge
– Complex Helper joint Complex Helper joint ‘‘VertexConstrainedVertexConstrained’ to single vert’ to single vert
– Finally skinning layerFinally skinning layer
88
RunTime Rigs – Constraints RunTime Rigs – Constraints & Bind & SDK & Bind & SDK (Muscles:Biceps)(Muscles:Biceps)• 1 Poly (Simplest Form)1 Poly (Simplest Form)
– VertexConstraintVertexConstraint
89
RunTime Rigs – Constraints RunTime Rigs – Constraints & Bind (Muscles:Pectoralis)& Bind (Muscles:Pectoralis)• Deformer Object is low-count poly Deformer Object is low-count poly
muscle rigid (or smooth) bound to muscle rigid (or smooth) bound to three joints to handle complex three joints to handle complex Pectorals motionPectorals motion
• Requires MuscleDriver parent Requires MuscleDriver parent joints to be offset from main joints to be offset from main skeletal jointsskeletal joints
• MuscleDriver child joints are MuscleDriver child joints are ‘‘pointConstrainedpointConstrained’ to parent joints ’ to parent joints to avoid rotation of parent jointsto avoid rotation of parent joints
• Complex Helper Joint is Complex Helper Joint is ‘‘VertexConstrainedVertexConstrained’ to vert on ’ to vert on Deformer ObjectDeformer Object
90
RunTime Rigs – Constraints RunTime Rigs – Constraints & Bind (Muscles:Pectoralis)& Bind (Muscles:Pectoralis)
• PointConstraintsPointConstraints & & VertexConstraintsVertexConstraints
91
RunTime Rigs to Non-RunTime Rigs to Non-RunTimeRunTime
92
Non-RunTime RigsNon-RunTime Rigs
• Helper Joints Definition:Helper Joints Definition:– They can be controlled by They can be controlled by
SetDrivenKeys, Expressions, SetDrivenKeys, Expressions, Simple Rigs (constraint system), Simple Rigs (constraint system),
or or Super Advanced Rigs Super Advanced Rigs (really any simulation (really any simulation you can think of) that are you can think of) that are baked-out.baked-out.
93
Non-RunTime Rigs - Baked Non-RunTime Rigs - Baked OutOut• BakeOut BakeOut
examplesexamples– BicepBicep– Complex Helper Complex Helper
Joints Joints constrained to constrained to nurbsMuscle nurbsMuscle influence influence object, baked object, baked out, 1 key per out, 1 key per frame, scene frame, scene cleaned.cleaned.
94
Non-RunTime Rigs - Baked Non-RunTime Rigs - Baked OutOut• BakeOut BakeOut
examplesexamples– PectoralsPectorals– Complex Helper Complex Helper
Joints Joints constrained to constrained to nurbsMuscle nurbsMuscle influence influence object, baked object, baked out, 1 key per out, 1 key per frame, scene frame, scene cleaned.cleaned.
95
Non-RunTime Rigs - Baked Non-RunTime Rigs - Baked OutOut• BakeOut BakeOut
examplesexamples– PectoralsPectorals– Lots!Lots!
96
Non-RunTime Rigs - Non-RunTime Rigs - SplineIKSplineIK• Great Skin-sliding effectGreat Skin-sliding effect
97
Non-RunTime Rigs - Non-RunTime Rigs - JiggleJiggle• Basic Jiggle is fairly easy to Basic Jiggle is fairly easy to
create in Maya, either with a:create in Maya, either with a:– Simple ExpressionSimple Expression– frameCache nodeframeCache node
• Could be turned into Could be turned into RunTime if your code RunTime if your code supported itsupported it
98
Non-RunTime Rigs - Non-RunTime Rigs - JiggleJiggle• Create a 1 (or Create a 1 (or
more) frame lag more) frame lag in global space in global space for a jointfor a joint– BaseJoint = BaseJoint =
‘Goal’‘Goal’• Blue joint Blue joint
parented to spineparented to spine
– EndJoint = EndJoint = ‘Weighted’‘Weighted’• Yellow joint Yellow joint
lagging behind lagging behind Blue joint by 1 Blue joint by 1 frameframe
99
Non-RunTime Rigs - Non-RunTime Rigs - JiggleJiggle• Expression:Expression:
int $frame = frame; // get the current int $frame = frame; // get the current frameframe
float $tx_0 = BellyJiggleBase.translateX;float $tx_0 = BellyJiggleBase.translateX;float $tx_1;float $tx_1;// reset the attributes on start frame// reset the attributes on start frameif ($frame == 1){ // start frameif ($frame == 1){ // start frame
$tx_1 = $tx_0;$tx_1 = $tx_0;BellyJiggleEnd.translateX = $tx_0;BellyJiggleEnd.translateX = $tx_0;
}}else{else{
BellyJiggleEnd.translateX = $tx_1;BellyJiggleEnd.translateX = $tx_1;$tx_1 = $tx_0;$tx_1 = $tx_0;
}}
Repeat for Y & Z axisRepeat for Y & Z axis
100
Non-RunTime Rigs - Non-RunTime Rigs - JiggleJiggle• frameCache NodeframeCache Node
101
Non-RunTime Rigs - Non-RunTime Rigs - JiggleJiggleframeCacheframeCache ExpressionExpression
102
Non-RunTime Rigs - Non-RunTime Rigs - JiggleJiggle• Incorporation:Incorporation:
– Could theoretically add a jiggle Could theoretically add a jiggle joint as a child of the helper joint as a child of the helper jointsjoints
– Then just weight individual Then just weight individual vertices to these jiggle joints to vertices to these jiggle joints to cause ‘jiggling’cause ‘jiggling’
– Or just make separate jiggle Or just make separate jiggle joints and their ‘base’ joint joints and their ‘base’ joint wherever neededwherever needed
– Where are they needed?Where are they needed?
103
Non-RunTime Rigs to Non-RunTime Rigs to AutomationAutomation
104
AutomatingAutomating Production Production
•ScriptsScripts•WorkflowWorkflow•Offline Muscle SystemsOffline Muscle Systems•Procedurally generated Procedurally generated
Helper JointsHelper Joints
105
AutomatingAutomating Production Production• Scripts: Tools you’ll needScripts: Tools you’ll need
– Script to auto-build entire Helper Script to auto-build entire Helper Joint System on your characterJoint System on your character• Selectable body partsSelectable body parts
– Scripts to automate editing of Rigs, Scripts to automate editing of Rigs, SetDrivenKeys, & Expressions for SetDrivenKeys, & Expressions for the artiststhe artists
– Scripts to do lots of mirroring:Scripts to do lots of mirroring:• Helper Joint RigsHelper Joint Rigs• WeightingWeighting• Set Driven KeysSet Driven Keys
– Export and Import Set Driven KeysExport and Import Set Driven Keys• Hint: look at the animCurves and add Hint: look at the animCurves and add
custom attrs for connections to them custom attrs for connections to them upon exportupon export
• DemoDemo
106
Automating ProductionAutomating Production
• WorkflowWorkflow– Duplicate your primary skeleton Duplicate your primary skeleton
and skinand skin– Apply your muscle system to this Apply your muscle system to this
duplicate characterduplicate character– Constrain duplicate skeleton to Constrain duplicate skeleton to
primary skeletonprimary skeleton– Hide duplicated skeleton, Hide duplicated skeleton,
muscles, & rigs. Template muscles, & rigs. Template duplicated skin.duplicated skin.
107
Automating ProductionAutomating Production• WorkflowWorkflow
108
The Ultimate ReferenceThe Ultimate Reference
• Muscle Muscle SystemsSystems
109
The Ultimate ReferenceThe Ultimate Reference• Muscle Muscle
SystemsSystems
110
The Ultimate ReferenceThe Ultimate Reference
• Muscle SystemsMuscle Systems– Auto imports muscle systemAuto imports muscle system
•Scaling to your skeletonScaling to your skeleton
– AutoFits muscles to AutoFits muscles to duplicated skinduplicated skin
– AutoSkins muscles to duped AutoSkins muscles to duped skinskin
111
The Ultimate ReferenceThe Ultimate Reference• Once you have the “Ultimate Once you have the “Ultimate
Reference”, you now have Reference”, you now have the data to let a programmer the data to let a programmer put you out of a job. All (s)he put you out of a job. All (s)he needs to figure out is:needs to figure out is:– How many joints?How many joints?– Where to place them?Where to place them?– How do they need to How do they need to
transform?transform?– What does their weighting What does their weighting
need to be?need to be?
112
Mohr/Gleicher MethodMohr/Gleicher Method• Siggraph 2003 : “Building Efficient, Siggraph 2003 : “Building Efficient,
Accurate Character Skins from Accurate Character Skins from Example”Example”– White Paper on auto-computing White Paper on auto-computing
placement, animation, and weighting of placement, animation, and weighting of Helper Joints. Helper Joints.
113
ConclusionConclusion• We’ve covered just a few examples of how to use We’ve covered just a few examples of how to use
SetDrivenKeys, Constraints, and Expressions.SetDrivenKeys, Constraints, and Expressions.• My solutions are just first shot attempts. With My solutions are just first shot attempts. With
refinement, you can come up with much better refinement, you can come up with much better solutions.solutions.
• With these simple tools you can use them in many With these simple tools you can use them in many combinations to achieve nearly any effect you need.combinations to achieve nearly any effect you need.
• Of course everything is RunTime code dependent. As Of course everything is RunTime code dependent. As Character T.D.s we need to fight for:Character T.D.s we need to fight for:– SetDrivenKeysSetDrivenKeys– ConstraintsConstraints
• Point, orient, Point, orient, !!AIM!!!!AIM!!, parent, geometry, parent, geometry– ExpressionsExpressions– Spline IKSpline IK– frameCache (jiggle)frameCache (jiggle)
• Helper Joints are just a temporary solution until we can Helper Joints are just a temporary solution until we can get more advanced deformers at RunTime to simulate get more advanced deformers at RunTime to simulate MusclesMuscles– Per-vertexDeformer (influence objects)Per-vertexDeformer (influence objects)– WrapDeformer (lattices)WrapDeformer (lattices)– fusiForm deformerfusiForm deformer
. . . Talk more about this next year?. . . Talk more about this next year?
114
ThanksThanks
•… … for your time.for your time.•Please fill out surveys Please fill out surveys
so I can make a better so I can make a better one next year.one next year.
•Peace outPeace out
115
Contacts, Reference, Contacts, Reference, CreditsCredits
• Email::– jason@jason-parks.com– jason_parks@playstation.sony.c
om
• Webpage (Helper Joints-GDC 2005):– http://www.jason-parks.com/
HelperJoints
top related