Blending & State Machines CSE169: Computer Animation Instructor: Steve Rotenberg UCSD, Winter 2004.

Slides:



Advertisements
Similar presentations
First of all – lets look at the windows you are going to use. At the top you have a toolbar, with all your various tools you can use when customising your.
Advertisements

Animation in Video Games presented by Jason Gregory
Blending & State Machines CSE169: Computer Animation Instructor: Steve Rotenberg UCSD, Winter 2005.
Transformations We want to be able to make changes to the image larger/smaller rotate move This can be efficiently achieved through mathematical operations.
The Assembly Language Level
Cubic Curves CSE167: Computer Graphics Instructor: Steve Rotenberg UCSD, Fall 2006.
Quick Sort, Shell Sort, Counting Sort, Radix Sort AND Bucket Sort
Verbs and Adverbs: Multidimensional Motion Interpolation Using Radial Basis Functions Presented by Sean Jellish Charles Rose Michael F. Cohen Bobby Bodenheimer.
Channels & Keyframes CSE169: Computer Animation Instructor: Steve Rotenberg UCSD, Winter 2005.
Multimedia System and Networking UTD Slide- 1 University of Texas at Dallas B. Prabhakaran Blending & State Machines.
Cubic Curves CSE169: Computer Animation Instructor: Steve Rotenberg UCSD, Winter 2005.
Trajectory Generation
Lecture 29 of 42 Bezier Curves and Splines Wednesday, 02 April 2008
Data Structures Data Structures Topic #13. Today’s Agenda Sorting Algorithms: Recursive –mergesort –quicksort As we learn about each sorting algorithm,
Lecture 4: interpolation, channels.  Linear:  Quadratic:  Cubic:
Data Structures Hash Tables
Chapter 2: Algorithm Discovery and Design
Character Animation CSE 191A: Seminar on Video Game Programming Lecture 5: Character Animation UCSD, Spring, 2003 Instructor: Steve Rotenberg.
CSE 830: Design and Theory of Algorithms
Channels & Keyframes CSE169: Computer Animation Instructor: Steve Rotenberg UCSD, Winter 2004.
CS274 Spring 01 Lecture 5 Copyright © Mark Meyer Lecture V Higher Level Motion Control CS274: Computer Animation and Simulation.
Animation. Outline  Key frame animation  Hierarchical animation  Inverse kinematics.
Midterm Review CSE169: Computer Animation Instructor: Steve Rotenberg UCSD, Winter 2004.
Hashing General idea: Get a large array
Chapter 1 Program Design
Chapter 2: Algorithm Discovery and Design
CS 106 Introduction to Computer Science I 10 / 16 / 2006 Instructor: Michael Eckmann.
© 2011 Delmar, Cengage Learning Chapter 8 Building Complex Animations.
Chapter 5.2 Character Animation. CS Overview Fundamental Concepts Animation Storage Playing Animations Blending Animations Motion Extraction Mesh.
Data Structures Introduction Phil Tayco Slide version 1.0 Jan 26, 2015.
Collision and Animation Systems in Games Jani Kajala Lead Programmer / Chief Technology Officer, Pixelgene Ltd (0)
CS10 Final Review by Glenn Sugden is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.Glenn Sugdenmons Attribution-NonCommercial-ShareAlike.
CS 450: COMPUTER GRAPHICS QUATERNIONS SPRING 2015 DR. MICHAEL J. REALE.
Invitation to Computer Science, Java Version, Second Edition.
CS212: DATA STRUCTURES Lecture 10:Hashing 1. Outline 2  Map Abstract Data type  Map Abstract Data type methods  What is hash  Hash tables  Bucket.
Multimedia System and Networking UTD Slide- 1 University of Texas at Dallas B. Prabhakaran Channels & Keyframes.
File Structures Foundations of Computer Science  Cengage Learning.
Computer Graphics 2 In the name of God. Outline Introduction Animation The most important senior groups Animation techniques Summary Walking, running,…examples.
March 16 & 21, Csci 2111: Data and File Structures Week 9, Lectures 1 & 2 Indexed Sequential File Access and Prefix B+ Trees.
IT253: Computer Organization
CS 320 Assignment 1 Rewriting the MISC Osystem class to support loading machine language programs at addresses other than 0 1.
Adobe Flash CS3 Revealed
How to Build a CPU Cache COMP25212 – Lecture 2. Learning Objectives To understand: –how cache is logically structured –how cache operates CPU reads CPU.
Maths & Technologies for Games Animation: Practicalities CO3303 Week 3.
Multimedia System and Networking UTD Slide- 1 University of Texas at Dallas B. Prabhakaran Rigging.
Introduction to Flash Animation CS 318. Topics Introduction to Flash and animation The Flash development environment Creating Flash animations  Layers.
Chapter 10 Hashing. The search time of each algorithm depend on the number n of elements of the collection S of the data. A searching technique called.
Sorting: Implementation Fundamental Data Structures and Algorithms Klaus Sutner February 24, 2004.
1cs426-winter-2008 Notes  Will add references to splines on web page.
Programming Fundamentals. Overview of Previous Lecture Phases of C++ Environment Program statement Vs Preprocessor directive Whitespaces Comments.
Lecture 10 Page 1 CS 111 Summer 2013 File Systems Control Structures A file is a named collection of information Primary roles of file system: – To store.
Review CSE167: Computer Graphics Instructor: Steve Rotenberg UCSD, Fall 2005.
M1G Introduction to Programming 2 3. Creating Classes: Room and Item.
CSCE 441: Keyframe Animation/Smooth Curves (Cont.) Jinxiang Chai.
CS 450: Computer Graphics PARAMETRIC SPLINES AND SURFACES
Introduction to Computer Programming - Project 2 Intro to Digital Technology.
Basic Theory (for curve 01). 1.1 Points and Vectors  Real life methods for constructing curves and surfaces often start with points and vectors, which.
Data Structure and Algorithms
Program Design. Simple Program Design, Fourth Edition Chapter 1 2 Objectives In this chapter you will be able to: Describe the steps in the program development.
Animation Animation is about bringing things to life Technically: –Generate a sequence of images that, when played one after the other, make things move.
CGDD 4003 Character Animation. The Skeletal Hierarchy (aka the “rig”) Based on the concept of bones Each bone has exactly one parent Each bone has a transform.
3D Animation 3. Animation Dr. Ashraf Y. Maghari Information Technology Islamic University of Gaza Ref. Book: The Art of Maya.
System Programming and administration
Introduction to Events
MATLAB: Structures and File I/O
Channels & Keyframes.
Synthesis of Motion from Simple Animations
Blending & State Machines
ECE 352 Digital System Fundamentals
Chapter 4 . Trajectory planning and Inverse kinematics
Presentation transcript:

