Skip to content

2022.01.17

ragdoll2

Highlight for this release is Ragdoll 2.0!


Showcase

Let's start with the good stuff.

Medusa Breakdown

Excellent Animation and breakdown by Andras Ormos.

image

Batman Learning Cursive

Animation by Jason Snyman, with a very interesting approach to getting ink out of a pen digitally. 😄

DMV Lady

Courtesy of Dragana Mandic.

Scalable Rig, Scalable Ragdoll

No special setup required, if your rig is scalable then so is Ragdoll.

Circus Import

Toying with the ability to import characters into the same solver.

The Ocean

Give a man a fish, and you'll feed him for 2 ragdolls.

Noodles

Something from the Linux world.


Ragdoll 2.0

Since 28th July 2021, Ragdoll has been publicly available under the "early bird" umbrella. It started out with a reduced price point for those brave enough to venture into new territory and expect a few left turns every now and then as kinks are worked out in the software.

Now the time has come to step into the world as an adult piece of software with the guarantees of any commercially available software and a pricing to reflect that.

And as Ragdoll has grown significantly since those days - given the new Markers - it's only reasonable to consider this Ragdoll 2.0.


January Voucher

Pricing has now reached its intended price point, leaving Early Bird behind. For the next two weeks however, you can use this voucher code to get the Early Bird discount before the deadline.


Looking Back

The Ragdoll of today is very different from the Ragdoll of July 2021.

Back then, I had no idea that this amount of performance and usability was possible and was prepared to cram tutorials and documentation until everyone was accustomed to the complexity of physics simulation. 😄

But then something happened - Markers. Like lightning from a clear sky, it unexpectedly changed everything. Performance is now far beyond what Maya is expected to handle, with physics much much faster than simply skinning of a character, and close to the performance of native IK handles. This opens up a lot of possibilities.

The problems faced back then..

None of those problems are a problem with Markers. Because Markers look at the world from a different perspective, they just work. It made Ragdoll not only more user friendly and significantly faster but also simpler to develop and smaller in size. The code for Markers is about ⅓ of the equivalent for Rigids. Just think about that!

And most of all, it opened up for all the things you are about to see happen for Ragdoll in the coming months. 🙃


Ragdoll Flavours

Let's take a quick look at the different versions of Ragdoll and how they differ.

Flavour Description
Ragdoll Unlimited The fully-featured, unrestricted version of Ragdoll. When people talk about Ragdoll, this is the version they mean.
Ragdoll Complete The cost-effective flavour of Ragdoll, suitable for freelancers and indie studios. It lacks studio-conveniences such as a Python API for pipeline integration, export to JSON for sharing of physics configurations and is less performant than "Ragdoll Unlimited", being unable to operate in parallel across multiple cores.
Ragdoll Batch A non-interactive version without ability to render into the viewport. Suitable for automation and pipeline integration.
Ragdoll Personal A non-commercial version, suitable for students and anyone wanting to fool around with Ragdoll at home. It is identical to Unlimited, except that it has limits on how much can be recorded and exported.
Ragdoll Educational A non-commercial version of Ragdoll Unlimited whose saved scenes cannot be opened with a commercial licence.
Ragdoll Trial A non-commercial first experience with Ragdoll; this is what you get when downloading Ragdoll onto a new machine and use it without activating it first. Similar limitations to Personal, except it also expires about a month after first use.


Ragdoll Unlimited

This is the version you want.

It contains everything mentioned on any website, is capable of doing everything you've seen Ragdoll do and is the unrestricted, unlimited and gold standard of Ragdoll.


Ragdoll Complete

This is the version for freelancers.

It is Ragdoll Unlimited, with a few limitations.

  1. Limited Performance
  2. Limited Export
  3. Limited Python API

Performance is limited in how quickly Ragdoll is able to read from your character. Ragdoll is natively parallel, but Complete turns any character you assign markers to into a Serial affair. Limiting performance by the number of cores you have in your machine.

