SlideShare a Scribd company logo
1 of 74
Download to read offline
<title page>


Hello everyone!


My name is Erin Catto and I want to thank you for coming to my tutorial.


Today I’m going to discuss my work on the Diablo 3 ragdoll system. I learned a
lot working on this project and I hope you find this information useful in your
own projects. And as I promised, you will learn how to smack a demon.


First let me give you a little background about myself.




                                                                                  1
<who?>


My first job in the game industry was writing the physics engine for Tomb
Raider: Legend at Crystal Dynamics. The engine was used to create physics
puzzles, ragdolls, and vehicles. The same engine lives on today in Lara Croft:
Guardian of Light and Deus Ex 3.


In my spare time I have been working on Box2D, a free open source physics
engine. Box2D is used in Crayon Physics, Limbo, and Angry Birds.




                                                                                 2
<setting>


So after shipping Tomb Raider, I got an amazing opportunity to go work at
Blizzard’s console division. That same division had been working on StarCraft
Ghost. When I arrived at the console division, Starcraft Ghost had been
cancelled and they were brain-storming for new game ideas. I didn’t pay too
much attention to that because I had been put in charge of developing a new
physics engine for the team. I was excited to work on the Xbox 360 and the
PS3. And I wanted to improve on what I had done at Crystal.


Well two weeks later the console division was shut down. I was told to go
home and wait for a call to see about other positions at Blizzard.




                                                                                3
<role>


As it happened, I was rescued by Tyrael!


I must confess that I was a Diablo 2 addict. I actually uninstalled it once and
threw away the disks because it was taking too much of my time.
Nevertheless, I have many fond memories of the game.


I was therefore incredibly excited to become a part of the Diablo 3 team. I
wanted to help make the best Diablo game ever!




                                                                                  4
<goal>


So when I started thinking about bringing physics to Diablo, one of my first
ideas was ragdolls. I wanted ragdolls on every creature. I wanted it to be easy
for artists to create all kinds of over the top ragdoll effects.


A good ragdoll system has a lot to offer.
From a design point of view, ragdolls make the world feel more interactive and
make the player feel more powerful.
From an artistic point of view, ragdolls allow for lots of death variation and
reduce the animator workload.
From a programming point of view, ragdolls improve the visual quality by
making the corpses conform to the environment. Ragdoll physics prevent
corpses from hanging off a cliff.




                                                                                  5
<challenge>

I wrote a ragdoll system for Diablo 3 on top of the Havok physics engine. We
later switched to an in-house physics engine called Domino. Now I love
physics engines just as much as the next guy (well maybe more so), but today
I’m mainly going to talk about my work in making ragdolls a core feature of
Diablo. Most of that is code written outside of the physics engine.

One thing to keep in mind is that a physics engine doesn’t know a ragdoll is a
ragdoll. The physics engine just sees some rigid bodies, collision shapes, and
joints. The physics engine doesn’t know how the ragdoll is authored, how it
hooks into the animation system, or how it gets whacked by an axe. The
physics engine doesn’t keep your game from embedding a ragdoll in a wall, or
make sure your ragdolls are stable and look good. These aspects are usually
handled by a programmer on the game team, not someone from the physics
engine company.

Sometimes this work is done by a physics programmer, but often this work is
done by a generalist programmer who is not familiar with the inner workings
of the physics engine. Some aspects of implementing a ragdoll system are
straight forward, but others are not always so obvious. And navigating the
pitfalls of a physics engine is not always easy or intuitive.




                                                                                 6
<call to action>


There were three main areas I had to tackle to build the Diablo 3 ragdoll
system:


First, I needed a solid content pipeline so that artists and riggers can author
ragdolls on a large scale
Second, I needed to create some ragdoll glue to connect the ragdoll to the
animated actor
Third, I needed to develop some tools and know how to make ragdolls stable,
look good, and add flavor.




                                                                                  7
<key point>


Now let’s talk about the content pipeline. The Diablo ragdoll content pipeline
is a wedding of the artist’s tool and the game editor.


I wanted ragdoll geometry to be defined in the artist’s tool. This centralizes
most of the geometric data and the artist’s tool is usually well suited to
geometric construction.


It is not easy to get the ragdoll simulation running the artist’s tool. Sure, we
could probably integrate the physics engine into the art tool, but much of
ragdoll behavior is tied to game logic. So instead, our artists test and tune
their ragdolls in our game editor.


This is a fairly seamless process. There are no text files to be edited and much
of the authoring is visual.




                                                                                   8
<explanation>


The ragdoll geometry is created by a technical artist in Maya.


We start with a standard character skeleton. The ragdoll is defined in the so-
called bind pose. A skeleton’s bind pose fits the original character mesh that
was created by a modeler. The bind pose is the pose where the mesh is bound
to the skeleton in a process called skinning.


We attach collision shapes to the skeleton bones. Each bone has zero or more
collision shapes. These implicitly define the rigid bodies. Physics joints are
represented as locator transforms that connect two bones.


With this framework, we can author all the physics objects in the game as
ragdolls.




                                                                                 9
Video: Zombie Fest


Here are your standard death ragdolls.




                                         10
Video: Chandelier


Here is a destructible chandelier. The entire chandelier is one model with a
single skeleton. You’ll have fun dropping these on top of zombies in Diablo3.




                                                                                11
Video: Wagon


Even a destructible wagon is a ragdoll. So a ragdoll in Diablo is not just a
character. This simplifies our authoring path and our code. Also, by having all
physics props as ragdolls we keep draw calls low since the moving parts are
just bones, not separate actors.




                                                                                  12
Video: Barrel


This barrel mixes destruction with a character ragdoll. But it is still one draw
call.




                                                                                   13
For collision shapes, we support spheres, capsules, and convex hulls. There is
no special case for boxes.


We have a tool that can shrink wrap a vertex cloud with a simplified convex
hull. The rigger can select a set of vertices and press a button to generate an
efficient convex hull.


We try to use spheres and capsules where appropriate because they are
cheaper than convex hulls. We have rolling resistance to prevent spheres and
capsules from rolling forever, even on slopes.




                                                                                  14
Rolling resistance improves behavior and helps bodies get to sleep faster.


Convex hull simplification improves artist productivity and improves
simulation quality. Broad polygonal faces improves quality by eliminating a
teetering effect that sometimes happens on shallow edges.




                                                                              15
The technical artist connects bones with physics joints. The physics joints do
not necessarily line up with the bones and we support branch crossing loop
joints.


We use cone, revolute, spherical, and weld joints.
Cone joint: like a shoulder with cone and twist angle limits


Revolute joint: like an elbow with a single axis of rotation and angular limits


Spherical joint: a pure point to point constraints with no rotation restriction,
useful for chandeliers where rotation is naturally limited by collision.


Weld joint: locks two bodies together, useful for some advanced effects you’ll
see later.


We author physics joints using a Maya construct called a locator, which is
basically a transform with position and orientation. So they are just coordinate
axes. We have conventions to relate locator axes to joint axes. For example,
the z-axis is the hinge axis for a revolute joint.



                                                                                   16
The ragdoll collision shapes and joints are exported with the model into a raw
intermediate file. The export is handled by a Maya plug-in written in C++.


I highly recommend exporting data raw from your authoring tools, with
minimal pre-processing. This allows the run-time format to change without
requiring re-exports from the art tool.




                                                                                 17
<explanation>


We import the intermediate file into our game editor, called Axe. During this
process the skeleton is built along with the associated ragdoll data. The editor
is aware of versions, so if the model version changes, the editor simply re-
imports the intermediate file. No re-export from Maya is needed. The model
is then serialized into an optimized binary format that can be read in-place
into the game with simple pointer fix ups.


This run-time data is the game’s representation of the ragdoll. We still need to
instantiate the physics engine objects according to game logic. The process is
quick and is mostly gated by the cost of inserting collision shapes into the
physics engine’s broad-phase.




                                                                                   18
Here is how we represent the skeleton. A bone is just a node in a hierarchy.
Each bone should know it’s parent bone with the special case that the root
bone’s parent is null. A bone also has a linked list of children. A ssibling index
acts as the next pointer in the child list.


You will save yourself a lot of headache and improve performance by keeping
bones in a sorted array. The array should be sorted so that parents always
precede their children. This makes it easy to compute the bone transforms in
model space. Often you don’t even need to sort the bones because the art
tool keeps them sorted.


I’ve worked on game engines that sort the bones based on other criteria, such
as the name. Don’t do that.




                                                                                     19