Blending & State Machines CSE169: Computer Animation Instructor: Steve Rotenberg UCSD, Winter 2004

Issues The midterm is next Thursday Project 1 sample on the web page Hopefully, I will have some morph files and texture examples on the web page by tomorrow Still grading project 1

Blending & Sequencing Now that we understand how a character rig works and how to manipulate animation data, we can edit and play back simple animation The subject of blending and sequencing encompasses a higher level of animation playback, involving constructing the final pose out of a combination of various inputs We will limit today’s discussion to encompass only pre-stored animation (channel) data as the ultimate input. Later, we will consider how to mix in procedural animation…

Blending & Sequencing Most areas of computer animation have been pioneered by the research and special effects industries Blending and sequencing, however, is one area where video games have made a lot of real progress in this area towards achieving interactively controllable and AI characters in complex environments… The special effects industry is using some game related technology more and more (battle scenes in Lord of the Rings…)

Keyframe Channels

Keyframe Access class Keyframe { float Value,Time; char RuleIn,RuleOut; float TangentIn,TangentOut; float A,B,C,D; } class Channel { float Evaluate(float time); void Precompute(); }

Channel::Precompute() The two main setup computations a keyframe channel needs to perform are: Compute tangents from rules Compute cubic coefficients from tangents & other data This can be done in two separate passes through the keys or combined into one pass (but keep in mind there is some slightly tricky dependencies on the order that data must be processed if done in one pass)

Computing Tangents Both the incoming and outgoing tangents need to be generated for each keyframe Tangents are generated from simple ‘rules’ Flat: tangent = 0 Fixed: tangent = some constant Linear: tangent points to next/last key Smooth: tangent equals slope formed by next & last key The first two are trivial, the third is simple, and the fourth is pretty simple too… Note: I use ‘v’ for tangents (velocity) instead of ‘t’ which is used for time

Flat Tangents Flat tangents are particularly useful for making ‘slow in’ and ‘slow out’ motions (acceleration from a stop and deceleration to a stop) v = 0

Linear Tangents (p 0,t 0 ) v 0 out v 1 in (p 1,t 1 )

Smooth Tangents (p 1,t 1 ) v 1 out v 1 in (p 2,t 2 ) (p 0,t 0 ) Keep in mind that this won’t work on the first or last tangent (just use the linear rule)

