LimitRange for additional values rotated by RagdollDynamics

Hi Marcus!

I am new to posting in the forum.

As you can see in the first half of the movie ( 01_before.mp4 ), I have changed the pose of the cloak by setting the key before running RecordSimulation.
Originally, the cloak was hanging straight down, but here the pose is changed in advance so that the cloak spreads out like a fan.
Then when I run RecordSimulation, the result changes depending on the LimitRangeX/Y/Z.
I have one thing I would like to discuss in this part.

The first half of the movie ( 01_before.mp4 ) shows the simulation results with LimitRangeX/Y/Z set to 0.0 and the second half of the movie with LimitRangeX/Y/Z set to 10.0.

When LimitRangeX/Y/Z is set to 0.0, there is no limit, so the animation starts from the pre-set fan pose.
However, when LimitRangeX/Y/Z is set to 10.0, the animation is limited to only about 10 degrees, including the pre-defined fan pose.

Therefore, I would like to leave the pre-defined fan pose as it is and only limit the movement by RagdollDynamics.
I have prepared a movie for reference. ( 02_after.mp4 )

In this way, it is easy to adjust only the movement of RagdollDynamics while keeping the original pose and animation.
I consider this an effective means of correcting interference between meshes and adjusting silhouettes in advance.

Can this be done with the current RagdollDynamics?

01_before.mp4

02_after.mp4

Hi @julien-Nadler! Welcome to the forums! :partying_face:

It looks like the animated pose is starting outside of the limit. Would it be possible to share a screenshot of the top joint and their limit? It should become visible when selecting the joint, or in the Limit Mode of the Manipulator.

When you first assign a Marker, Ragdoll will assume your joints are at the center of their limit. So value of Limit X = 10 would mean 5 degrees in both the positive and negative direction. However, as your animation changes, the joints will no longer be at the center of the limit. If you want to change the center, you can use the Reset Constraint Frames command.

For example:

Assign Markers, notice how they start at the center of their limit.

Change the animation, they now start outside of their limit, meaning Ragdoll will snap them towards their allowed range.

Next, re-center your limits to where your animation is currently starting using the Reset Constraint Frames command.

Let me know if this helps!

Hi @marcus !

Thanks for replying to my post.

Would it be possible to share a screenshot of the top joint and their limits?

I have attached a screenshot.

If you want to change the center, you can use the Reset Constraint Frames command.

Excellent.
Indeed, using the Reset Constraint Frames command, I was able to make the center of the joint the center of the limit.

However, I would like you to watch one video here.

In this video, the same key is set at frames -25 and 50.
If I use the Reset Constraint Frames command on the first frame in this situation, there is no problem.
But when I set a different key on an additional 60 frames, the original animation itself is also limited because it is out of the center of the limit.

Is there a best way to prevent the 60 frame key from being limited in this situation?

I think what you mean is that you want the cape to be limited by 10 degrees in every axis, except at frame 60. Unfortunately this is not possible, as limits - and their constraint frames - cannot be animated. The limits are meant to represent anatomical limits, such as how far your knee can bend or your shoulders move, and those kinds of limits do not change during animation.

Perhaps if we take a step back and consider the final result you are looking, maybe we can find an alternative solution to limits. Am I understanding it correctly that you are trying to prevent the cape from folding in on itself too much? That you want it to be very rigid? Have you tried increasing the Rotate Stiffness and decreasing the Rotate Damping? It’s safe to try values such as…

  • Rotate Stiffness = 1000
  • Rotate Damping = 0.001

This should make them very rigid. If you need more rigidity still, you can also increase the Substeps on the solver to e.g. 12 or 16. The next thing you can try is increasing the size of the shapes, even though it may not produce the collisions you are after. At least to try and get the right motion.

Another option is to use less Markers in the simulation. For example, if the cape consisted of only 3 Markers per chain, they would be much more rigid, much less able to bend.

Hi @marcus !

I certainly understand that LimitRange is an anatomical limitation.
However, I thought that my very poor English was misleading you.
I am sorry.

For LimitRange, what I am thinking is that I want to maintain the original animation that I had created before RecordSimulation.
By maintain, I mean not reflect the movement limitations of LimitRange.
It is the same for -25 frames, 50 frames, 60 frames, etc.

And we want LimitRange to be applied only to the difference between the original animation and the one moved by RagdollDynamics.

I do not want to animate LimitRange or Rest Constraint Frames.
I would be happy if these restrictions only applied to the animation of the difference.

Unfortunately this is not possible, as limits - and their constraint frames - cannot be animated.

However, after reading this sentence of yours, I am wondering if it is impossible.

Aha, that is interesting. You want the simulation to never stray further than e.g. 10 degrees from the input animation. This is not possible at the moment, and is unlikely to be possible in the future. The constraint frame would need to be animated to follow the input animation, which may be possible, but even if it did then the limits would be applying forces to your character to steer it back into range. For animation to move unrealistically or causes intersections with other objects, those forces could not be enough.

I think you can achieve what you want using the Maya native limits; in each transform Attribute Editor there are a “Limits” section that should give you this result. They would be applied on-top of any keyframes to effectively clamp the XYZ rotate values. I have little faith it will look great but I will try and put together a reproducible for you tomorrow. Although it is possible that even these limits are absolute and not relative just like Ragdoll’s.

Hi @marcus !

I will try and put together a reproducible for you tomorrow.

Thank you very much!
Perhaps it is difficult, but I am eagerly awaiting your test results.

Here’s what I had in mind, however it will not be enough. These values are also relative a single starting value and will not update based on your animation.

I expect your best option is to run a script after recording to compare the original animation to the animation on the new animation layer and clamp any value that is greater than the value you would like to maintain.

For example, on frame 20 the animated arm.rotateX=50, but the simulated arm.rotateX=80. Their difference is 30, so you would clamp that to arm.rotateX=60. You’d do this on every frame, for every control and channel until you end up with either a modified animation layer or a new one.

This falls outside of the scope of Ragdoll however so I won’t be able to help solve it on this end.