Highlight for this release is Complex Geometry!
- ADDED Environment Static polygonal geometry for collisions
- ADDED Automatic Mesh Islands Ain’t got no time to slice?
- ADDED Soft Joints More natural ragdolls with some softness inbetween limbs
- ADDED Forum 2.0 Same old forum. New and improved!
- ADDED Subscriptions Monthly licencing, now available
- ADDED Licence Conservation Lease only the licences you actively use
- ADDED Select with the Manipulator Selecting Markers got a bit easier
- ADDED Reset Shape Return to simpler days
- ADDED Group API The group mechanic was added to the public API
- FIXED Multiple Manipulators Two or more solvers no longer breaks the Manipulator
- FIXED Lease Licence in UI Now you can actually use that Lease button
- REMOVED Legacy Legacy files still open and run, but can no longer be authored.
Before we get into the new features of this release, let’s have a look back at some highlights of the week.
For the Love of Ragdoll
Animation by Kevin Taylor, model by Shaun Keenan.
Dragon Setup Livestream
The dragon from the latest livestream last Friday!
A little experiment with worldspace rotation stiffness.
Soft joints for some belly-jiggle.
Nice self-walking rhino.
Self Walking Manikin
Same trick, different character.
Jason experimenting with the new Soft Joints feature.
Getting some nice secondary motion out of moving the head and jaw around!
Ragdoll now supports static environments; meaning environments that cannot move or deform, but allow for normal polygonal geometry without the need for a simplified “convex hull”.
As you might expect, this works well for environments like terrain and other complex geometry that is otherwise hard to turn into a rounded mesh.
Normal shapes are limited in how complex they can get, and as such you never really run into a situation where the shape noticeably affects performance.
Triangle meshes are different; they can be of any complexity. Up to millions of polygons and beyond. So it falls upon you to decide where to make the performance/quality tradeoff!
|Vertex Count||Cooking Time||Run-time performance|
|400||0.39 ms||685 fps|
|8’000||3.51 ms||599 fps|
|16’000||14.3 ms||594 fps|
|64’000||61.5 ms||327 fps|
|256’000||287.7 ms||40 fps|
|1’000’000||1490 ms||2 fps|
What is cooking time?
The time it takes for Ragdoll to convert your polygonal geometry into the internal representation needed for collision detection. It involves splitting up the mesh into areas or “zones” for faster lookup.
This only happens when the mesh actively changes and when first opening the Maya scene, and won’t affect playback speed.
Ragdoll needs “convex” meshes for anything that moves.
What is a convex mesh?
Think of it like a shrink-wrapped version of your mesh.
In 2D, it might look something like this.
Notice how the points in the middle are excluded? This is an optimal shape for collision detection, as you can draw a straight line from anywhere in the world and know that if it ever hits this shape, it hits it in only 1 spot.
In the previous release, “Mesh Islands” were introduced to turn each separate polygonal island into its own convex hull and glued together as one complex shape.
With that, you have a great deal of control over the final collision shape
Extract Facesbox, and zero out those values to get Maya to perform an actual split in the geometry as you cut. Otherwise, it will only insert new edge-loops and not actually create two separate meshes.
It did, however, mean that you had to take the time to manually slice up the mesh, which may not always be feasible. This release introduces an automatic method of slicing up a given mesh, into a close approximation of the original mesh.
There are a number of parameters to tune when generating your convex hulls, here’s what they mean.
||The number of “voxels” to generate from a given volume; the greater the number the more accurate the resulting representation. At the expense of time. Values between 100-1000 are normally sufficient.|
||The maximum allowed different in angle across the surface of the resulting meshes. It might be thought of as “roundness”.|
||Slices are made either horizontally and vertically, or radially. This value controls how much to favour the former.|
||And this value controls how much to favour the latter|
||Ignore computed volumes that are smaller than this. It can help reduce the number of very tiny meshes.|
||How many separate meshes to make. This will depend on the complexity of your mesh, but generally the lower the better.|
||Performance related, lower values take longer|
||Also perforamnce related, lower values take longer|
||Various ways to deal with geometry that isn’t a closed volume. A sphere for example is a closed volume, whereas a plane is not.|
||Performance related, faster when ticked.|
||See what the generated meshes look like before they are “shrink-wrapped” back onto your model. These give you a good sense of how large the voxel resolution is.|
Over time, as we learn more about which parameters work best in the most general case, I’d like to reduce the number of attributes here. Ideally we would only have a
The process of automatically slicing your geometry is not real-time, it can take up to a few seconds or more. On the upside, it only ever happens when the mesh changes and does not affect playback performance.
Here are some timings for the meshes in the below simulation.
Faster performance is on the map
This method is new to us, and we expect to find faster - ideally real-time - alternatives to this in the future.
To balance out the talk of complex but hard geometry, let’s talk about “soft joints”.
Once I set
Translate Motion = Soft and the feet hits the ground, notice how:
- [x] The spine is compressed
- [x] The legs are compressed
- [x] The arms are extended
Here’s a more extreme example.
We’re calling it “soft joints” when in reality this is
Pose Stiffness but for translation rather than rotation. Which means you could use it for tentacles and other appendages that depend on not just rotating limbs but squishy and compressed limbs. Potentially stretchy limbs and spines too?
We haven’t yet explored this fully, so take it for a spin and let us know what you come up with.
When stiffness goes too low, limbs detach.
This is unintended behaviour and will be addressed in a future release. Proper breakable constraints are on the map, but this isn’t it. So use with caution, and limit it to create softness between your limbs.
The forum has gotten a face-lift! This will henceforth be where tutorials and showcases appear, along with notifications for new releases!
So sign up, subscribe to the
News category to receive notifications when things happen in Ragdoll-land!
Out of beta and available to all.
If you need a more low-cost but commercial introduction to Ragdoll in your studio, then this is for you.
You can now make groups via the API.
from maya import cmds from ragdoll import api solver = api.createSolver() ground = api.createGround(solver) group = api.createGroup(solver) sphere, _ = cmds.polySphere() cmds.move(0, 10, 0) marker = api.assignMarker(sphere, group) cmds.evalDeferred(cmds.play)
assignMarker command has also been simplified and does not longer implicitly create a group.
A few more things to make your day that much more bright.
You can now use the Manipulator to select both the Marker and Maya node, such that attributes can be edited in the Channel Box.
Using the manipulator via the Ragdoll menu enabled you to also benefit from the
F key, to fit your selection to the current camera.
But if a Marker or Group was selected and editable in the Channel Box, that no longer worked. Because under the hood, what you were really fitting in view was the solver shape node.
This has now been fixed such that you can fit any selected Marker, regardless of whether the solver shape node is selected or not!
The Manipulator can now be used to select Markers during playback.
!!! info “Caveat”
Selection is based on the current simulated state and doesn’t understand rewind. To fix this, step at least 1 frame forward whenever you attempt to select, to ensure the selection and simulation is staying in sync.
This will be addressed in a future release.
Whenever you assign a Marker, a default shape is computed based on your selection and available geometry or NURBS curves.
Likewise, when you branched off into a tree-like structure for your markers, you could easily end up with something like this.
This has now been addressed, whereby the marker which forms a fork now being reset automatically.
This feature only applies to Floating Licence customers.
In the previous release, a licence was leased on plug-in load.
The problem was that, sometimes, an artist merely opens a scene with Ragdoll in it. Maya will determine that this file requires the Ragdoll plug-in to be loaded, and loads it. Upon load, Ragdoll would go ahead and check out a licence. But this artist doesn’t necessarily want to interact with Ragdoll, it could have been a texture artist opening up an animator’s scene, or someone rendering it.
This release introduces “licence conservation” which only tries to lease a licence upon a simulation taking place. That means a lease is not made on plug-in load, nor on scene open. If a solver is hidden from view, nor does it take place on playback start.
Only once simulation visibly begins is a lease requested, helping you save those precious seats for the artists that need it most.
Markers are still rendered in the viewport on the start frame for everyone, without a lease. The Solver is automatically hidden upon failure to lease a licence, pausing any further requests until it is made visible again.
Inbetween this release and the previous release there were a few minor releases made.
- Fix crash on fit-to-view
- Fix crash on replaced mesh with 0 vertices
- Hide prototype world and local attributes on the
Request Leasebutton in the Ragdoll UI now actually works
The menu items for the old Legacy interface to Ragdoll Dynamics has now been removed. Scenes created with this interface will still open, so this is your last chance to save your work and transition to the current Marker-based workflow.