Animation data is interpolated and blended in parent space. We then convert
the parent space transforms into model space transforms so we can render
the model.


When the bones are sorted parent first, we can simply loop through all the
bones to compute the model space transforms. Without proper sorting, we
would need a recursive algorithm to update the skeleton.


I also find that keeping the bones sorted makes it easier to synchronize the
skeleton with the ragdoll.




                                                                               20
A typical character skeleton may have dozens of bones. There are usually far
more bones than can be efficiently simulated with rigid bodies. Therefore, we
usually only have rigid bodies on a sub-set of the bones.


This creates a situation where there are three kinds of bones: active bones,
leaf bones, and intermediate bones. An active bone is attached to a rigid
body. A leaf bone has no body and no descendent bones with bodies. An
intermediate bone has no body, but has a descendent bone with a body. In
other words, an intermediate bone is an inactive bone stuck between active
bones.


The run-time ragdoll system needs a map from bone to body. That map has
holes, but the holes are important.


To keep track of things I also have a RagdollBody structure that keeps the
bone index, the index of the parent body, and the rigid body from the physics
engine.




                                                                                21
Here’s how I build the bone to body map. The map is an array of body indices,
one per bone.


Step One: I initialize the map to be all leaf bones.


Step Two: Then I walk through the ragdoll body array and install the body
index into the map.


Step Three: For each body, I walk up the tree marking intermediate bones
until I hit an ancestor bone with a body.




                                                                                22
<explanation>


Let’s move on to the game editor. Our game editor, called Axe, has a model
viewer called the Holodeck. In there ragdolls can be tested and tuned.


We can view the ragdoll collision shapes and joints to make sure they are
working as intended. We can also play back animations that trigger the
ragdolls.


Here you see a dead zombie and we have enabled rendering of the ragdoll
collision shapes.




                                                                             23
Video: zombie ragdoll




                        24
Video: zombie ragdoll with collision shape rendering




                                                       25
Our model viewer has a mouse joint that lets you move a ragdoll around. This
is a simple feature that is quite helpful for quickly testing a ragdoll.


For example, joint limits may need to be tuned to avoid squatting. Dead guys
should not be sitting on their knees! The mouse joint can be used to detect
bad configurations.




                                                                               26
Video: mouse joint




                     27
We have some physics parameters that can be tuned in Axe, such as the
global friction for the ragdoll. We also can control collision flags in Axe. For
example, we decided to improve the performance of the some ragdolls in
Diablo 3 by preventing those ragdolls from colliding with each other. However,
we can still allow a ragdoll to collide with itself so that a ragdoll by itself looks
pretty good.


These parameters live apart from the intermediate file containing the ragdoll
geometry. So these parameters can be shared by multiple ragdolls. This makes
it easy to do global tuning of ragdoll behavior.




                                                                                        28
We control ragdoll spawning using animation triggers. This is basically a simple
scripting system on a time-line.


Besides spawning ragdolls, we can also disable physics joints and spawn
explosions.


You can see more about this system at Julian Love’s presentation on
Wednesday at 5pm.




                                                                                   29
<key point>


So now let’s talk about the animation system. When I was integrating ragdolls
into the Diablo animation system, it helped me to keep the perspective that
ragdolls are just a form of procedural animation.


In our animation system we start with the raw key frames created by the
animator. Then we perform interpolation and blending in parent space. Then
we compute the bone transforms in model space as I showed before. At this
point we apply procedural animations such as ragdoll, inverse kinematics, and
cloth.


Procedural animations usually happen in world space because they usually
interact with the world in some manner. For example, ragdolls collide with the
ground.




                                                                                 30
<explanation>


As mentioned before, the ragdoll bodies map to a subset of the bones. Bones
with bodies follow the rigid body transform exactly. How shall we handle leaf
and intermediate bones?


Keep in mind that each rigid body can only drive a single bone. So leaf and
intermediate bones need another source of data to fully determine their
transforms.




                                                                                31
Leaf bones are fairly obvious: they just go along for the ride, holding their
relative pose from the keyed animation.




                                                                                32
Intermediate bones are a bit trickier. We would like to allow them to be
animated, but that doesn’t jive with how rigid bodies are connected to each
other. Since active bones follow their rigid bodies exactly, an intermediate
bone cannot affect its active descendants. Instead you will see the mesh
stretch in an unnatural way.


Therefore, we leave intermediate bones in the bind pose relative to their
parent. Usually this is not a big problem because we choose bones to be
intermediate because they already have limited movement. Nevertheless,
your animators should be aware of this when they are constructing
animations that have a transition to ragdoll.




                                                                               33
In Diablo we maintain a bounding sphere on our actors. This sphere is used for
lighting and visibility culling. When a character goes ragdoll they may move
very far from the actor transform. They may even fall off a cliff.


Further, we support breakable ragdolls and gibbing of ragdolls, so the ragdoll
pieces may be widely separated. So we have to adjust the bounding sphere to
contain all the bones, not matter where they are. To do this, we have a local
bounding sphere for each bone and sum up all the spheres according to the
final bone positions.




                                                                                 34
<explanation>


When a character dies we have to spawn the ragdoll in-place.


We could just create the rigid bodies and joints and cross our fingers. But this
can lead to a low quality result.




                                                                                   35
When we spawn a ragdoll, we have to create the bodies where the character’s
bones are currently located. There is no guarantee that the animated pose
conforms to the ragdoll constraints, so joints may be stretched and joint limits
may be violated.


We could go through all the joints and try to fix them up by shifting the
bodies. However, if you have a good physics engine, it will smoothly eliminate
the joint errors over time so you don’t have to worry about this problem too
much.


But you should keep this issue in mind. If a joint is incredibly distorted, it may
not recover. For example, some physics engines may flip a joint 180 degrees if
it is distorted by more than 90 degrees.




                                                                                     36
Once the rigid bodies are created we set the initial velocities based on the
animation. Otherwise the ragdoll transition will not be smooth. We also allow
animators to influence the initial velocity through death animations.


We obtain the initial velocity using two frames of animation. The linear
velocity is a straight forward finite difference approximation using two points.
The angular velocity is obtained with a finite difference on two quaternions.
When you do this, make sure the quaternions have the same polarity.




                                                                                   37
Video: female zombie spin death




                                  38
Video: female zombie spin death slow motion




                                              39
A typical physics bug you see in games is when the ragdoll spawns in an
unfortunate location and a limb becomes stuck in the terrain. The terrain is
often made from a triangle mesh, so it has no sense of volume. So once a foot
is below the ground, it cannot come back out because it bumps into the
backside of the triangles. What’s worse is the contact constraints start to fight
with the joints and this leads to jitter. So your dead guy appears to be
convulsing on the ground.


There is no silver bullet for this problem. There are several approaches that
can improve the situation. You could eliminate hand and feet collision from
your ragdoll. That will solve many cases and I generally recommend
eliminating hands and feet because they do not add much visual
improvement.


You may also be able to instruct your physics engine to use one-sided collision
for the triangle mesh. This will prevent a limb from being stuck and jittering.
However, a limb may still stay penetrated in the floor.




                                                                                    40
On Diablo 3 I added a routine that tries to remove the initial overlap by
translating the entire ragdoll, just enough so that all the center points of each
ragdoll collision shape are inside the world. The routine assumes the pelvis is
inside the world and then fires rays along the bones, looking for terrain
collisions. If it finds a terrain collision, then it shifts the ragdoll to remove the
overlap. This proceeds until all the overlaps are removed or an iteration limit
is hit.




                                                                                        41
<key point>


Now, let’s talk about tuning. If you want to support lots of different kinds of
ragdolls, you will need to work on tuning. Not all ragdolls look good when
they are simulated by the physics engine. There are several techniques I’ll
show you to deal with stability. I’ll also show you some ways to get more out
of ragdolls then just a simple death.


This little guy is called a pit flyer. The pit flyer was one of the most difficult
ragdolls to get right in Diablo 3.


I modified our physics engine to enable dumping out ragdolls into a text file
that could be loaded into a testbed. There I could look at the ragdoll in detail
and try to figure out how to make it behave better.




                                                                                     42
Video: pit flyer




                   43
Video: pit flyer ragdoll




                           44
Small capsules connecting the wings to the torso make it difficult to simulate
the flyer and it has trouble going to sleep. We could make the wing boxes
lighter, which effectively makes the arms heavier. But there are two problems
with this:
1. Mass tweaking can be difficult for a rigger to get right, so we use a
   uniform density for shapes based on material.
2. Rotational inertia scales faster with size than with mass, so we can get a
   better effect by using fatter shapes.


