[1184] [Request] anisotropic MaxAngle with offset
complete
naqtn
This is an idea for modifying (or expanding) "Limits" parameters of VRCPhysBone.
Presentation video
I made a video to explain this request visually. See this clip: https://drive.google.com/file/d/1BcMpgJEGXrwWPllx69oF83DfqoQAoNmv/view?usp=sharing
Previous request
Already we have another suggestion about MaxAngle: ["[1181]Separate Axis of Max Angle"]( https://vrchat.canny.io/open-beta/p/1181separate-axis-of-max-angle ). I agree that requirement and I also want such feature. But I think three pairs of angles for each axis (x,y,z) are not appropriate parameters for this issue.
The reason is:
- The motion of each single bone doesn't have three degrees of freedom. Except for stretching, bone's tail transform can move on the surface of a sphere around its parent transform (that is the bone's head transform). In other words, it has only two degrees of freedom.
- Two pairs of max angle defines rectangular area on the sphere surface. I guess it disturbs smooth movement of the bone at the corners. Actual velocity of bones will change quickly. (It is not differentiable in mathematics terms.)
Anisotropic MaxAngle
So I propose an idea of "anisotropic MaxAngle with offset".
PhysBone parameter
MaxAngle
limits each bone movement within that angle. Currently, MaxAngle
is isotropic. To make it anisotropic, let's introduce new parameter. I name it t
for now.This parameter changes limitation area:
- For an axis, max-angle is equal to original MaxAngle.
- For another orthogonal axis on the basement surface, tdecreases "effective" max-angle as a coefficient.
If
t =1.0
:- The basement of the cone is a circle.
- Effective max-angle is isotropic.
- This is equal to current implementation.
If
t < 1.0
:- The basement is like an ellipse.
- It is flattened as t decreases.
- Effective max-angle is anisotropic.
If
t = 0.0
:- The basement is like a line segment.
- It is like FreezeAxis = true
- (though I'm not sure actually it will give same runtime movement.)
Notes:
- I choose the value range of tfrom zero to one for applying animation curve.
- I think FreezeAxisAnglecan be also applied. (Though it's not "freeze".)
Offset by angle and ratio
As previous request "[1181] Max Angle Offset slider for PhysBones" appeals, we need offset feature. (currently that post is merged )
I think specifying in polar coordinates on the basement is appropriate in this situation rather than Euler angles on the bone. Since Euler angles leads "out of limited area" problem.
An
angle
and a ratio
specifies where the bone rest position is, viewing from limitation cone area. If we limit the value range of ratio
as [-1.0,+1.0]
, the rest position never goes away from the limitation area, even if you change MaxAngle
and/or t
.Note: There are some choices for the value ranges,
- angle: [0,360], ratio: [0.0,+1.0]
- angle: [-90,90], ratio: [-1.0,+1.0]
- angle: [0,360], ratio: [-1.0,+1.0]
- etc.
I prefer symmetrical one
angle: [-180,+180], ratio: [-1.0,+1.0]
Use case example: bones for a skirt
## The problem and the application of anisotropic MaxAngle
Imagine PhysBones moves a skirt. If you put bones like umbrella, basically the model moves very well.
Problematic action is, you may know, moving legs up a lot. Let's consider to add
VRCPhysBoneCollider
to thighs. But, unfortunately, actual behavior would be an unexpected one. Major problems are on the root bones of each chains. They don't move up (or front) but to aside.I guess this happens because of the pull force of PhysBone moves them to downside where the rest positions are. If we narrow
MaxAngle
to prevent from moving to aside too much, the bones simply go through thighs. If we reduce pull force, the skirt will be messy even if you're just standing.If we can use anisotropic
MaxAngle
, we can limit side rolling but keep free area to move up (or front).## Comparison to other methods
FreezeAxis
can also solve this problem in same way. Though the bones don't move when you walk sideways. It's not natural enough.Some people have used
Bound=Inside
colliders on Dynamic Bone for this issue. See https://yananann.hatenadiary.jp/entry/2018/11/17/195631 This is the reason "inside-colliders" post got many votes https://vrchat.canny.io/open-beta/p/1181-inside-colliders And now some people try to use Plane
colliders on PhysBones same way.Since these methods need one collider for each chain, it needs more calculation cost at runtime.
So I think anisotropic MaxAngle would be reasonable way.
Photo Viewer
View photos in a modal
Log In
Aev
marked this post as
complete
Implemented with expanded customization options involving angle limits!
Tupper - VRChat Head of Community
Although not a direct implementation of your proposal, the "polar" mode pretty closely matches the behavior you want here. Is it sufficient?
naqtn
Yes, the most important part of the issue is resolved.
There remains a difference. The "polar" mode defines rectangular area, while I propose rounding area. I'm still worried about this. But I don't have problematic particular case now.
So I don't mind if you close this post. If I find a problem about that, I'll open new Canny report.
Ruuubick - Designer
marked this post as
tracked
naqtn
Supplement image:
For instance, I expect this works like this if I apply it on bones for a skirt. For the bones around waist, I squash limitation area so that bones don't roll aside. For the bones near tail of chains, bones can move any direction so that they move naturally. (I assumed I can use animation curve to change the parameter gradually.)
Photo Viewer
View photos in a modal