images from http://www.animationartist.com
SIGGRAPH 95 Inverse Kinematics notes
latest iteration of rotoscoping
What do we want to capture
- facial movements - e.g. use a human actor to animate the facial features of a cat
- figure motion within a limited space - e.g. a person doing tai chi chuan
- figure motion within an extended space - e.g. small group playing basketball or fighting
Types of Tracking
is the most popular way of doing the work.
How many sensors are needed?
What to do after capturing the information?
Current systems allow you to apply the character's motion to the CG character in real-time to see if everything is working correctly (or at least correctly enough that you can move on to the next shot
studios charge > $10,000 per hour
People in the backgrounds in Titanic, reissue of classic Star Wars
characters in Star Wars new trilogy
characters in Shrek, King Kong
characters in Final Fantasy - the Spirits Within and Final Fantasy
For Final Fantasy there was no facial motion capture
For capturing the action the set was 8 by 10 by 2.5 metres with 16 cameras
examples of motion capture in the CAVE using only two trackers.
King Kong (2005), and previously Walking with Dinosaurs had some nice
a couple weeks we will take a look at EVL's motion capture facility to
get you ready to make use of it in the third project.
"The branch of mechanics concerned with the motions of objects without being concerned with the forces that cause the motion."
Given a linked structure with joints and the angles at each joint, forward kinematics gives us the position at the end of the structure (end effector). There is a solution.
an animation point of view we are often interested in giving a position
for the end of the linked structure and having the joints realistically
do what they need to do to accomplish that. For example animating a
person reaching up to grab a particular book off a bookshelf, or
bending down to pick up a book off the floor. This brings us to ...
goal directed motion
may be 0, 1,
or more solutions - i.e. if I want to grab a particular book on the
shelf with my right hard, I
might not be able to reach it from where I are currently standing no
matter how I move my upper arm, lower arm and wrist, or
there may be several different possible upper arm / lower arm / wrist
orientations that satisfy
my hand (end effector) grabbing the book.
system - there is no solution
underconstrained system - many solutions
lot of the
research in this area comes from robotics - you have an articulated
robot arm and you want it to grab the book on the shelf for you - how
do you set all the appropriate joints to do that. Robots have
particular types of joints; humans have particular types of joints,
differet animals have different types of joints.
one or two simple joints then there may be a small finite number of
analytical solutions, but living creatures are much more complicated.
To model a human being correctly its important to understand the differing degrees of freedom in joints of human body
Given the number of joints in the hands, they can be particularly complicated. How about something a little simpler:
Its also important that the motion not only be possible but that it match the way humans move - ie if we have the choice of moving our hand or our entire arm we will minimize our effort and move just the hand. While a computer knows exactly where our hand will end up, human beings are constantly making adjustments so our movement wont be as smooth or predictable as that generated by a computer through simple interpolation.
samples from a nice
set of slides by Bill Baxter at UNC on inverse kinematics
what we want to do is incrementally solve the problem. At each time
step we work out how to move/rotate each joint to move the end effector
towards the goal. The simplification is that for a small enough time
period the actual angular motion can be approximated by linear motion.
a set of joint angles θ (θ1, θ2, θ3,
etc, and the end effector located at ex, ey, ez
e = f(θ) so given all of the θs we can compute e
we want is that given e we can compute (a, the best) set of θs: θ = f-1(e)
are going to use the Jacobian which is a matrix of partial derivatives
of all of the angles relative to the position of the end effector. In
the more complicated case you would also deal with the rotation of the
end effector and add rows into the Jacobian for the roll, pitch, and
yaw of the end effector
J = δ e / δ θ which can be expanded into this matrix
| δ ex / δ θ1 δ ex / δ θ2 ... δ ex / δ θn |
δ ey / δ θ1 δ ey / δ
θ2 ... δ ey / δ θn | = J
δ ez / δ θ1 δ ez / δ θ2
... δ ez / δ θn |
Its important that all of the values in the Jacobian are in the same coordinate system.
term in the matrix relates a change in that joint to a change in the
end effector. Each column gives the change in velocity of the end
relative to the change in a given joint angle.
So how do we compute the Jacobian? For a simple example lets say that the axis of rotation for these joints is going into the page and declare that p1 is at 0,0,0 then:
= unit vector pointing out of the page
pi = x,y,z location of joint i
Vi = e - pi (the vector from pi to e)
Ji (ith column) = ni x Vi
| ((0,0,1) X e)x (0,0,1) X (e - p2)x (0,0,1) X (e - p3)x |
((0,0,1) X e)y (0,0,1) X (e - p2)y
(0,0,1) X (e - p3)y | = J
| ((0,0,1) X e)z (0,0,1) X (e - p2)z (0,0,1) X (e - p3)z |
Given the current location of the end effector, and the location we want the end effector to be at we can say:
= etarget - ecurrent
Δ θ = J-1 Δ e
θt+1 = θt + Δ θ
we need to compute the inverse Jacobian (or a pseudo inverse if J is
not invertable), and as long as Δ e is a small step the system will
converge. If the step is too big the end effector may move away from
the goal. Once the joint angles are changed then the Jacobian must be
recomputed so the next time it is used the linear approximation will be
jacobian at the ubiquitous wikipedia:
are some more related notes:
is a simpler / faster algorithm called cyclic coordinate descent from A
Hitchhiker's Guide to Virtual Reality by McMenemy and Ferguson
loopCounter = 0;
maxLoopCounter = some upper limit;
(loopCounter < maxLoopCounter) and (target not reached)
currentLink = last
link in the chain (the pivot connected to the end effector)
while (currentLink exists)
Rotate currentLink so that a line from currentLink through the end effector passes through the target
// that will do the rotation all at once, for smoother motion
// you probably want to define a max amount of rotation per iteration
// Choose an axis of rotation
that is perpendicular to the plane defined
// by any two of the linkages meeting at the point of rotation.
// Do not violate any angle restrictions
currentLink = next link in the chain (away from the end effector)
loopCounter += 1;
flocking / artificial life
Class has been cancelled today due to events on the East Coast.
more on kinematics / motion tracking / people