Step Tangent Occasionally, one comes across the ‘step’ tangent rule This is a special case that just forces the entire span to a constant This requires hacking the cubic coefficients (a=b=c=0, d=p 0 ) It can only be specified on the outgoing tangent and it nullifies whatever rule is on the next incoming tangent

Computing Cubic Coefficients Once we have the tangents for every keyframe, we can compute the cubic coefficients (a,b,c,d) for each span Usually, these are just stored with the keyframe at the start of the span

Computing Cubic Coefficients Note: My matrix34 class won’t do this properly! Tough! Do it yourself! Actually, all of the 1’s and 0’s in the matrix make it pretty easy to multiply it out by hand

Channel::Evaluate() The Channel::Evaluate function needs to be very efficient, as it is called many times while playing back animations There are two main components to the evaluation: Find the proper span Evaluate the cubic equation for the span

Finding the Span Assuming we are doing a ‘random access’ of the channel, we need to first locate where the specified t value is There are 4 main possibilities t < t start (before first key: use extrapolation) t > t end (after last key: use extrapolation) t is on a key t is on a span between keys (most likely)

Finding the Span: Binary Search A very reasonable way to find the key is by a binary search. This allows pretty fast (log N) access time with no additional storage cost (assuming keys are stored in an array (rather than a list)) Binary search is sometimes called ‘divide and conquer’ or ‘bisection’ For even faster access, one could use hashing algorithms, but that is probably not necessary, as they require additional storage and most real channel accesses can take advantage of coherence (sequential access)

Finding the Span: Linear Search One can always just loop through the keys from the beginning and look for the proper span This is an acceptable place to start, as it is important to get things working properly before focusing on optimization It may also be a reasonable option for interactive editing tools that would require key frames to be stored in a linked list Of course, a bisection algorithm can probably be written in less than a dozen lines of code…

Evaluating the Cubic Once we have the span, we can access the necessary cubic coefficients First, however, we need to turn our time t into a 0..1 value for the span (we’ll call this parameter u)

High Performance Channels If 1/(t 1 -t 0 ) is precomputed, we can evaluate the cubic equation with 4 additions and 4 multiplies In fact, a,b,c, & d can actually be precomputed to include the correction for 1/(t 1 -t 0 ) so that the cubic can be directly solved for the original t. This reduces it to 3+ and 3* In other words, evaluating the cubic is practically instantaneous, while jumping around through memory trying to locate the span is far worse If we can take advantage of sequential access (which we usually can), we can reduce the span location to a very small number of operations

Robustness The channel should always return some reasonable value regardless of what time t was passed in If there are no keys in the channel, it should just return 0 If there is just 1 key, it should return the value of that key If there are more than 1 key, it should evaluate the curve or use an extrapolation rule if t is outside of the range At a minimum, the ‘constant’ extrapolation rule should be used, which just returns the value of the first (or last) key if t is before (or after) the keyframe range When creating new keys or modifying the time of a key, one needs to verify that its time stays between the key before and after it

Project 3 Details are TBD, but the basic idea will be to load an animation and play it back on a character rig The animation file will contain an array of keyframe channels You will have to compute the tangents from the rules and be able to evaluate the channels to play back the animation I might require you to have a channel Draw() function as well that graphs the channel in 2D. It could display the channels of the currently selected joint as an overlay… As extra credit, perhaps a simple channel editor (insert / delete key, move key, set tangent rule…)

References “3-D Computer Graphics: A Mathematical Introduction with OpenGL”, S. Buss 4: Averaging and Interpolation 7: Bezier Curves 8: B-Splines 12: Animation and Kinematics (covers quaternions also)

Animation Playback

Poses A pose is an array of values that maps to a rig If the rig contains only simple independent DOFs, the pose can just be an array of floats If the rig contains quaternions or other complex coupled DOFs, they may require special handling by higher level code Therefore, for generality, we will assume that a pose contains both an array of M≥0 floats and an additional array of N≥0 quaternions

Animation Clip Remember that the AnimationClip stores an array of channels for a particular animation (or it could store the data as an array of poses…) This should be treated as constant data, especially in situations where multiple animating characters may simultaneously need to access the animation (at different time values) For playback, animation is accessed as a pose. Evaluation requires looping through each channel. class AnimationClip { void Evaluate(float time,Pose &p); }

Animation Player We need something that ‘plays’ an animation. We will call it an animation player At it’s simplest, an animation player would store a AnimationClip*, Rig*, and a float time As an active component, it would require some sort of Update() function This update would increment the time, evaluate the animation, and then pose the rig However, for reasons we will see later, we will leave out the Rig* and just have the player generate and output a Pose