The advantage of export is that your rigs don't need physics built-in. They can remain simple and without physics, until the animator actually needs it. This feature is limited to 10 markers; for the time being. Generally, export is reserved for Unlimited and users in need of pipeline integration. But Complete let's you get at least a taste of the comfort and flexibility of exporting your physics contraptions from one scene and importing onto an unsuspecting character in another.

Like Export, the ability to interact with Ragdoll through Python is an important part of any production pipeline; not so much for the individual animator of small indie studio.

Info

At the time of this writing, this limitation is not yet in place, and users of Complete is currently able to utilise the Python API just like users of Unlimited. This will be addressed in an upcoming release.


Ragdoll Batch

This is the version for your render farm.

It's a low-cost alternative to Ragdoll Unlimited, without the ability to render into the viewport. Making it effectively useful only via Python. It is also unable to export and lacks the parallelism of Unlimited.

Unlike all other flavours, a Batch licence is reserved per-process; meaning that if you spin up 2 mayapy instances on the same machine, it will occupy 2 licences. This obviously only works if your licences are floating, as otherwise a machine can only carry a single node-locked licence, limiting it to a single process running Ragdoll Batch.

image


Ragdoll Feature Grid

Leaving Early Access, Ragdoll is stepping into the world as a 1.0. Here's an overview of what you can expect from now on.

Feature Trial Personal Complete Unlimited Batch
Commercial Use ✔️ ✔️ ✔️
Interactive Tools ✔️ ✔️ ✔️ ✔️
Python API ✔️ ✔️ ✔️ ✔️
Multi-Threading ✔️ ✔️ ✔️
JSON Import/Export ✔️ ✔️ ✔️
Per-machine Licence ✔️ ✔️ ✔️ ✔️

Batch has a per-process licence, meaning it will occupy one seat per individually running process.


Non-commercial Limitations

Trial and Personal licences are non-commercial, meaning they can't be used for commercial purposes. Such as in a studio, or for anything where money is involved.

When a file saved with a non-commercial licence of Ragdoll is opened in a commercial licence, it'll temporarily turn your licence into a non-commercial licence.

Feature Unlimited Complete Non-commercial
Export Unlimited markers Up to 10 markers Up to 10 markers
Record Unlimited frames Unlimited frames Up to 100 frames

Early Birds

Did you purchase a Ragdoll Personal licence before this release?

Then as thanks for believing in us and joining early, these limits do not apply to you. Your version is still unrestricted for non-commercial use.

Enjoy! 🥰


Import

You can now import a Ragdoll setup exported from Maya, back into Maya. It'll re-create everything just the way it was.

Can I export scenes I made with an earlier version?

Yes, anything made with Markers can be exported regardless of when it was made.

What is included in the export?

Just about everything.

  • Solvers
  • Groups
  • Markers
  • Constraints
  • Colors
  • Attribute changes
  • Retargeting
  • Reparenting
  • Replaced meshes
  • Thumbnail of your viewport
What isn't included in the export?

Very little.

  • The mesh itself is not stored, the mesh is expected to come from your rig. Including any mesh you replace. This may be added in a future release.
  • The cached simulation, although it will be soon.
Will I get identical results when simulating an imported scene?

Yes, anything else is a bug.

More precisely, determinism depends on (1) the type and number of items in the solver along with (2) the order in which these are created. Both of these are part of the exported file format and is taken into account during import. Meaning you should get identical results so long as the content is the same.


Example

Here's an exported Ragdoll setup for the free CG Spectrum Tiger rig.

To use it, download the rig and import the Ragdoll file.

image image

It contains 2 levels of detail.

Level Content
Level 0 Body and feet
Level 1 Everything on Level 0, plus toes


Workflow

Here's the rundown.

  1. Assign markers
  2. Tweak values
  3. Export
  4. Open a new scene, with the same character
  5. Import