It is easier to spot ragdoll tuning issues visually than by checking the mass.




                                                                                 45
<explanation>


Mass distribution is critical for good ragdoll stability. These rules may not
seem obvious at first, but the main point is to design the ragdolls as you
would a sturdy structure, such as a bridge.




                                                                                46
Would you build a bridge that is two huge parts connected by a tiny bolt in the
middle? Probably not. The same design philosophy applies to ragdolls.


We don’t want to support heavy bodies with light bodies. The opposite is
okay. This is due to the nature of the iterative solvers used by most physics
engines. They simply cannot converge large forces on small bodies.




                                                                                  47
Another design aspect that can hurt ragdoll stability are joint gaps. Gaps are
bad for a couple reasons:


1. other objects can get stuck in a gap, creating a bad visual quality
2. gaps also imply low rotational inertia relative to the torques imposed by
   the joints. This behaves like a large force on a small body.


Fortunately it is often quite easy for the rigger to close those gaps. In many
cases significant overlap works well. For example upper and lower arm
collision shapes can overlap around the elbow.




                                                                                 48
49
In Domino and Box2D I have a joint flag to disable collision between attached
bodies. However, bodies that are not directly connected can still collide.


In particular, overlapping siblings can still collide. For example, large thigh
capsules can collide. These internal collisions fight with the joints and can
make the physics solver unhappy. In Domino, these cause the ragdoll to jitter
and propel across the ground.




                                                                                  50
51
Long skinny bodies can be another source of trouble. They have inherently
poor mass distribution which can cause them to spin excessively. And they are
more difficult for the collision system to handle correctly.




                                                                                52
Video: fallen with skinny staff




                                  53
Video: fallen with fat staff




                               54
<explanation>


Now I’d like to tell you about some fun effects that we implemented in Diablo
3.


First, we implemented an explosion system to knock ragdolls around.
Second, we implemented a system for gibbing those nasty zombies.
Finally, we implemented a system for adding physics simulation to things like
pony tails.




                                                                                55
Explosions are crucial for making the world of Diablo 3 feel more interactive.
In Diablo 3, stuff is always getting knocked around and blown up.


We have two types of explosions: radial and linear. A radial explosion is the
standard spherical explosion that radiates from the center of a sphere. The
linear explosion still uses a sphere of influence, but the impulse direction is
fixed. The direction can either be in world space, such as up, or in local space,
such as along the blade of an axe.


Many explosions are set up quite precisely. For example, the weapon swing
animation on the Barbarian has a specific contact frame where damage is
triggered. At the same time we fire a linear explosion pointed in the direction
of the blade. This technique helps to improve the connection between the
attack and the ragdoll response.




                                                                                    56
A ragdoll receives an explosion according to its collision shapes. For each
shape we compute the closest point on the shape to the center of the
explosion. We apply the explosion at that closest point. This gives the
explosion some torque and leads to a nice spinning effect.


Also, we project the surface area of the shape in the direction of the
explosion. Then we scale the explosion impulse by the projected surface area.
This means that a door facing an explosion gets a bigger impulse than a door
pointing away from an explosion.




                                                                                57
Video: small explosion




                         58
Video: big explosion




                       59
Video: zombie attack with explosion rendering




                                                60
Video: lightning explosions




                              61
Video: lightning explosions, debug draw




                                          62
Setting up gibbing was one of my favorite tasks on Diablo 3. It works in a fairly
direct manner. Death animations are selected from a pool of possibilities.
When the dismemberment animation is selected the full ragdoll is spawned,
the visual mesh is swapped to a custom gibbed mesh, and then select ragdoll
joints are disabled. So we don’t have to author separate ragdolls for gibbing.




                                                                                    63
Video: decapitation




                      64
Video: decapitation slow motion




                                  65
Video: split




               66
Video: dismember




                   67
Video: dismember slow motion




                               68
We made a big effort to make the characters in Diablo 3 visually interesting.
So the question naturally arose how we could use the ragdoll system to
enhance our living characters. Out of this we developed our so-called partial
ragdoll system.


Our canonical example of the partial ragdoll system is the wizard’s pony tail.
Here you can see how the partial ragdoll is set up. We have a couple red
capsules for the dynamic pony tail. The blue capsules are kinematic bodies.
Kinematic bodies follow the animation rigidly and provide a collision barrier so
that the pony tail doesn’t swing through her body.




                                                                                   69
The main challenge for simulating partial ragdolls is that characters can move
very fast. They can rotate 180 degrees instantly and they can teleport across
the screen. However, a physics engine likes smooth movement. These rapid
movements can cause the joints to stretch and rip the visual mesh apart. I will
briefly explain to you how we dealt with rapid movement.


First of all, every partial ragdoll has a kinematic root body. Kinematic bodies
are moved by setting their velocity according to the animation. This leaves the
partial ragdoll a frame behind, but we can simply transform the ragdoll bones
forward to mask the latency.


We need the kinematic bodies to have a realistic velocity to impart a realistic
reaction in the partial ragdoll. However, we need to limit the magnitude of the
velocity otherwise joints will rip apart. But then the partial ragdoll with fall
behind!


We solve problem this through partial teleportation. We scale down the
velocity by teleporting the kinematic body partway forward to the animation
pose according to a tuning parameter (shown here as alpha). Then we
generate a velocity command to drive the kinematic body the rest of the way




                                                                                   70
to the animation frame.


Then we apply that partial transform to the entire dynamic sub-tree. This has the
effect of subduing the rapid movement while retaining a natural looking reaction. No
damping is required!


Videos: Witch Doctor




                                                                                       70
Video: witch doctor




                      71
Video: mojo




              72
You can download this presentation at box2d.org and you can reach me on
twitter or on the Box2D forums.


Thank you for attending my presentation and I hope you find it useful.


I would now like to answer any questions you have.


>>>>>>>>>>>>>>> PARROT THE QUESTIONS <<<<<<<<<<<<<<<<<




                                                                          73

More Related Content

What's hot