Animation Player class AnimationPlayer { float Time; AnimationClip *Anim; Pose P; public: const Pose &GetPose(); void Play(AnimationClip &clip); void Update(); };

Animation Player A simple player just needs to increment the Time and access the new pose once per frame The first question that comes up though, is what to do when it gets to the end of the animation clip? Loop back to start Hold on last frame Deactivate itself… (return 0 pose?) Send a message…

Animation Player Some features we may want to add for a more versatile animation player include: Variable playback rate Play backwards (& deal with hitting the beginning) Pause It’s kinda like a DVD player…

Animation Player The animation player is a basic component of an animation blending & sequencing system Many of these might ultimately be combined to get the final blended pose. This is why we only want it to output a pose By the way, remember the issue of sequential access for keyframes? The animation player should ultimately be responsible for tracking the current keyframe array (although the details could be pushed down to a specific class for dealing with that)

Animation Player As we will use players and static poses as basic components in our blending discussion, we will make a notation for them:

Animation Blending

Blending Overview We can define blending operations that affect poses A blend operation takes one or more poses as input and generates one pose as output In addition, it may take some auxiliary data as input (control parameters, etc.)

Generic Blend Operation

Cross Dissolve Perhaps the most common and useful pose blend operation is the ‘cross dissolve’ Also known as: Lerp (linear interpolation), blend, dissolve… The cross dissolve blender takes two poses as input and an additional float as the blend factor (0…1)

Cross Dissolve The two poses are basically just interpolated The DOF values can use Lerp, but the quaternions should use the ‘Slerp’ operation (spherical linear interpolate)

Cross Dissolve: Handling Angles If a DOF represents an angle, we may want to have the interpolation check for crossing the +180 / -180 boundary Unfortunately, this complicates the concept of a DOF (and a pose) a bit more. Now we must also consider that some DOFs behave in different ways than others

Cross Dissolve: Quaternions Also, for quaternions, we may wish to force the interpolation to go the ‘short way’:

Cross Dissolve: Stand to Walk Consider a situation where we want a character to blend from a stand animation to a walk animation

Cross Dissolve: Stand to Walk We could have two independent animations playing (stand & walk) and then gradually ramp the ‘t’ value from 0 to 1 If the transition is reasonably quick (say <0.5 second), it might look OK Note: this is just a simple example of a dissolve and not necessarily the best way to make a character start walking…

Cross Dissolve: Walk to Run Blending from a walk to a run requires some additional consideration…

Cross Dissolve: Walk to Run Lets say that we have a walk and a run animation Each animation is meant to play as a loop and contains one full gait cycle They are set up so the character is essentially moving in place, as on a treadmill Let’s assume that the duration of the walk animation is d walk seconds and the run is d run seconds Let’s also assume that the velocity of the walk is v walk and run is v run (these represent the speed that the character is supposed to be moving forward, but keep in mind, the animation itself is in place)

Cross Dissolve: Walk to Run We want to make sure that the walk and run are in phase when we blend between them One could animate them in a consistent way so that the two clips both start at the same phase But, let’s assume they aren’t in sync… Instead, we’ll just store an offset for each clip that marks some synchronization point (say at the time when the left foot hits the ground) We’ll call these offsets o walk and o run

Cross Dissolve: Walk to Run Let’s assume that f is our dissolve factor (0…1) where f=0 implies walking and f=1 implies running The resulting velocity that the character should move is simply: v'=Lerp(f,v walk,v run ) To get the animations to stay in phase, however, we need to adjust the speeds that they are playing back This means that when we’re halfway between walk and run, the walk will need to be sped up and the run will need to be slowed down

Cross Dissolve: Walk to Run As we are sure that we want the two to stay in phase, we can just lock them together For example, we will just say that if t walk is the current time of the walk animation, then t run should be:

Cross Dissolve: Walk to Run To speed up the walk animation appropriately, we will define a rate r walk that the walk animation plays at (default would be 1.0)

Basic Math Blend Operations We can also define some blenders for basic math operations:

Basic Math Blend Operations Its not always obvious how to define consistent behaviors between independent DOFs and quaternions Quaternion addition and subtraction don’t really give an expected result Addition of orientations implies that you start with the first orientation and then you do a rotation from there that corresponds to how the second orientation is rotated from neutral This behavior is more like quaternion multiplication (although quaternion multiplication is not commutative)

Add & Subtract Blenders A reasonable behavior for an add blender could be: For subtraction, we could multiply by the conjugate of the quaternion