On import, Ragdoll will try and find the names of what you exported in your currently opened scene.

  • If all names match, import should go smoothly. Preserving all of your hard work!
  • If names do not match, if for example the namespace differs, there is an option to override the namespace from the file via the Namespace dropdown menu.
  • If names don't match at all, if for example it was grouped differently on export or it is a different character altogether, then you can try using the Search and Replace fields to modify the names searched for by Ragdoll.

Export

Once you're happy with your character, it's time to export. Towards the bottom of the UI, you'll get a preview of what is about to be exported. This can help clarify that what ends up on disk is what you expect.

Import

In a new scene, with the same character, same names and everything, import as you'd expect. At the bottom of this UI, you'll get a preview of what's in the file on disk, along with how it will associate the node names found in the file with what you have on disk.


Namespace from File

Odds are, the character you're importing either has no namespace, or has a different namespace to what you've currently got in your scene. As in this example here, with 3 copies of the same character, each with its own namespace.

Use the Namespace dropdown to select one of the current namespaces in your scene, or Custom to type one in yourself.


Solver from File

Per default, Ragdoll will import the file into the current solver in your scene, if any. Or, you can import the original solver from the source file.


Known Limitations

Here are a few things that will be addressed over time. Let us know if you encounter anything else!

Limitation Result
Missing Replaced Mesh If you replace the mesh of a marker, but this mesh isn't present in the scene during import, you'll get a Capsule instead. The vertices of the geometry isn't stored in the exported file, only the name of the mesh you replaced with.
Linked Solvers These turn into a single, unified solver on import.


Density

image

Ragdoll can now automatically compute a suitable mass for each Marker, based on the volume of your shape and a density of your choosing.

In other words, big objects become heavy, small objects become light.

Before

After


Presets

Provide a custom density, or choose from one of the provided ones.

Density Value
Off Do not compute, use the Mass attribute
Cotton Very sparse, 0.05 grams per cubic centimeter
Wood Sparse, 0.2 grams per cubic centimeter
Flesh Default, 1.0g/cm3
Uranium Dense, 19.0g/cm3
Black Hole Very, very dense
Custom You pick

Mass is computed based on the volume of your shape, along with a density of your choosing.


Options

Choose between various densities either at creation-time or after creation.


Visualise

The computed mass updates interactively as you change the size and type of your shape, including convex hulls!

In the Manipulator, you'll be able to not only only edit the density, but preview the computed mass given the current shape volume and density you provide.

image

image


Level of Detail

Setup your character once with all bells-and-whistles, and interactively pick which level of detail to use for your simulation in a given situation.

image

Usecases

  1. Body at Level 0, fingers at Level 1
  2. Props at Level 1, muscles at Level 2
  3. Major masses at Level 0, extremities at Level 1 and Level 2

For example, here's a Wasp character with 3 levels of increasing detail.

As you'd expect, it'll record only the currently active markers.


Workflow

Here's how it works.

  1. Give each marker a "level", such as 1
  2. Tell solver which "level" to solve at, such as 1

And that's it! Any marker with a matching level is simulated and recorded.


Operators

What does each level mean? The answer lies in the "operator".

Operator Description
Less Than If the Marker Level is less than (or equal) to the Solver Level, simulate it.
Greater Than If the Marker Level is greater than (or equal) to the Solver Level, simulate it.
Equal If the Marker Level is equal to the Solver Level, simulate it.
NotEqual If the Marker Level is not equal to the Solver Level, simulate it.

With these, you can use each level for..

  1. An increasing amount of detail
  2. An increasing amount of reduction
  3. Something completely custom

With Equal and NotEqual operators, you can have some markers appear or disappear on particular levels, enabling endless combinations.

Roadmap

This should cover a majority of cases, but there are things you cannot yet do, but will be able to in the future.

  1. Capsule on one level, Mesh on another. For higher-resolution contacts.
  2. Dense hierarchy of controls at one level, sparse at another. For e.g. twist joints versus a simple 2-joint chain, or a densely packed spine versus just hip and torso controls.