Penner pre-integrated skin rendering (siggraph 2011 advances in real-time r...
Penner   pre-integrated skin rendering (siggraph 2011 advances in real-time r...Penner   pre-integrated skin rendering (siggraph 2011 advances in real-time r...
Penner pre-integrated skin rendering (siggraph 2011 advances in real-time r...JP Lee
 
Photogrammetry and Star Wars Battlefront
Photogrammetry and Star Wars BattlefrontPhotogrammetry and Star Wars Battlefront
Photogrammetry and Star Wars BattlefrontElectronic Arts / DICE
 
Benoit fouletier guillaume martin unity day- modern 2 d techniques-gce2014
Benoit fouletier guillaume martin   unity day- modern 2 d techniques-gce2014Benoit fouletier guillaume martin   unity day- modern 2 d techniques-gce2014
Benoit fouletier guillaume martin unity day- modern 2 d techniques-gce2014Mary Chan
 
GDC 2012: Advanced Procedural Rendering in DX11
GDC 2012: Advanced Procedural Rendering in DX11GDC 2012: Advanced Procedural Rendering in DX11
GDC 2012: Advanced Procedural Rendering in DX11smashflt
 
Lighting Shading by John Hable
Lighting Shading by John HableLighting Shading by John Hable
Lighting Shading by John HableNaughty Dog
 
High Dynamic Range color grading and display in Frostbite
High Dynamic Range color grading and display in FrostbiteHigh Dynamic Range color grading and display in Frostbite
High Dynamic Range color grading and display in FrostbiteElectronic Arts / DICE
 
Y1 gd engine_terminology
Y1 gd engine_terminologyY1 gd engine_terminology
Y1 gd engine_terminologyLuke Summers
 
The Rendering Pipeline - Challenges & Next Steps
The Rendering Pipeline - Challenges & Next StepsThe Rendering Pipeline - Challenges & Next Steps
The Rendering Pipeline - Challenges & Next StepsJohan Andersson
 
Around the World in 80 Shaders
Around the World in 80 ShadersAround the World in 80 Shaders
Around the World in 80 Shadersstevemcauley
 
Unite 2013 optimizing unity games for mobile platforms
Unite 2013 optimizing unity games for mobile platformsUnite 2013 optimizing unity games for mobile platforms
Unite 2013 optimizing unity games for mobile platformsナム-Nam Nguyễn
 
Deep Dive into Microsoft Silverlight Graphics
Deep Dive into Microsoft Silverlight GraphicsDeep Dive into Microsoft Silverlight Graphics
Deep Dive into Microsoft Silverlight Graphicsgoodfriday
 
Artisan for BricsCAD User Guide
Artisan for BricsCAD User GuideArtisan for BricsCAD User Guide
Artisan for BricsCAD User GuideBricsys
 
Gamebryo LightSpeed(English)
Gamebryo LightSpeed(English)Gamebryo LightSpeed(English)
Gamebryo LightSpeed(English)Gamebryo
 
Y1 gd engine_terminology
Y1 gd engine_terminologyY1 gd engine_terminology
Y1 gd engine_terminologyJaket123
 
Game Engine Architecture
Game Engine ArchitectureGame Engine Architecture
Game Engine ArchitectureAttila Jenei
 
More Performance! Five Rendering Ideas From Battlefield 3 and Need For Speed:...
More Performance! Five Rendering Ideas From Battlefield 3 and Need For Speed:...More Performance! Five Rendering Ideas From Battlefield 3 and Need For Speed:...
More Performance! Five Rendering Ideas From Battlefield 3 and Need For Speed:...Colin Barré-Brisebois
 
Improving Shadows and Reflections via the Stencil Buffer
Improving Shadows and Reflections via the Stencil BufferImproving Shadows and Reflections via the Stencil Buffer
Improving Shadows and Reflections via the Stencil BufferMark Kilgard
 
Y1 gd engine_terminology
Y1 gd engine_terminologyY1 gd engine_terminology
Y1 gd engine_terminologyJordanianmc
 

What's hot (20)

Penner pre-integrated skin rendering (siggraph 2011 advances in real-time r...
Penner   pre-integrated skin rendering (siggraph 2011 advances in real-time r...Penner   pre-integrated skin rendering (siggraph 2011 advances in real-time r...
Penner pre-integrated skin rendering (siggraph 2011 advances in real-time r...
 
Photogrammetry and Star Wars Battlefront
Photogrammetry and Star Wars BattlefrontPhotogrammetry and Star Wars Battlefront
Photogrammetry and Star Wars Battlefront
 
Benoit fouletier guillaume martin unity day- modern 2 d techniques-gce2014
Benoit fouletier guillaume martin   unity day- modern 2 d techniques-gce2014Benoit fouletier guillaume martin   unity day- modern 2 d techniques-gce2014
Benoit fouletier guillaume martin unity day- modern 2 d techniques-gce2014
 
GDC 2012: Advanced Procedural Rendering in DX11
GDC 2012: Advanced Procedural Rendering in DX11GDC 2012: Advanced Procedural Rendering in DX11
GDC 2012: Advanced Procedural Rendering in DX11
 
Lighting Shading by John Hable
Lighting Shading by John HableLighting Shading by John Hable
Lighting Shading by John Hable
 
High Dynamic Range color grading and display in Frostbite
High Dynamic Range color grading and display in FrostbiteHigh Dynamic Range color grading and display in Frostbite
High Dynamic Range color grading and display in Frostbite
 
Y1 gd engine_terminology
Y1 gd engine_terminologyY1 gd engine_terminology
Y1 gd engine_terminology
 
The Rendering Pipeline - Challenges & Next Steps
The Rendering Pipeline - Challenges & Next StepsThe Rendering Pipeline - Challenges & Next Steps
The Rendering Pipeline - Challenges & Next Steps
 
Around the World in 80 Shaders
Around the World in 80 ShadersAround the World in 80 Shaders
Around the World in 80 Shaders
 
Unite 2013 optimizing unity games for mobile platforms
Unite 2013 optimizing unity games for mobile platformsUnite 2013 optimizing unity games for mobile platforms
Unite 2013 optimizing unity games for mobile platforms
 
Deep Dive into Microsoft Silverlight Graphics
Deep Dive into Microsoft Silverlight GraphicsDeep Dive into Microsoft Silverlight Graphics
Deep Dive into Microsoft Silverlight Graphics
 
Relic's FX System
Relic's FX SystemRelic's FX System
Relic's FX System
 
Artisan for BricsCAD User Guide
Artisan for BricsCAD User GuideArtisan for BricsCAD User Guide
Artisan for BricsCAD User Guide
 
LightWave™ 3D 11 Add-a-Seat
LightWave™ 3D 11 Add-a-SeatLightWave™ 3D 11 Add-a-Seat
LightWave™ 3D 11 Add-a-Seat
 
Gamebryo LightSpeed(English)
Gamebryo LightSpeed(English)Gamebryo LightSpeed(English)
Gamebryo LightSpeed(English)
 
Y1 gd engine_terminology
Y1 gd engine_terminologyY1 gd engine_terminology
Y1 gd engine_terminology
 
Game Engine Architecture
Game Engine ArchitectureGame Engine Architecture
Game Engine Architecture
 
More Performance! Five Rendering Ideas From Battlefield 3 and Need For Speed:...
More Performance! Five Rendering Ideas From Battlefield 3 and Need For Speed:...More Performance! Five Rendering Ideas From Battlefield 3 and Need For Speed:...
More Performance! Five Rendering Ideas From Battlefield 3 and Need For Speed:...
 
Improving Shadows and Reflections via the Stencil Buffer
Improving Shadows and Reflections via the Stencil BufferImproving Shadows and Reflections via the Stencil Buffer
Improving Shadows and Reflections via the Stencil Buffer
 
Y1 gd engine_terminology
Y1 gd engine_terminologyY1 gd engine_terminology
Y1 gd engine_terminology
 

Similar to [Gdc2012] 디아블로3 ragdolls

2nd creative factory project 2nd stage
2nd creative factory project  2nd stage2nd creative factory project  2nd stage
2nd creative factory project 2nd stageMasanori Endo
 
2nd cfp 2ndstage
2nd cfp 2ndstage2nd cfp 2ndstage
2nd cfp 2ndstages1210079
 
Raphael Amorim - Scrating React Fiber
Raphael Amorim - Scrating React FiberRaphael Amorim - Scrating React Fiber
Raphael Amorim - Scrating React FiberReact Conf Brasil
 
Going off the rails
Going off the railsGoing off the rails
Going off the railsNing Hu
 
2 d gameplaytutorial
2 d gameplaytutorial2 d gameplaytutorial
2 d gameplaytutorialunityshare
 
Docker Inside/Out: The 'Real' Real- World World of Stacking Containers in pro...
Docker Inside/Out: The 'Real' Real- World World of Stacking Containers in pro...Docker Inside/Out: The 'Real' Real- World World of Stacking Containers in pro...
Docker Inside/Out: The 'Real' Real- World World of Stacking Containers in pro...Sonatype
 
Android game engine
Android game engineAndroid game engine
Android game engineJulian Chu
 
Umbra Ignite 2015: Alex Evans – Learning from failure – prototypes, R&D, iter...
Umbra Ignite 2015: Alex Evans – Learning from failure – prototypes, R&D, iter...Umbra Ignite 2015: Alex Evans – Learning from failure – prototypes, R&D, iter...
Umbra Ignite 2015: Alex Evans – Learning from failure – prototypes, R&D, iter...Umbra Software
 
Looking glassrenderinglt en
Looking glassrenderinglt enLooking glassrenderinglt en
Looking glassrenderinglt en優介 黒河
 
Scala lens: An introduction
Scala lens: An introductionScala lens: An introduction
Scala lens: An introductionKnoldus Inc.
 
Responsive Design - ISCTE
Responsive Design - ISCTEResponsive Design - ISCTE
Responsive Design - ISCTEfidibiko
 
Boxen: How to Manage an Army of Laptops
Boxen: How to Manage an Army of LaptopsBoxen: How to Manage an Army of Laptops
Boxen: How to Manage an Army of LaptopsPuppet
 
Kalan Ray (Magnopus): Bringing the Land of the Dead to Life: The Making of Co...
Kalan Ray (Magnopus): Bringing the Land of the Dead to Life: The Making of Co...Kalan Ray (Magnopus): Bringing the Land of the Dead to Life: The Making of Co...
Kalan Ray (Magnopus): Bringing the Land of the Dead to Life: The Making of Co...AugmentedWorldExpo
 
2d games design
2d games design 2d games design
2d games design rafiqfps
 

Similar to [Gdc2012] 디아블로3 ragdolls (20)

2nd creative factory project 2nd stage
2nd creative factory project  2nd stage2nd creative factory project  2nd stage
2nd creative factory project 2nd stage
 
Alexey Savchenko, Unreal Engine
Alexey Savchenko, Unreal EngineAlexey Savchenko, Unreal Engine
Alexey Savchenko, Unreal Engine
 
2nd cfp 2ndstage
2nd cfp 2ndstage2nd cfp 2ndstage
2nd cfp 2ndstage
 
Programmers guide
Programmers guideProgrammers guide
Programmers guide
 
2nd cfp 2ndstage
2nd cfp 2ndstage2nd cfp 2ndstage
2nd cfp 2ndstage
 
Raphael Amorim - Scrating React Fiber
Raphael Amorim - Scrating React FiberRaphael Amorim - Scrating React Fiber
Raphael Amorim - Scrating React Fiber
 
Going off the rails
Going off the railsGoing off the rails
Going off the rails
 
2 d gameplaytutorial
2 d gameplaytutorial2 d gameplaytutorial
2 d gameplaytutorial
 
Docker Inside/Out: The 'Real' Real- World World of Stacking Containers in pro...
Docker Inside/Out: The 'Real' Real- World World of Stacking Containers in pro...Docker Inside/Out: The 'Real' Real- World World of Stacking Containers in pro...
Docker Inside/Out: The 'Real' Real- World World of Stacking Containers in pro...
 
Android game engine
Android game engineAndroid game engine
Android game engine
 
Umbra Ignite 2015: Alex Evans – Learning from failure – prototypes, R&D, iter...
Umbra Ignite 2015: Alex Evans – Learning from failure – prototypes, R&D, iter...Umbra Ignite 2015: Alex Evans – Learning from failure – prototypes, R&D, iter...
Umbra Ignite 2015: Alex Evans – Learning from failure – prototypes, R&D, iter...
 
Looking glassrenderinglt en
Looking glassrenderinglt enLooking glassrenderinglt en
Looking glassrenderinglt en
 
Scala lens: An introduction
Scala lens: An introductionScala lens: An introduction
Scala lens: An introduction
 
Responsive Design - ISCTE
Responsive Design - ISCTEResponsive Design - ISCTE
Responsive Design - ISCTE
 
Drama Dash
Drama DashDrama Dash
Drama Dash
 
Boxen: How to Manage an Army of Laptops
Boxen: How to Manage an Army of LaptopsBoxen: How to Manage an Army of Laptops
Boxen: How to Manage an Army of Laptops
 
Kalan Ray (Magnopus): Bringing the Land of the Dead to Life: The Making of Co...
Kalan Ray (Magnopus): Bringing the Land of the Dead to Life: The Making of Co...Kalan Ray (Magnopus): Bringing the Land of the Dead to Life: The Making of Co...
Kalan Ray (Magnopus): Bringing the Land of the Dead to Life: The Making of Co...
 
Robotics Portfolio
Robotics PortfolioRobotics Portfolio
Robotics Portfolio
 
2d games design
2d games design 2d games design
2d games design
 
Games Disign Portfolio
Games Disign PortfolioGames Disign Portfolio
Games Disign Portfolio
 

More from MinGeun Park

[CSStudy] 코딩인터뷰 완전 분석 #7.pdf
[CSStudy] 코딩인터뷰 완전 분석 #7.pdf[CSStudy] 코딩인터뷰 완전 분석 #7.pdf
[CSStudy] 코딩인터뷰 완전 분석 #7.pdfMinGeun Park
 
[Cs study] 코딩인터뷰 완전 분석 #6
[Cs study] 코딩인터뷰 완전 분석 #6[Cs study] 코딩인터뷰 완전 분석 #6
[Cs study] 코딩인터뷰 완전 분석 #6MinGeun Park
 
[Cs study] 코딩인터뷰 완전 분석 #5
[Cs study] 코딩인터뷰 완전 분석 #5[Cs study] 코딩인터뷰 완전 분석 #5
[Cs study] 코딩인터뷰 완전 분석 #5MinGeun Park
 
[Cs study] 코딩인터뷰 완전 분석 #3
[Cs study] 코딩인터뷰 완전 분석 #3[Cs study] 코딩인터뷰 완전 분석 #3
[Cs study] 코딩인터뷰 완전 분석 #3MinGeun Park
 
[Cs study] 코딩인터뷰 완전 분석 #2
[Cs study] 코딩인터뷰 완전 분석 #2[Cs study] 코딩인터뷰 완전 분석 #2
[Cs study] 코딩인터뷰 완전 분석 #2MinGeun Park
 
[Cs study] 코딩인터뷰 완전 분석
[Cs study] 코딩인터뷰 완전 분석[Cs study] 코딩인터뷰 완전 분석
[Cs study] 코딩인터뷰 완전 분석MinGeun Park
 
[데브루키_언리얼스터디_0525] 애니메이션 노티파이
[데브루키_언리얼스터디_0525] 애니메이션 노티파이[데브루키_언리얼스터디_0525] 애니메이션 노티파이
[데브루키_언리얼스터디_0525] 애니메이션 노티파이MinGeun Park
 
[데브루키] 이벤트 드리븐 아키텍쳐
[데브루키] 이벤트 드리븐 아키텍쳐[데브루키] 이벤트 드리븐 아키텍쳐
[데브루키] 이벤트 드리븐 아키텍쳐MinGeun Park
 
[데브루키 언리얼 스터디] PBR
[데브루키 언리얼 스터디] PBR[데브루키 언리얼 스터디] PBR
[데브루키 언리얼 스터디] PBRMinGeun Park
 
[데브루키 언리얼 스터디] 스터디 안내 OT
[데브루키 언리얼 스터디] 스터디 안내 OT[데브루키 언리얼 스터디] 스터디 안내 OT
[데브루키 언리얼 스터디] 스터디 안내 OTMinGeun Park
 
[데브루키/페차쿠차] 유니티 프로파일링에 대해서 알아보자.
[데브루키/페차쿠차] 유니티 프로파일링에 대해서 알아보자.[데브루키/페차쿠차] 유니티 프로파일링에 대해서 알아보자.
[데브루키/페차쿠차] 유니티 프로파일링에 대해서 알아보자.MinGeun Park
 
[데브루키] Color space gamma correction
[데브루키] Color space gamma correction[데브루키] Color space gamma correction
[데브루키] Color space gamma correctionMinGeun Park
 
유니티 팁&트릭 Unity Tip & Trick
유니티 팁&트릭 Unity Tip & Trick유니티 팁&트릭 Unity Tip & Trick
유니티 팁&트릭 Unity Tip & TrickMinGeun Park
 
Live2D with Unity - 그녀들을 움직이게 하는 기술 (알콜코더 박민근)
Live2D with Unity - 그녀들을 움직이게 하는 기술 (알콜코더 박민근)Live2D with Unity - 그녀들을 움직이게 하는 기술 (알콜코더 박민근)
Live2D with Unity - 그녀들을 움직이게 하는 기술 (알콜코더 박민근)MinGeun Park
 
[RAPA/C++] 1. 수업 내용 및 진행 방법
[RAPA/C++] 1. 수업 내용 및 진행 방법[RAPA/C++] 1. 수업 내용 및 진행 방법
[RAPA/C++] 1. 수업 내용 및 진행 방법MinGeun Park
 
[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용
[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용 [Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용
[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용 MinGeun Park
 
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현MinGeun Park
 
[데브루키160409 박민근] UniRx 시작하기
[데브루키160409 박민근] UniRx 시작하기[데브루키160409 박민근] UniRx 시작하기
[데브루키160409 박민근] UniRx 시작하기MinGeun Park
 
[160404] 유니티 apk 용량 줄이기
[160404] 유니티 apk 용량 줄이기[160404] 유니티 apk 용량 줄이기
[160404] 유니티 apk 용량 줄이기MinGeun Park
 
[160402_데브루키_박민근] UniRx 소개
[160402_데브루키_박민근] UniRx 소개[160402_데브루키_박민근] UniRx 소개
[160402_데브루키_박민근] UniRx 소개MinGeun Park
 

More from MinGeun Park (20)

[CSStudy] 코딩인터뷰 완전 분석 #7.pdf
[CSStudy] 코딩인터뷰 완전 분석 #7.pdf[CSStudy] 코딩인터뷰 완전 분석 #7.pdf
[CSStudy] 코딩인터뷰 완전 분석 #7.pdf
 
[Cs study] 코딩인터뷰 완전 분석 #6
[Cs study] 코딩인터뷰 완전 분석 #6[Cs study] 코딩인터뷰 완전 분석 #6
[Cs study] 코딩인터뷰 완전 분석 #6
 
[Cs study] 코딩인터뷰 완전 분석 #5
[Cs study] 코딩인터뷰 완전 분석 #5[Cs study] 코딩인터뷰 완전 분석 #5
[Cs study] 코딩인터뷰 완전 분석 #5
 
[Cs study] 코딩인터뷰 완전 분석 #3
[Cs study] 코딩인터뷰 완전 분석 #3[Cs study] 코딩인터뷰 완전 분석 #3
[Cs study] 코딩인터뷰 완전 분석 #3
 
[Cs study] 코딩인터뷰 완전 분석 #2
[Cs study] 코딩인터뷰 완전 분석 #2[Cs study] 코딩인터뷰 완전 분석 #2
[Cs study] 코딩인터뷰 완전 분석 #2
 
[Cs study] 코딩인터뷰 완전 분석
[Cs study] 코딩인터뷰 완전 분석[Cs study] 코딩인터뷰 완전 분석
[Cs study] 코딩인터뷰 완전 분석
 
[데브루키_언리얼스터디_0525] 애니메이션 노티파이
[데브루키_언리얼스터디_0525] 애니메이션 노티파이[데브루키_언리얼스터디_0525] 애니메이션 노티파이
[데브루키_언리얼스터디_0525] 애니메이션 노티파이
 
[데브루키] 이벤트 드리븐 아키텍쳐
[데브루키] 이벤트 드리븐 아키텍쳐[데브루키] 이벤트 드리븐 아키텍쳐
[데브루키] 이벤트 드리븐 아키텍쳐
 
[데브루키 언리얼 스터디] PBR
[데브루키 언리얼 스터디] PBR[데브루키 언리얼 스터디] PBR
[데브루키 언리얼 스터디] PBR
 
[데브루키 언리얼 스터디] 스터디 안내 OT
[데브루키 언리얼 스터디] 스터디 안내 OT[데브루키 언리얼 스터디] 스터디 안내 OT
[데브루키 언리얼 스터디] 스터디 안내 OT
 
[데브루키/페차쿠차] 유니티 프로파일링에 대해서 알아보자.
[데브루키/페차쿠차] 유니티 프로파일링에 대해서 알아보자.[데브루키/페차쿠차] 유니티 프로파일링에 대해서 알아보자.
[데브루키/페차쿠차] 유니티 프로파일링에 대해서 알아보자.
 
[데브루키] Color space gamma correction
[데브루키] Color space gamma correction[데브루키] Color space gamma correction
[데브루키] Color space gamma correction
 
유니티 팁&트릭 Unity Tip & Trick
유니티 팁&트릭 Unity Tip & Trick유니티 팁&트릭 Unity Tip & Trick
유니티 팁&트릭 Unity Tip & Trick
 
Live2D with Unity - 그녀들을 움직이게 하는 기술 (알콜코더 박민근)
Live2D with Unity - 그녀들을 움직이게 하는 기술 (알콜코더 박민근)Live2D with Unity - 그녀들을 움직이게 하는 기술 (알콜코더 박민근)
Live2D with Unity - 그녀들을 움직이게 하는 기술 (알콜코더 박민근)
 
[RAPA/C++] 1. 수업 내용 및 진행 방법
[RAPA/C++] 1. 수업 내용 및 진행 방법[RAPA/C++] 1. 수업 내용 및 진행 방법
[RAPA/C++] 1. 수업 내용 및 진행 방법
 
[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용
[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용 [Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용
[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용
 
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
 
[데브루키160409 박민근] UniRx 시작하기
[데브루키160409 박민근] UniRx 시작하기[데브루키160409 박민근] UniRx 시작하기
[데브루키160409 박민근] UniRx 시작하기
 
[160404] 유니티 apk 용량 줄이기
[160404] 유니티 apk 용량 줄이기[160404] 유니티 apk 용량 줄이기
[160404] 유니티 apk 용량 줄이기
 
[160402_데브루키_박민근] UniRx 소개
[160402_데브루키_박민근] UniRx 소개[160402_데브루키_박민근] UniRx 소개
[160402_데브루키_박민근] UniRx 소개
 

Recently uploaded

Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...panagenda
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...AliaaTarek5
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsRavi Sanghani
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI AgeCprime
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfNeo4j
 

Recently uploaded (20)

Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and Insights
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI Age
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdf
 

[Gdc2012] 디아블로3 ragdolls

  • 1. <title page> Hello everyone! My name is Erin Catto and I want to thank you for coming to my tutorial. Today I’m going to discuss my work on the Diablo 3 ragdoll system. I learned a lot working on this project and I hope you find this information useful in your own projects. And as I promised, you will learn how to smack a demon. First let me give you a little background about myself. 1
  • 2. <who?> My first job in the game industry was writing the physics engine for Tomb Raider: Legend at Crystal Dynamics. The engine was used to create physics puzzles, ragdolls, and vehicles. The same engine lives on today in Lara Croft: Guardian of Light and Deus Ex 3. In my spare time I have been working on Box2D, a free open source physics engine. Box2D is used in Crayon Physics, Limbo, and Angry Birds. 2
  • 3. <setting> So after shipping Tomb Raider, I got an amazing opportunity to go work at Blizzard’s console division. That same division had been working on StarCraft Ghost. When I arrived at the console division, Starcraft Ghost had been cancelled and they were brain-storming for new game ideas. I didn’t pay too much attention to that because I had been put in charge of developing a new physics engine for the team. I was excited to work on the Xbox 360 and the PS3. And I wanted to improve on what I had done at Crystal. Well two weeks later the console division was shut down. I was told to go home and wait for a call to see about other positions at Blizzard. 3
  • 4. <role> As it happened, I was rescued by Tyrael! I must confess that I was a Diablo 2 addict. I actually uninstalled it once and threw away the disks because it was taking too much of my time. Nevertheless, I have many fond memories of the game. I was therefore incredibly excited to become a part of the Diablo 3 team. I wanted to help make the best Diablo game ever! 4
  • 5. <goal> So when I started thinking about bringing physics to Diablo, one of my first ideas was ragdolls. I wanted ragdolls on every creature. I wanted it to be easy for artists to create all kinds of over the top ragdoll effects. A good ragdoll system has a lot to offer. From a design point of view, ragdolls make the world feel more interactive and make the player feel more powerful. From an artistic point of view, ragdolls allow for lots of death variation and reduce the animator workload. From a programming point of view, ragdolls improve the visual quality by making the corpses conform to the environment. Ragdoll physics prevent corpses from hanging off a cliff. 5
  • 6. <challenge> I wrote a ragdoll system for Diablo 3 on top of the Havok physics engine. We later switched to an in-house physics engine called Domino. Now I love physics engines just as much as the next guy (well maybe more so), but today I’m mainly going to talk about my work in making ragdolls a core feature of Diablo. Most of that is code written outside of the physics engine. One thing to keep in mind is that a physics engine doesn’t know a ragdoll is a ragdoll. The physics engine just sees some rigid bodies, collision shapes, and joints. The physics engine doesn’t know how the ragdoll is authored, how it hooks into the animation system, or how it gets whacked by an axe. The physics engine doesn’t keep your game from embedding a ragdoll in a wall, or make sure your ragdolls are stable and look good. These aspects are usually handled by a programmer on the game team, not someone from the physics engine company. Sometimes this work is done by a physics programmer, but often this work is done by a generalist programmer who is not familiar with the inner workings of the physics engine. Some aspects of implementing a ragdoll system are straight forward, but others are not always so obvious. And navigating the pitfalls of a physics engine is not always easy or intuitive. 6
  • 7. <call to action> There were three main areas I had to tackle to build the Diablo 3 ragdoll system: First, I needed a solid content pipeline so that artists and riggers can author ragdolls on a large scale Second, I needed to create some ragdoll glue to connect the ragdoll to the animated actor Third, I needed to develop some tools and know how to make ragdolls stable, look good, and add flavor. 7
  • 8. <key point> Now let’s talk about the content pipeline. The Diablo ragdoll content pipeline is a wedding of the artist’s tool and the game editor. I wanted ragdoll geometry to be defined in the artist’s tool. This centralizes most of the geometric data and the artist’s tool is usually well suited to geometric construction. It is not easy to get the ragdoll simulation running the artist’s tool. Sure, we could probably integrate the physics engine into the art tool, but much of ragdoll behavior is tied to game logic. So instead, our artists test and tune their ragdolls in our game editor. This is a fairly seamless process. There are no text files to be edited and much of the authoring is visual. 8
  • 9. <explanation> The ragdoll geometry is created by a technical artist in Maya. We start with a standard character skeleton. The ragdoll is defined in the so- called bind pose. A skeleton’s bind pose fits the original character mesh that was created by a modeler. The bind pose is the pose where the mesh is bound to the skeleton in a process called skinning. We attach collision shapes to the skeleton bones. Each bone has zero or more collision shapes. These implicitly define the rigid bodies. Physics joints are represented as locator transforms that connect two bones. With this framework, we can author all the physics objects in the game as ragdolls. 9
  • 10. Video: Zombie Fest Here are your standard death ragdolls. 10
  • 11. Video: Chandelier Here is a destructible chandelier. The entire chandelier is one model with a single skeleton. You’ll have fun dropping these on top of zombies in Diablo3. 11
  • 12. Video: Wagon Even a destructible wagon is a ragdoll. So a ragdoll in Diablo is not just a character. This simplifies our authoring path and our code. Also, by having all physics props as ragdolls we keep draw calls low since the moving parts are just bones, not separate actors. 12
  • 13. Video: Barrel This barrel mixes destruction with a character ragdoll. But it is still one draw call. 13
  • 14. For collision shapes, we support spheres, capsules, and convex hulls. There is no special case for boxes. We have a tool that can shrink wrap a vertex cloud with a simplified convex hull. The rigger can select a set of vertices and press a button to generate an efficient convex hull. We try to use spheres and capsules where appropriate because they are cheaper than convex hulls. We have rolling resistance to prevent spheres and capsules from rolling forever, even on slopes. 14
  • 15. Rolling resistance improves behavior and helps bodies get to sleep faster. Convex hull simplification improves artist productivity and improves simulation quality. Broad polygonal faces improves quality by eliminating a teetering effect that sometimes happens on shallow edges. 15
  • 16. The technical artist connects bones with physics joints. The physics joints do not necessarily line up with the bones and we support branch crossing loop joints. We use cone, revolute, spherical, and weld joints. Cone joint: like a shoulder with cone and twist angle limits Revolute joint: like an elbow with a single axis of rotation and angular limits Spherical joint: a pure point to point constraints with no rotation restriction, useful for chandeliers where rotation is naturally limited by collision. Weld joint: locks two bodies together, useful for some advanced effects you’ll see later. We author physics joints using a Maya construct called a locator, which is basically a transform with position and orientation. So they are just coordinate axes. We have conventions to relate locator axes to joint axes. For example, the z-axis is the hinge axis for a revolute joint. 16
  • 17. The ragdoll collision shapes and joints are exported with the model into a raw intermediate file. The export is handled by a Maya plug-in written in C++. I highly recommend exporting data raw from your authoring tools, with minimal pre-processing. This allows the run-time format to change without requiring re-exports from the art tool. 17
  • 18. <explanation> We import the intermediate file into our game editor, called Axe. During this process the skeleton is built along with the associated ragdoll data. The editor is aware of versions, so if the model version changes, the editor simply re- imports the intermediate file. No re-export from Maya is needed. The model is then serialized into an optimized binary format that can be read in-place into the game with simple pointer fix ups. This run-time data is the game’s representation of the ragdoll. We still need to instantiate the physics engine objects according to game logic. The process is quick and is mostly gated by the cost of inserting collision shapes into the physics engine’s broad-phase. 18
  • 19. Here is how we represent the skeleton. A bone is just a node in a hierarchy. Each bone should know it’s parent bone with the special case that the root bone’s parent is null. A bone also has a linked list of children. A ssibling index acts as the next pointer in the child list. You will save yourself a lot of headache and improve performance by keeping bones in a sorted array. The array should be sorted so that parents always precede their children. This makes it easy to compute the bone transforms in model space. Often you don’t even need to sort the bones because the art tool keeps them sorted. I’ve worked on game engines that sort the bones based on other criteria, such as the name. Don’t do that. 19
  • 20. Animation data is interpolated and blended in parent space. We then convert the parent space transforms into model space transforms so we can render the model. When the bones are sorted parent first, we can simply loop through all the bones to compute the model space transforms. Without proper sorting, we would need a recursive algorithm to update the skeleton. I also find that keeping the bones sorted makes it easier to synchronize the skeleton with the ragdoll. 20
  • 21. A typical character skeleton may have dozens of bones. There are usually far more bones than can be efficiently simulated with rigid bodies. Therefore, we usually only have rigid bodies on a sub-set of the bones. This creates a situation where there are three kinds of bones: active bones, leaf bones, and intermediate bones. An active bone is attached to a rigid body. A leaf bone has no body and no descendent bones with bodies. An intermediate bone has no body, but has a descendent bone with a body. In other words, an intermediate bone is an inactive bone stuck between active bones. The run-time ragdoll system needs a map from bone to body. That map has holes, but the holes are important. To keep track of things I also have a RagdollBody structure that keeps the bone index, the index of the parent body, and the rigid body from the physics engine. 21
  • 22. Here’s how I build the bone to body map. The map is an array of body indices, one per bone. Step One: I initialize the map to be all leaf bones. Step Two: Then I walk through the ragdoll body array and install the body index into the map. Step Three: For each body, I walk up the tree marking intermediate bones until I hit an ancestor bone with a body. 22
  • 23. <explanation> Let’s move on to the game editor. Our game editor, called Axe, has a model viewer called the Holodeck. In there ragdolls can be tested and tuned. We can view the ragdoll collision shapes and joints to make sure they are working as intended. We can also play back animations that trigger the ragdolls. Here you see a dead zombie and we have enabled rendering of the ragdoll collision shapes. 23
  • 25. Video: zombie ragdoll with collision shape rendering 25
  • 26. Our model viewer has a mouse joint that lets you move a ragdoll around. This is a simple feature that is quite helpful for quickly testing a ragdoll. For example, joint limits may need to be tuned to avoid squatting. Dead guys should not be sitting on their knees! The mouse joint can be used to detect bad configurations. 26
  • 28. We have some physics parameters that can be tuned in Axe, such as the global friction for the ragdoll. We also can control collision flags in Axe. For example, we decided to improve the performance of the some ragdolls in Diablo 3 by preventing those ragdolls from colliding with each other. However, we can still allow a ragdoll to collide with itself so that a ragdoll by itself looks pretty good. These parameters live apart from the intermediate file containing the ragdoll geometry. So these parameters can be shared by multiple ragdolls. This makes it easy to do global tuning of ragdoll behavior. 28
  • 29. We control ragdoll spawning using animation triggers. This is basically a simple scripting system on a time-line. Besides spawning ragdolls, we can also disable physics joints and spawn explosions. You can see more about this system at Julian Love’s presentation on Wednesday at 5pm. 29
  • 30. <key point> So now let’s talk about the animation system. When I was integrating ragdolls into the Diablo animation system, it helped me to keep the perspective that ragdolls are just a form of procedural animation. In our animation system we start with the raw key frames created by the animator. Then we perform interpolation and blending in parent space. Then we compute the bone transforms in model space as I showed before. At this point we apply procedural animations such as ragdoll, inverse kinematics, and cloth. Procedural animations usually happen in world space because they usually interact with the world in some manner. For example, ragdolls collide with the ground. 30
  • 31. <explanation> As mentioned before, the ragdoll bodies map to a subset of the bones. Bones with bodies follow the rigid body transform exactly. How shall we handle leaf and intermediate bones? Keep in mind that each rigid body can only drive a single bone. So leaf and intermediate bones need another source of data to fully determine their transforms. 31
  • 32. Leaf bones are fairly obvious: they just go along for the ride, holding their relative pose from the keyed animation. 32
  • 33. Intermediate bones are a bit trickier. We would like to allow them to be animated, but that doesn’t jive with how rigid bodies are connected to each other. Since active bones follow their rigid bodies exactly, an intermediate bone cannot affect its active descendants. Instead you will see the mesh stretch in an unnatural way. Therefore, we leave intermediate bones in the bind pose relative to their parent. Usually this is not a big problem because we choose bones to be intermediate because they already have limited movement. Nevertheless, your animators should be aware of this when they are constructing animations that have a transition to ragdoll. 33
  • 34. In Diablo we maintain a bounding sphere on our actors. This sphere is used for lighting and visibility culling. When a character goes ragdoll they may move very far from the actor transform. They may even fall off a cliff. Further, we support breakable ragdolls and gibbing of ragdolls, so the ragdoll pieces may be widely separated. So we have to adjust the bounding sphere to contain all the bones, not matter where they are. To do this, we have a local bounding sphere for each bone and sum up all the spheres according to the final bone positions. 34
  • 35. <explanation> When a character dies we have to spawn the ragdoll in-place. We could just create the rigid bodies and joints and cross our fingers. But this can lead to a low quality result. 35
  • 36. When we spawn a ragdoll, we have to create the bodies where the character’s bones are currently located. There is no guarantee that the animated pose conforms to the ragdoll constraints, so joints may be stretched and joint limits may be violated. We could go through all the joints and try to fix them up by shifting the bodies. However, if you have a good physics engine, it will smoothly eliminate the joint errors over time so you don’t have to worry about this problem too much. But you should keep this issue in mind. If a joint is incredibly distorted, it may not recover. For example, some physics engines may flip a joint 180 degrees if it is distorted by more than 90 degrees. 36
  • 37. Once the rigid bodies are created we set the initial velocities based on the animation. Otherwise the ragdoll transition will not be smooth. We also allow animators to influence the initial velocity through death animations. We obtain the initial velocity using two frames of animation. The linear velocity is a straight forward finite difference approximation using two points. The angular velocity is obtained with a finite difference on two quaternions. When you do this, make sure the quaternions have the same polarity. 37
  • 38. Video: female zombie spin death 38
  • 39. Video: female zombie spin death slow motion 39
  • 40. A typical physics bug you see in games is when the ragdoll spawns in an unfortunate location and a limb becomes stuck in the terrain. The terrain is often made from a triangle mesh, so it has no sense of volume. So once a foot is below the ground, it cannot come back out because it bumps into the backside of the triangles. What’s worse is the contact constraints start to fight with the joints and this leads to jitter. So your dead guy appears to be convulsing on the ground. There is no silver bullet for this problem. There are several approaches that can improve the situation. You could eliminate hand and feet collision from your ragdoll. That will solve many cases and I generally recommend eliminating hands and feet because they do not add much visual improvement. You may also be able to instruct your physics engine to use one-sided collision for the triangle mesh. This will prevent a limb from being stuck and jittering. However, a limb may still stay penetrated in the floor. 40
  • 41. On Diablo 3 I added a routine that tries to remove the initial overlap by translating the entire ragdoll, just enough so that all the center points of each ragdoll collision shape are inside the world. The routine assumes the pelvis is inside the world and then fires rays along the bones, looking for terrain collisions. If it finds a terrain collision, then it shifts the ragdoll to remove the overlap. This proceeds until all the overlaps are removed or an iteration limit is hit. 41
  • 42. <key point> Now, let’s talk about tuning. If you want to support lots of different kinds of ragdolls, you will need to work on tuning. Not all ragdolls look good when they are simulated by the physics engine. There are several techniques I’ll show you to deal with stability. I’ll also show you some ways to get more out of ragdolls then just a simple death. This little guy is called a pit flyer. The pit flyer was one of the most difficult ragdolls to get right in Diablo 3. I modified our physics engine to enable dumping out ragdolls into a text file that could be loaded into a testbed. There I could look at the ragdoll in detail and try to figure out how to make it behave better. 42
  • 44. Video: pit flyer ragdoll 44
  • 45. Small capsules connecting the wings to the torso make it difficult to simulate the flyer and it has trouble going to sleep. We could make the wing boxes lighter, which effectively makes the arms heavier. But there are two problems with this: 1. Mass tweaking can be difficult for a rigger to get right, so we use a uniform density for shapes based on material. 2. Rotational inertia scales faster with size than with mass, so we can get a better effect by using fatter shapes. It is easier to spot ragdoll tuning issues visually than by checking the mass. 45
  • 46. <explanation> Mass distribution is critical for good ragdoll stability. These rules may not seem obvious at first, but the main point is to design the ragdolls as you would a sturdy structure, such as a bridge. 46
  • 47. Would you build a bridge that is two huge parts connected by a tiny bolt in the middle? Probably not. The same design philosophy applies to ragdolls. We don’t want to support heavy bodies with light bodies. The opposite is okay. This is due to the nature of the iterative solvers used by most physics engines. They simply cannot converge large forces on small bodies. 47
  • 48. Another design aspect that can hurt ragdoll stability are joint gaps. Gaps are bad for a couple reasons: 1. other objects can get stuck in a gap, creating a bad visual quality 2. gaps also imply low rotational inertia relative to the torques imposed by the joints. This behaves like a large force on a small body. Fortunately it is often quite easy for the rigger to close those gaps. In many cases significant overlap works well. For example upper and lower arm collision shapes can overlap around the elbow. 48
  • 49. 49
  • 50. In Domino and Box2D I have a joint flag to disable collision between attached bodies. However, bodies that are not directly connected can still collide. In particular, overlapping siblings can still collide. For example, large thigh capsules can collide. These internal collisions fight with the joints and can make the physics solver unhappy. In Domino, these cause the ragdoll to jitter and propel across the ground. 50
  • 51. 51
  • 52. Long skinny bodies can be another source of trouble. They have inherently poor mass distribution which can cause them to spin excessively. And they are more difficult for the collision system to handle correctly. 52
  • 53. Video: fallen with skinny staff 53
  • 54. Video: fallen with fat staff 54
  • 55. <explanation> Now I’d like to tell you about some fun effects that we implemented in Diablo 3. First, we implemented an explosion system to knock ragdolls around. Second, we implemented a system for gibbing those nasty zombies. Finally, we implemented a system for adding physics simulation to things like pony tails. 55
  • 56. Explosions are crucial for making the world of Diablo 3 feel more interactive. In Diablo 3, stuff is always getting knocked around and blown up. We have two types of explosions: radial and linear. A radial explosion is the standard spherical explosion that radiates from the center of a sphere. The linear explosion still uses a sphere of influence, but the impulse direction is fixed. The direction can either be in world space, such as up, or in local space, such as along the blade of an axe. Many explosions are set up quite precisely. For example, the weapon swing animation on the Barbarian has a specific contact frame where damage is triggered. At the same time we fire a linear explosion pointed in the direction of the blade. This technique helps to improve the connection between the attack and the ragdoll response. 56
  • 57. A ragdoll receives an explosion according to its collision shapes. For each shape we compute the closest point on the shape to the center of the explosion. We apply the explosion at that closest point. This gives the explosion some torque and leads to a nice spinning effect. Also, we project the surface area of the shape in the direction of the explosion. Then we scale the explosion impulse by the projected surface area. This means that a door facing an explosion gets a bigger impulse than a door pointing away from an explosion. 57
  • 60. Video: zombie attack with explosion rendering 60
  • 63. Setting up gibbing was one of my favorite tasks on Diablo 3. It works in a fairly direct manner. Death animations are selected from a pool of possibilities. When the dismemberment animation is selected the full ragdoll is spawned, the visual mesh is swapped to a custom gibbed mesh, and then select ragdoll joints are disabled. So we don’t have to author separate ragdolls for gibbing. 63
  • 69. We made a big effort to make the characters in Diablo 3 visually interesting. So the question naturally arose how we could use the ragdoll system to enhance our living characters. Out of this we developed our so-called partial ragdoll system. Our canonical example of the partial ragdoll system is the wizard’s pony tail. Here you can see how the partial ragdoll is set up. We have a couple red capsules for the dynamic pony tail. The blue capsules are kinematic bodies. Kinematic bodies follow the animation rigidly and provide a collision barrier so that the pony tail doesn’t swing through her body. 69
  • 70. The main challenge for simulating partial ragdolls is that characters can move very fast. They can rotate 180 degrees instantly and they can teleport across the screen. However, a physics engine likes smooth movement. These rapid movements can cause the joints to stretch and rip the visual mesh apart. I will briefly explain to you how we dealt with rapid movement. First of all, every partial ragdoll has a kinematic root body. Kinematic bodies are moved by setting their velocity according to the animation. This leaves the partial ragdoll a frame behind, but we can simply transform the ragdoll bones forward to mask the latency. We need the kinematic bodies to have a realistic velocity to impart a realistic reaction in the partial ragdoll. However, we need to limit the magnitude of the velocity otherwise joints will rip apart. But then the partial ragdoll with fall behind! We solve problem this through partial teleportation. We scale down the velocity by teleporting the kinematic body partway forward to the animation pose according to a tuning parameter (shown here as alpha). Then we generate a velocity command to drive the kinematic body the rest of the way 70
  • 71. to the animation frame. Then we apply that partial transform to the entire dynamic sub-tree. This has the effect of subduing the rapid movement while retaining a natural looking reaction. No damping is required! Videos: Witch Doctor 70
  • 74. You can download this presentation at box2d.org and you can reach me on twitter or on the Box2D forums. Thank you for attending my presentation and I hope you find it useful. I would now like to answer any questions you have. >>>>>>>>>>>>>>> PARROT THE QUESTIONS <<<<<<<<<<<<<<<<< 73