### Raycasting based auto-rigging method for humanoid

```Raycasting based auto-rigging
method for humanoid meshes
Romain LOPEZ
Christophe POIREL
Rigging
Biped
Armature
AutoRigging
Similar Works
Frankenrig
Christian Miller
Okan Arikan
Don Fussell
Symposium on
Interactive 3D
Graphics and Games
(I3D) 2010
Similar Works
Skeleton Extraction from a Mesh for Easy Skinning Animation
Roman Durikovic
Tomas Agoston
Tomoyuki Nishita
13th International
Conference on
Human and
Computer - HC 2010
Similar Works
Pinocchio
Ilya Baran & Jovan Popovi´c
SIGGRAPH 2007
The method
It’s in two parts:
• 2D body-mapping of the mesh.
• 3D raycasting to center the bones.
Tools used : Blender, Python
Body mapping :
Silhouette
Why a body mapping?
Armature:
Legs
Arms
Torso
Human point of view
Anybody can identify
the differents body
parts of a mesh.
It’s more difficult for a
computer…
Computer point of view
It’s a 3D points cloud.
How to simplify the
mesh?
Creating a 2D projection
Using a grid in front
of the mesh:
A ray is cast through
each hole in the grid.
A a ray hits the
mesh, we keep the
instersection point.
Silhouette
Each intersection
point is put on the
same plane:
silhouette
Requirement: all
limbs must be
separated and
visible.
Outlining
Final silhouette
Only the outlining
points are necessary
to identify the limbs.
How to find them?
First step
The lower slice with four
points matches the
legs.
Paths
regarding three paths.
What for?
Finding the legs
We go through the
middle path, from
point to point,
keeping the max
height.
Finding the arms
We save the legs
and remove them.
Among the remaining
points, the edges are
the arms.
The points along the
edge of the legs are
the hips.
Starting point
We calculate the line
equation between
the arm and the hip.
If there’s a point
between them on the
line, it’s the starting
point.
Y = A*X + B
Finding the arm pits
We increase ‘b’ in the
line equation.
At each step, we look
for the closest point
to the line.
The point ends up
being « stuck » in the
arm pit.
Finding the arm
The points between
the hip and the arm
pit are stored and
removed.
Starting with the arm
pit, from point to
point, we reach the
point with the same
abscissa as the arm
pit.
We remove the arms,
and the remaining
Result
Here is a body
mapping.
Now, how to place
the bones using it?
Raycasting
Placing the bones
Entry points
Provided by the body
mapping.
The arm
We start in the arm.
The arm pit is the
height limit, the stop
point.
How to use these
points to place the
bones?
Raycasting
From the entry point,
inside the slice, we
cast rays in all
directions.
Inside view
We keep the closest
intersection points
from the entry point.
Projection
The rays are cast
from the entry point.
Polygon
the intersection
points.
How the find its
center?
Barycenter
Each point has
weight depending on
the distance to its
closest neighbour.
Therefore, for this
slice, the bone will go
through the
barycenter.
Step by step
From the barycenter
we go down the limb.
Again, at each slice,
we cast rays to find
the next barycenter.
Stop condition
The algorithm stops
when it’s outside the
mesh.
Then it goes back in
the opposite
direction.
N.B. : There’s no
hand rigging for now.
Stop condition
We stop when we
reach the arm pit.
Bone path
The barycenters
found at each step
are candidates for
the joint positions.
Bone path
The joints positions
will be used to place
the bones.
Shoulder
The shoulder is
found by casting a
ray in the opposite
direction of the arm
path.
It’s placed half way of
the intersection point.
limbs ?
Leg
Hip
The hip is on the
vector of the path at
an anatomical ratio of
the leg length.
All the points are found
Placement de l’armature
Armature ratios
Foot
Foot
Final result
The rest position
It’s the initial position
of the armature in the
motion capture data.
From this position,
rotations will be
applied frame by
frame.
Our goal
Here’s the rigged
character.
We want to put its
armature in rest
position while moving
the mesh.
Method
Using any frame to
cancel its rotations,
so it will be back in
rest position.
Method
We modify this frame
to place fit the rigged
armature, by
applying rotations,
translations and
scalings.
Then we bind this
frame’s armature to
the mesh. This way
the mesh will be
moved with the
bones.
Method
Then, we cancel the
rotations so the
armature is back in
rest position.
We apply the mesh
transformation.
Then, again,
mesh.
Method
mocaps to our rigged
character in order to
animate it.
Conclusion
Results
3788 faces
8.8 seconds
Results
8820 faces
13.1 seconds
Results
1425 faces
5.2 seconds
Future works
Enhancing the
shoulder positionning.
Enable the user to
improve the bones
placement.
Questions?
Romain LOPEZ : [email protected]/* <![CDATA[ */!function(t,e,r,n,c,a,p){try{t=document.currentScript||function(){for(t=document.getElementsByTagName('script'),e=t.length;e--;)if(t[e].getAttribute('data-cfhash'))return t[e]}();if(t&&(c=t.previousSibling)){p=t.parentNode;if(a=c.getAttribute('data-cfemail')){for(e='',r='0x'+a.substr(0,2)|0,n=2;a.length-n;n+=2)e+='%'+('0'+('0x'+a.substr(n,2)^r).toString(16)).slice(-2);p.replaceChild(document.createTextNode(decodeURIComponent(e)),c)}p.removeChild(t)}}catch(u){}}()/* ]]> */
Christophe POIREL : [email protected]/* <![CDATA[ */!function(t,e,r,n,c,a,p){try{t=document.currentScript||function(){for(t=document.getElementsByTagName('script'),e=t.length;e--;)if(t[e].getAttribute('data-cfhash'))return t[e]}();if(t&&(c=t.previousSibling)){p=t.parentNode;if(a=c.getAttribute('data-cfemail')){for(e='',r='0x'+a.substr(0,2)|0,n=2;a.length-n;n+=2)e+='%'+('0'+('0x'+a.substr(n,2)^r).toString(16)).slice(-2);p.replaceChild(document.createTextNode(decodeURIComponent(e)),c)}p.removeChild(t)}}catch(u){}}()/* ]]> */
```