Algorithm

For the geeks out there, here's what the underlying algorithm looks like in Python.

# Membership types
Minimum = 1  # Present at this level and higher
Maximum = 3  # Present at this level and lower
Only = 4     # Only present at this level
Not = 5      # Present at all levels *except* this one

markers = [
    {"name": "hip", "level": 0, "membership": Minimum},
    {"name": "spine", "level": 0, "membership": Minimum},
    {"name": "neck", "level": 0, "membership": Minimum},
    {"name": "head", "level": 0, "membership": Minimum},
    {"name": "L_upper_leg", "level": 0, "membership": Minimum},
    {"name": "L_lower_leg", "level": 0, "membership": Minimum},
    {"name": "R_hand", "level": 1, "membership": Minimum},
    {"name": "L_foot_box", "level": 1, "membership": Maximum},
    {"name": "L_foot_convex", "level": 2, "membership": Minimum},
    {"name": "R_toe_capsule", "level": 2, "membership": Not},
    {"name": "R_toe_convex", "level": 2, "membership": Only},
]

def resolve(level):
    print("Level %d" % level)
    for marker in markers:
        if marker["membership"] == Minimum and marker["level"] <= level:
            print(" - {name} ({level})".format(**marker))

        if marker["membership"] == Maximum and marker["level"] >= level:
            print(" - {name} ({level})".format(**marker))

        if marker["membership"] == Only and marker["level"] == level:
            print(" - {name} ({level})".format(**marker))

        if marker["membership"] == Not and marker["level"] != level:
            print(" - {name} ({level})".format(**marker))

resolve(0)
resolve(1)
resolve(2)

Run this, and this is what you'll find.

Level 0
 - hip (0)
 - spine (0)
 - neck (0)
 - head (0)
 - L_upper_leg (0)
 - L_lower_leg (0)
 - L_foot_box (1)
 - R_toe_capsule (2)
Level 1
 - hip (0)
 - spine (0)
 - neck (0)
 - head (0)
 - L_upper_leg (0)
 - L_lower_leg (0)
 - R_hand (1)
 - L_foot_box (1)
 - R_toe_capsule (2)
Level 2
 - hip (0)
 - spine (0)
 - neck (0)
 - head (0)
 - L_upper_leg (0)
 - L_lower_leg (0)
 - R_hand (1)
 - L_foot_convex (2)
 - R_toe_convex (2)


Markers API

With the retirement of the legacy Python API, a new Markers API is now available.

from maya import cmds
import ragdoll.api as rd

box = cmds.polyCube()

solver = rd.createSolver()
marker = rd.assignMarker(box[0], solver)

rd.recordPhysics()

The new export and import mechanic can be accessed from here too.

import ragdoll.api as rd
fname = r"c:\path\to\my_ragdoll.rag"

# Get everything out
rd.exportPhysics(fname)

# Remove everything
rd.deleteAllPhysics()

# Bring everything back
rd.reinterpretPhysics(fname)


Legacy API

The old Rigid API is still accessible under a new home.

from ragdoll.legacy import commands
commands.create_active_rigid()
commands.create_point_constraint()
# ...

But will be removed entirely soon, so do transition away from it ASAP.


Quality of Life

Make it more difficult to make mistakes with these new additions. 😊


Max Mass Ratio

With Density, there's a chance Markers get Ragdoll into a situation it does not like; namely that the difference between masses are too great.

Give me the technical details

As you wish. 🤓

Ragdoll doesn't like differences any greater than 10x, sometimes 100x, else it can fail or become unstable. For example, if the torso of your character has a mass of 100kg, and the foot Marker has a mass of 0.5kg, that's a ratio of 100/0.5 = 200x which is far greater than Ragdoll would like. As a result, the body would crush the foot which would be unable to properly hold the entire body up.