Scale Blender As we want our quaternions to stay unit length, we don’t really want to scale them In any case, scaling a quaternion has no effect on the resulting orientation! Instead, we can think of scaling as moving towards or away from 0 (I.e., scaling by a number less than 1 brings us closer to 0, scaling by >1 takes us away from 0…) Therefore, we could define the scale blender as:

Math Operations: Body Turn

Body Turn As an example of math blending operations, consider a character that walks and turns One approach to achieving this is to have an underlying walk animation and ‘layer’ (add) some body turn on top of it We make a static ‘look_right’ pose and a static ‘default’ pose The subtraction gives us the difference between look_right and default If we scale this and then add it on top of the underlying walk animation. The scale we use can be based on how hard the character is turning (-1…1)

Body Turn We can also speed this up by precomputing the subtraction and making a combined add/scale blender

Bilinear Blend

Bilinear blend is an extension to the cross dissolve that takes four input poses and two interpolation parameters s & t

Bilinear Blend Bilinear (and trilinear…) blends can be useful for a wide range of applications As one example, consider a video game character who has to aim a weapon The character must be able to stand still and aim at any object within +/- 135 degrees to the side to side and +/- 45 degrees up and down An animator can supply key poses at 45 degree increments in both directions Then, for any desired angle, we can find the right four targets and do a bilinear blend

Combine Blender We can also have a blender that combines poses in different ways For example, we might want to treat the upper body separately from the lower body, or treat each limb separately, etc. We can use different blenders for each body section and then combine them into a final pose This also implies that we can use smaller pose vectors in each body section to save computations and memory The actual combine operation could just have lookup tables that map index values of the incoming poses to index values of the final pose

Mirror Blender Mirroring animations across the x=0 plane can be an effective way to save memory and complexity It requires that a character is symmetrical (or close enough…) Like the combine blender, mirroring requires some sort of table as input that describes how to mirror each DOF Different DOFs will need different treatment Also, DOFs on the right need to be swapped with DOFs on the left

Clamp Blender DOF limits can be implemented as a blend operation This can be for performance, as it allows precise control over when (and if) DOF limits are used For example, consider that DOF limits should not be necessary when cross dissolving between two animations (assuming the animations are already within the legal limits) Use of add, subtract, and scale operations may require clamping for safety

Multi-Track Blending One can also think of an animation blending system as being similar to a multi-track audio (or video) editing system Different animations (or poses) can be placed in different ‘tracks’ and each track could have some additional controls and custom behaviors

Animation State Machines

State Machines Blending is great for combining a few motions, but it does not address the issue of sequencing different animations over time For this, we will use a state machine We will define the state machine as a connected graph of states and transitions At any time, exactly one of the states is the current state Transitions are assumed to happen instantaneously

State Machines

In the context of animation sequencing, we think of states as representing individual animation clips and transitions being triggered by some sort of event An event might come from some internal logic or some external input (button press…)

Simple Jump State Machine Consider a simple state machine where a character jumps upon receiving a JUMP_PRESS message

More Complex Jump

State Machine (Text Version) stand{JUMP_PRESSstand2crouch } stand2crouch { JUMP_RELEASEhop ENDcrouch } crouch{JUMP_RELEASEtakeoff } takeoff{ENDfloat } hop{ENDfloat } float{NEAR_GROUNDland } land{ENDstand }

State Machine Extensions Global entry transitions Event masking Fancy states Modifiers Logic in states Combining blenders & state machines State machines within state machines

Creating State Machines Typing in text Graphical state machine editor Automated state machine generation (motion graphing)

Character Mover

When we want an interactive character to move around through a complex environment, we need something to be responsible for the overall placement of the character We call this the character mover We can think of the mover as a matrix that positions the character’s root

Character Mover Usually, we think of the mover matrix as being on the ground right below the character’s center The mover sits perfectly still when the character isn’t moving and generally moves at a smooth constant rate as the character walks The character’s root translation would be animated relative to the mover

Character Mover: Walking Consider a walk animation where we have the character is moving at a rate of v meters/second The actual animation is animated as if on a treadmill (but the root may still have some translation (bobbing up/down back/forth, left/right)) If the mover is moving at v meters/second though, the animation will look correct

Character Mover The mover might be coded up to do some simple accelerations, decelerations, turning, and collision detection with the ground and walls Depending on the speed that the mover is moving, we might select blend to an appropriate gait animation

Character Mover Sometimes, we want the character to do more complex moves, such as a dive roll to the right In this situation, we might want to explicitly animate what the mover should do This data can be written out with the animation and stored as additional channel data (3 translations, 3 rotations) These extra channels can be blended like any other channel, and then finally added to the mover when we pose the rig