• Announcements

    • khawk

      Download the Game Design and Indie Game Marketing Freebook   07/19/17

      GameDev.net and CRC Press have teamed up to bring a free ebook of content curated from top titles published by CRC Press. The freebook, Practices of Game Design & Indie Game Marketing, includes chapters from The Art of Game Design: A Book of Lenses, A Practical Guide to Indie Game Marketing, and An Architectural Approach to Level Design. The GameDev.net FreeBook is relevant to game designers, developers, and those interested in learning more about the challenges in game development. We know game development can be a tough discipline and business, so we picked several chapters from CRC Press titles that we thought would be of interest to you, the GameDev.net audience, in your journey to design, develop, and market your next game. The free ebook is available through CRC Press by clicking here. The Curated Books The Art of Game Design: A Book of Lenses, Second Edition, by Jesse Schell Presents 100+ sets of questions, or different lenses, for viewing a game’s design, encompassing diverse fields such as psychology, architecture, music, film, software engineering, theme park design, mathematics, anthropology, and more. Written by one of the world's top game designers, this book describes the deepest and most fundamental principles of game design, demonstrating how tactics used in board, card, and athletic games also work in video games. It provides practical instruction on creating world-class games that will be played again and again. View it here. A Practical Guide to Indie Game Marketing, by Joel Dreskin Marketing is an essential but too frequently overlooked or minimized component of the release plan for indie games. A Practical Guide to Indie Game Marketing provides you with the tools needed to build visibility and sell your indie games. With special focus on those developers with small budgets and limited staff and resources, this book is packed with tangible recommendations and techniques that you can put to use immediately. As a seasoned professional of the indie game arena, author Joel Dreskin gives you insight into practical, real-world experiences of marketing numerous successful games and also provides stories of the failures. View it here. An Architectural Approach to Level Design This is one of the first books to integrate architectural and spatial design theory with the field of level design. The book presents architectural techniques and theories for level designers to use in their own work. It connects architecture and level design in different ways that address the practical elements of how designers construct space and the experiential elements of how and why humans interact with this space. Throughout the text, readers learn skills for spatial layout, evoking emotion through gamespaces, and creating better levels through architectural theory. View it here. Learn more and download the ebook by clicking here. Did you know? GameDev.net and CRC Press also recently teamed up to bring GDNet+ Members up to a 20% discount on all CRC Press books. Learn more about this and other benefits here.
Sign in to follow this  
Followers 0
Kest

Convert Ragdoll matrices back to Animation matrices

2 posts in this topic

Hey guys! I've been trying to figure this out for while now, with no luck.

My animated characters use a hierarchy skeletal system. Each limb has a rotational state, which is converted to a rendering matrix by multiplying it with its parents. I have easily figured out how to pose my ragdoll for physics start by determining their matrices using the character's rendering matrices. My ragdoll body parts are not in a hierarchy (which is part of what is confusing me).

Each ragdoll body part has a bind transform - a matrix that takes the body part from the zero-origin-point and places it at the limb location of the character. So when all ragdoll parts render with just their bind pose, it would look like a character in their bind pose. In order to place the ragdoll parts, I multiply each ragdoll part's bind pose with the character's rendering matrix for that bone. For instance:
Ragdoll_Leg->Transform = MUL( Ragdoll_Leg->Bind_Transform, Character->Leg->RenderMatrix );

This works, and the ragdoll starts exactly where my character is posed. However, I'm having a lot of confusion reversing this procedure and obtaining animated states for the character by using the ragdoll transforms.

My character's RenderMatrix for each bone is computed like this:
[code]
void KRaceBone::ComputeHierarchy(const MTX *states, MTX *finals, const MTX &derive)
{
finals[Index] = MUL( JointToOrigin, states[Index] );
finals[Index] = MUL( finals[Index], OriginToJoint );
finals[Index] = MUL( finals[Index], derive );

// Compute Children
for(int e=0; e<Bones.GetCount(); e++)
Bones[e].ComputeHierarchy( states, finals, finals[Index] );
}

[/code]
Note the inclusion of the "[size=2][font=Liberation Mono]states[color=#00FF00][color=#00FF00][color=#00FF00][[/color][/color][/color][color=#008000][color=#008000][color=#008000]Index[/color][/color][/color][color=#00FF00][color=#00FF00][color=#00FF00]][/color][/color][/color][/font][/size]". That is the pure-rotational local state of each bone. That is what I'm trying to convert my ragdoll parts back into. Anyone have any advice? Anything at all is appreciated. I've been pretty lost at this.

Thanks! Edited by Kest
0

Share this post


Link to post
Share on other sites
You often use two separate skeletons for animation and ragdoll physics, with the ragdoll skeleton being of lower resolution. The trick is often, that you switch between the two skeletons only once, from animation skel to ragdoll skel. So, I don't understand, why you want to map the animation bone orientation to the ragdoll bones.

Nevertheless, first off, when you want to map/compare matrices, you need to convert both into the same space. You have two skeletons here, the animation skeleton has many hierachy layers, whereas the ragdoll skeleton is really flat, but they have still the same basic structure.

Final bone position:
[CODE]
- ani skel: a_final_bone_i = a_local_bone_i * a_parent_bone_i
- ragdoll skel: r_final_bone_i = r_local_bone_i * r_parent_bone_i = r_local_bone_i * r_root_bone_i = r_local_bone_i * identity = r_local_bone_i

[/CODE]
Transform mesh to final bone orientation:
- ani/ragdoll: mesh_bone_i = final_bone_i * inverse_bind_i

When you want to recalculate i.e. a single bone position from ragdoll to animation (i.e. the hand), the final bone space (object space) would be fine, therefore:

[CODE]
r_final_bone_i = a_final_bone_i
<=>
r_local_bone_i = a_local_bone_i * a_parent_bone_i
<=>
r_local_bone_i * inv(a_parent_bone_i) = a_local_bone_i

[/CODE]
The problem is, you don't know a_parent_bone_i either. So you need to either use some kind of inverse kinetics to recalculate the parent bone, or you must start with a bone which is has a fix/known parent bone (i.e. the root bone)

The latter is ok, but you have now the problem of a ragdol skeleton which has a lower resolution (less bones), therefore you need to recreate/map parent animation bones on the fly by assuming its orientation relative to its parent bone. I.e. your animation skel has two spine bones, whereas your ragdoll only one (faster), then you need to remap the second spine bone relative to the first.
0

Share this post


Link to post
Share on other sites
After two days of working at it, I finally figured it out. For anyone trying to do the same thing, this is essentially what I did:

1. Remove the primitive bind pose from all ragdoll shapes (ie:[b] inverse(ragdoll_bind_pose)*ragdoll_transform [/b]for every ragdoll bone).
2. Treat the resulting ragdoll transforms (after #1) like rendering matrices, and convert them back to raw unrelative animation states.
3. In order to convert to animation states, I had to do the opposite procedure I did to convert normal animation states to rendering states.

For instance, if you compute a character render matrix like this: RenderMatrix = ToOrigin * state * ToJoint * parent;.
Then you would reverse that as something like this: state = inverse(ToOrigin) * RenderMatrix * inverse(parent) * inverse(ToJoint);

And this worked for me. Now I just need to figure out how to turn the top level bone into character motion.
Thanks for your help Ashman! Edited by Kest
0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0