Up until now, the masses on all Markers have had a default value of 1kg. Meaning that regardless of the size of a Marker - be it the torso, the head or tip of a finger - it would always have a mass of 1.0. As a result, hands would typically end up far heavier than the rest of the body.

Before

Here's an example of the solver failing. There are three identical chains, the tip of the last one having a mass of 10,000. That's 10,000x greater then each link in the chain. As a result, Markers separate; that is incorrect.

After

If we limit the maximum ratio to just 1000x, we get the correct behavior. You can also see how it affected the other two chains. They now behave more similarly, because in order to ensure a mass ratio across the whole system, the mass of their tips need to be reduced as well.

The new Max Mass Ratio attribute protects against these situations, letting you give objects a suitable mass and only have to worry about which should weigh more, and which should weigh less. Ragdoll will balance everything out before passing it along to be simulated.

What are the consequences?

Sometimes, large mass ratios are what you want. For example, a heavy weight on a string tends to do quite well with ratios up to 1000x. But markers being crushed by another marker 1000x its weight tends to not do as well.

So the result is less of an effect at the extreme ratios.

In the Manipulator, you can preview the final mass used given the density and the ratio you specified.


DirectX

image

Look. Closely. Look. Closlier.

That's right! You've now got the option to use Ragdoll with Maya in DirectX viewport mode.


Truly Non-keyable

Some Ragdoll attributes are keyable, others are not. Which is which? Impossible to say. Until now!

On attempting to keyframe a non-keyable attribute, you'll now see an error message along with a visual cue things might not work out the way you expect. As opposed to happily setting that keyframe but then ignoring it once the simulation starts, like it used to.

A little quality of life for ya'!

Pro-tip for Riggers

There are at least 2 ways to prevent non-keyable attributes from being keyframed.

  1. MFnAttribute::setConnectable(false);
  2. MPxNode::legalConnection()

The former means you are also unable to make a control and connect it to multiple non-keyable attributes. Like if you wanted to control Mass of a series of markers from a single source, or the Overlap Group.

The latter on the other hand is more flexible. It allows Ragdoll to prevent connections to specific attributes or types of nodes, like animCurve nodes, which means animators won't be able to keyframe it but you'll still be able to build controls for it.

And that's exactly how it works.


Delta Drawing Bug

The worldspace deltas were drawn separate from the marker they affected, which could produce a jarring effect especially when the solver position had been offset.

Before

After

This has now been fixed.

More Performance

As an added bonus, we're now also doing 2 matrix multiplications less per frame, per marker. That kind of thing adds up quickly.


Shape Sync

If you play, pause and then change the Shape from Box to Capsule nothing happens. Because the shape, like many other attributes, can only be changed on the start frame.

But, when you later returned to the start frame, the shape would still not update. This has now been fixed.


Profiler View

Mostly meant to keep the development of Ragdoll fast and interactive, you can now spot where most time is spent via the built-in Maya Profiler.

Here's what one frame of this looks like; 5 ms to both simulate and render Ragdoll in the viewport.

image


Removed Attributes

These attributes were no longer relevant in the last release, but were still present in the Channel Editor. These have now been hidden and will no longer be saved with your file. A few weeks from now, they will be removed.

  • limitAutoOrient
  • limitType
  • limitAxis
  • limitOffsetX
  • limitOffsetY
  • limitOffsetZ
  • limitOffset
  • limitRotationX
  • limitRotationY
  • limitRotationZ
  • limitRotation


Mandarin Serial Number

It has come to my attention that the first thing every new user of Ragdoll sees is this dialog, with this message for a serial number.

And yet..

Nobody has said a thing! 🤣

Correction shout-out to @Rosaline for pointing this out just a few days ago!

image

According to my Mandarin-speaking friends, this is jibberish (or at least should be!) and is a result of badly translated Unicode to ASCII characters.

This has now been fixed!

image