Skip to content

Commit 6b670cc

Browse files
committed
more IK work
1 parent 740c643 commit 6b670cc

5 files changed

Lines changed: 422 additions & 67 deletions

File tree

Basis/Packages/com.basis.framework/BasisUI/BasisSettingsDefaults.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,6 +1007,23 @@ public static bool IsRoleEnabledForCalibration(BasisBoneTrackedRole role)
10071007
// bend gets extra angle proportional to head pitch-down. 0 = constant 5°; positive = more
10081008
// bend when looking at the floor, less (down to zero) when looking up.
10091009
public static BasisSettingsBinding<float> FBIKLordosisPitchGainDeg = new("fbiklordosispitchgaindeg", new BasisPlatformDefault<float>(8f));
1010+
// Cervical lordosis shaping (see ApplyCervicalLordosis): neutral-pose base bend + neck/upperChest
1011+
// split, head pitch clamp, and the extreme-look window that drives extra spine roll plus
1012+
// hips/chest counter-translation. Horizontal/Down maxima are in meters. Only used when
1013+
// Cervical Lordosis (Anatomy) is on.
1014+
public static BasisSettingsBinding<float> FBIKLordosisBaseDeg = new("fbiklordosisbasedeg", new BasisPlatformDefault<float>(5f));
1015+
public static BasisSettingsBinding<float> FBIKLordosisNeckShare = new("fbiklordosisneckshare", new BasisPlatformDefault<float>(0.65f));
1016+
public static BasisSettingsBinding<float> FBIKLordosisMaxHeadPitchDeg = new("fbiklordosismaxheadpitchdeg", new BasisPlatformDefault<float>(80f));
1017+
public static BasisSettingsBinding<float> FBIKLordosisExtremeStartDeg = new("fbiklordosisextremestartdeg", new BasisPlatformDefault<float>(50f));
1018+
public static BasisSettingsBinding<float> FBIKLordosisExtremeFullDeg = new("fbiklordosisextremefulldeg", new BasisPlatformDefault<float>(80f));
1019+
public static BasisSettingsBinding<float> FBIKLordosisExtremeRollForwardMaxDeg = new("fbiklordosisextremerollforwardmaxdeg", new BasisPlatformDefault<float>(10f));
1020+
public static BasisSettingsBinding<float> FBIKLordosisExtremeRollBackwardMaxDeg = new("fbiklordosisextremerollbackwardmaxdeg", new BasisPlatformDefault<float>(4f));
1021+
public static BasisSettingsBinding<float> FBIKLordosisExtremeHipsHorizontalMax = new("fbiklordosisextremehipshorizontalmax", new BasisPlatformDefault<float>(0.025f));
1022+
public static BasisSettingsBinding<float> FBIKLordosisExtremeChestHorizontalMax = new("fbiklordosisextremechesthorizontalmax", new BasisPlatformDefault<float>(0.04f));
1023+
public static BasisSettingsBinding<float> FBIKLordosisExtremeHipsDownMax = new("fbiklordosisextremehipsdownmax", new BasisPlatformDefault<float>(0.015f));
1024+
public static BasisSettingsBinding<float> FBIKLordosisExtremeChestDownMax = new("fbiklordosisextremechestdownmax", new BasisPlatformDefault<float>(0.025f));
1025+
public static BasisSettingsBinding<float> FBIKLordosisExtremeHipsDownLookUp = new("fbiklordosisextremehipsdownlookup", new BasisPlatformDefault<float>(0.0005f));
1026+
public static BasisSettingsBinding<float> FBIKLordosisExtremeChestDownLookUp = new("fbiklordosisextremechestdownlookup", new BasisPlatformDefault<float>(0.001f));
10101027

10111028
// ---------------- VIRTUAL SPINE (no torso tracker) ----------------
10121029
// Per-axis cascade fractions of head-relative pitch/roll that the synthesized chest and
@@ -1573,6 +1590,19 @@ public static void LoadAll()
15731590
FBIKAnatCervicalLordosis.LoadBindingValue();
15741591
FBIKAnatPelvicTwistRouting.LoadBindingValue();
15751592
FBIKLordosisPitchGainDeg.LoadBindingValue();
1593+
FBIKLordosisBaseDeg.LoadBindingValue();
1594+
FBIKLordosisNeckShare.LoadBindingValue();
1595+
FBIKLordosisMaxHeadPitchDeg.LoadBindingValue();
1596+
FBIKLordosisExtremeStartDeg.LoadBindingValue();
1597+
FBIKLordosisExtremeFullDeg.LoadBindingValue();
1598+
FBIKLordosisExtremeRollForwardMaxDeg.LoadBindingValue();
1599+
FBIKLordosisExtremeRollBackwardMaxDeg.LoadBindingValue();
1600+
FBIKLordosisExtremeHipsHorizontalMax.LoadBindingValue();
1601+
FBIKLordosisExtremeChestHorizontalMax.LoadBindingValue();
1602+
FBIKLordosisExtremeHipsDownMax.LoadBindingValue();
1603+
FBIKLordosisExtremeChestDownMax.LoadBindingValue();
1604+
FBIKLordosisExtremeHipsDownLookUp.LoadBindingValue();
1605+
FBIKLordosisExtremeChestDownLookUp.LoadBindingValue();
15761606
VSpineChestPitchFrac.LoadBindingValue();
15771607
VSpineChestRollFrac.LoadBindingValue();
15781608
VSpineSpinePitchFrac.LoadBindingValue();

Basis/Packages/com.basis.framework/BasisUI/Localization/Languages/en.json

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3022,6 +3022,110 @@
30223022
"key": "settings.bodyTracking.lordosisPitchGain.description",
30233023
"value": "Extra cervical bend at full head-down on top of the 5° base. 0 = constant 5° lordosis; positive scales with how far the head is looking down. Only used when Cervical Lordosis (Anatomy) is on. Default: 8"
30243024
},
3025+
{
3026+
"key": "settings.bodyTracking.lordosisBase.title",
3027+
"value": "Lordosis Base Bend (deg)"
3028+
},
3029+
{
3030+
"key": "settings.bodyTracking.lordosisBase.description",
3031+
"value": "Forward cervical bend held in a neutral, level-head pose, before pitch coupling is added. Only used when Cervical Lordosis (Anatomy) is on. Default: 5"
3032+
},
3033+
{
3034+
"key": "settings.bodyTracking.lordosisNeckShare.title",
3035+
"value": "Lordosis Neck Share"
3036+
},
3037+
{
3038+
"key": "settings.bodyTracking.lordosisNeckShare.description",
3039+
"value": "Fraction of the lordosis bend applied at the neck rather than the upperChest, when an upperChest bone exists. 1 = all neck. Default: 0.65"
3040+
},
3041+
{
3042+
"key": "settings.bodyTracking.lordosisMaxHeadPitch.title",
3043+
"value": "Lordosis Max Head Pitch (deg)"
3044+
},
3045+
{
3046+
"key": "settings.bodyTracking.lordosisMaxHeadPitch.description",
3047+
"value": "Clamp on head pitch up/down before the lordosis solve, so a steeply pitched head can't drive the neck past anatomical limits. Default: 80"
3048+
},
3049+
{
3050+
"key": "settings.bodyTracking.lordosisExtremeStart.title",
3051+
"value": "Lordosis Extreme Onset (deg)"
3052+
},
3053+
{
3054+
"key": "settings.bodyTracking.lordosisExtremeStart.description",
3055+
"value": "Head pitch magnitude at which the extreme-look response (extra spine roll plus hips/chest shift) begins ramping in. Default: 50"
3056+
},
3057+
{
3058+
"key": "settings.bodyTracking.lordosisExtremeFull.title",
3059+
"value": "Lordosis Extreme Full (deg)"
3060+
},
3061+
{
3062+
"key": "settings.bodyTracking.lordosisExtremeFull.description",
3063+
"value": "Head pitch magnitude at which the extreme-look response reaches full strength. Should sit above the onset value. Default: 80"
3064+
},
3065+
{
3066+
"key": "settings.bodyTracking.lordosisExtremeRollForward.title",
3067+
"value": "Lordosis Extreme Roll Forward (deg)"
3068+
},
3069+
{
3070+
"key": "settings.bodyTracking.lordosisExtremeRollForward.description",
3071+
"value": "Maximum extra spine roll added at full extreme look-down. Default: 10"
3072+
},
3073+
{
3074+
"key": "settings.bodyTracking.lordosisExtremeRollBackward.title",
3075+
"value": "Lordosis Extreme Roll Backward (deg)"
3076+
},
3077+
{
3078+
"key": "settings.bodyTracking.lordosisExtremeRollBackward.description",
3079+
"value": "Maximum extra spine roll added at full extreme look-up. Default: 4"
3080+
},
3081+
{
3082+
"key": "settings.bodyTracking.lordosisExtremeHipsHoriz.title",
3083+
"value": "Lordosis Extreme Hips Shift (m)"
3084+
},
3085+
{
3086+
"key": "settings.bodyTracking.lordosisExtremeHipsHoriz.description",
3087+
"value": "Maximum horizontal hips counter-shift at full extreme look, in meters. Default: 0.025"
3088+
},
3089+
{
3090+
"key": "settings.bodyTracking.lordosisExtremeChestHoriz.title",
3091+
"value": "Lordosis Extreme Chest Shift (m)"
3092+
},
3093+
{
3094+
"key": "settings.bodyTracking.lordosisExtremeChestHoriz.description",
3095+
"value": "Maximum horizontal chest counter-shift at full extreme look, in meters. Default: 0.04"
3096+
},
3097+
{
3098+
"key": "settings.bodyTracking.lordosisExtremeHipsDown.title",
3099+
"value": "Lordosis Extreme Hips Drop (m)"
3100+
},
3101+
{
3102+
"key": "settings.bodyTracking.lordosisExtremeHipsDown.description",
3103+
"value": "Maximum downward hips shift at full look-down, in meters. Default: 0.015"
3104+
},
3105+
{
3106+
"key": "settings.bodyTracking.lordosisExtremeChestDown.title",
3107+
"value": "Lordosis Extreme Chest Drop (m)"
3108+
},
3109+
{
3110+
"key": "settings.bodyTracking.lordosisExtremeChestDown.description",
3111+
"value": "Maximum downward chest shift at full look-down, in meters. Default: 0.025"
3112+
},
3113+
{
3114+
"key": "settings.bodyTracking.lordosisExtremeHipsDownLookUp.title",
3115+
"value": "Lordosis Extreme Hips Drop, Look-Up (m)"
3116+
},
3117+
{
3118+
"key": "settings.bodyTracking.lordosisExtremeHipsDownLookUp.description",
3119+
"value": "Downward hips shift at full look-up, in meters; much smaller than the look-down drop. Default: 0.0005"
3120+
},
3121+
{
3122+
"key": "settings.bodyTracking.lordosisExtremeChestDownLookUp.title",
3123+
"value": "Lordosis Extreme Chest Drop, Look-Up (m)"
3124+
},
3125+
{
3126+
"key": "settings.bodyTracking.lordosisExtremeChestDownLookUp.description",
3127+
"value": "Downward chest shift at full look-up, in meters; much smaller than the look-down drop. Default: 0.001"
3128+
},
30253129
{
30263130
"key": "settings.bodyTracking.section.virtualSpine.title",
30273131
"value": "Virtual Spine (no torso tracker)"

Basis/Packages/com.basis.framework/BasisUI/Menus/Main Menu Providers/SettingsProviderParts/SettingsProviderIK.cs

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,97 @@ public static PanelTabPage IKTab(PanelTabGroup tabGroup)
506506
BasisSettingsDefaults.FBIKLordosisPitchGainDeg);
507507
if (lordosisPitchGain != null)
508508
lordosisPitchGain.Descriptor.SetDescription(BasisLocalization.Get("settings.bodyTracking.lordosisPitchGain.description"));
509+
510+
var lordosisBase = PanelSlider.CreateAndBind(
511+
dynamicsParent,
512+
PanelSlider.SliderSettings.Advanced(BasisLocalization.Get("settings.bodyTracking.lordosisBase.title"), 0f, 15f, false, 1, ValueDisplayMode.Raw),
513+
BasisSettingsDefaults.FBIKLordosisBaseDeg);
514+
if (lordosisBase != null)
515+
lordosisBase.Descriptor.SetDescription(BasisLocalization.Get("settings.bodyTracking.lordosisBase.description"));
516+
517+
var lordosisNeckShare = PanelSlider.CreateAndBind(
518+
dynamicsParent,
519+
PanelSlider.SliderSettings.Advanced(BasisLocalization.Get("settings.bodyTracking.lordosisNeckShare.title"), 0f, 1f, false, 2, ValueDisplayMode.Raw),
520+
BasisSettingsDefaults.FBIKLordosisNeckShare);
521+
if (lordosisNeckShare != null)
522+
lordosisNeckShare.Descriptor.SetDescription(BasisLocalization.Get("settings.bodyTracking.lordosisNeckShare.description"));
523+
524+
var lordosisMaxHeadPitch = PanelSlider.CreateAndBind(
525+
dynamicsParent,
526+
PanelSlider.SliderSettings.Advanced(BasisLocalization.Get("settings.bodyTracking.lordosisMaxHeadPitch.title"), 0f, 90f, false, 0, ValueDisplayMode.Raw),
527+
BasisSettingsDefaults.FBIKLordosisMaxHeadPitchDeg);
528+
if (lordosisMaxHeadPitch != null)
529+
lordosisMaxHeadPitch.Descriptor.SetDescription(BasisLocalization.Get("settings.bodyTracking.lordosisMaxHeadPitch.description"));
530+
531+
var lordosisExtremeStart = PanelSlider.CreateAndBind(
532+
dynamicsParent,
533+
PanelSlider.SliderSettings.Advanced(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeStart.title"), 0f, 90f, false, 0, ValueDisplayMode.Raw),
534+
BasisSettingsDefaults.FBIKLordosisExtremeStartDeg);
535+
if (lordosisExtremeStart != null)
536+
lordosisExtremeStart.Descriptor.SetDescription(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeStart.description"));
537+
538+
var lordosisExtremeFull = PanelSlider.CreateAndBind(
539+
dynamicsParent,
540+
PanelSlider.SliderSettings.Advanced(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeFull.title"), 0f, 90f, false, 0, ValueDisplayMode.Raw),
541+
BasisSettingsDefaults.FBIKLordosisExtremeFullDeg);
542+
if (lordosisExtremeFull != null)
543+
lordosisExtremeFull.Descriptor.SetDescription(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeFull.description"));
544+
545+
var lordosisExtremeRollFwd = PanelSlider.CreateAndBind(
546+
dynamicsParent,
547+
PanelSlider.SliderSettings.Advanced(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeRollForward.title"), 0f, 30f, false, 1, ValueDisplayMode.Raw),
548+
BasisSettingsDefaults.FBIKLordosisExtremeRollForwardMaxDeg);
549+
if (lordosisExtremeRollFwd != null)
550+
lordosisExtremeRollFwd.Descriptor.SetDescription(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeRollForward.description"));
551+
552+
var lordosisExtremeRollBack = PanelSlider.CreateAndBind(
553+
dynamicsParent,
554+
PanelSlider.SliderSettings.Advanced(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeRollBackward.title"), 0f, 30f, false, 1, ValueDisplayMode.Raw),
555+
BasisSettingsDefaults.FBIKLordosisExtremeRollBackwardMaxDeg);
556+
if (lordosisExtremeRollBack != null)
557+
lordosisExtremeRollBack.Descriptor.SetDescription(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeRollBackward.description"));
558+
559+
var lordosisExtremeHipsHoriz = PanelSlider.CreateAndBind(
560+
dynamicsParent,
561+
PanelSlider.SliderSettings.Advanced(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeHipsHoriz.title"), 0f, 0.1f, false, 3, ValueDisplayMode.Raw),
562+
BasisSettingsDefaults.FBIKLordosisExtremeHipsHorizontalMax);
563+
if (lordosisExtremeHipsHoriz != null)
564+
lordosisExtremeHipsHoriz.Descriptor.SetDescription(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeHipsHoriz.description"));
565+
566+
var lordosisExtremeChestHoriz = PanelSlider.CreateAndBind(
567+
dynamicsParent,
568+
PanelSlider.SliderSettings.Advanced(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeChestHoriz.title"), 0f, 0.1f, false, 3, ValueDisplayMode.Raw),
569+
BasisSettingsDefaults.FBIKLordosisExtremeChestHorizontalMax);
570+
if (lordosisExtremeChestHoriz != null)
571+
lordosisExtremeChestHoriz.Descriptor.SetDescription(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeChestHoriz.description"));
572+
573+
var lordosisExtremeHipsDown = PanelSlider.CreateAndBind(
574+
dynamicsParent,
575+
PanelSlider.SliderSettings.Advanced(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeHipsDown.title"), 0f, 0.1f, false, 3, ValueDisplayMode.Raw),
576+
BasisSettingsDefaults.FBIKLordosisExtremeHipsDownMax);
577+
if (lordosisExtremeHipsDown != null)
578+
lordosisExtremeHipsDown.Descriptor.SetDescription(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeHipsDown.description"));
579+
580+
var lordosisExtremeChestDown = PanelSlider.CreateAndBind(
581+
dynamicsParent,
582+
PanelSlider.SliderSettings.Advanced(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeChestDown.title"), 0f, 0.1f, false, 3, ValueDisplayMode.Raw),
583+
BasisSettingsDefaults.FBIKLordosisExtremeChestDownMax);
584+
if (lordosisExtremeChestDown != null)
585+
lordosisExtremeChestDown.Descriptor.SetDescription(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeChestDown.description"));
586+
587+
var lordosisExtremeHipsDownLookUp = PanelSlider.CreateAndBind(
588+
dynamicsParent,
589+
PanelSlider.SliderSettings.Advanced(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeHipsDownLookUp.title"), 0f, 0.01f, false, 4, ValueDisplayMode.Raw),
590+
BasisSettingsDefaults.FBIKLordosisExtremeHipsDownLookUp);
591+
if (lordosisExtremeHipsDownLookUp != null)
592+
lordosisExtremeHipsDownLookUp.Descriptor.SetDescription(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeHipsDownLookUp.description"));
593+
594+
var lordosisExtremeChestDownLookUp = PanelSlider.CreateAndBind(
595+
dynamicsParent,
596+
PanelSlider.SliderSettings.Advanced(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeChestDownLookUp.title"), 0f, 0.01f, false, 4, ValueDisplayMode.Raw),
597+
BasisSettingsDefaults.FBIKLordosisExtremeChestDownLookUp);
598+
if (lordosisExtremeChestDownLookUp != null)
599+
lordosisExtremeChestDownLookUp.Descriptor.SetDescription(BasisLocalization.Get("settings.bodyTracking.lordosisExtremeChestDownLookUp.description"));
509600
});
510601

511602
// ============== Virtual Spine (no torso tracker) ==============
@@ -833,6 +924,19 @@ private static void ResetIkDefaults()
833924
BasisSettingsDefaults.FBIKChestSpringHz.ResetToDefault();
834925
BasisSettingsDefaults.FBIKChestSpringDamping.ResetToDefault();
835926
BasisSettingsDefaults.FBIKLordosisPitchGainDeg.ResetToDefault();
927+
BasisSettingsDefaults.FBIKLordosisBaseDeg.ResetToDefault();
928+
BasisSettingsDefaults.FBIKLordosisNeckShare.ResetToDefault();
929+
BasisSettingsDefaults.FBIKLordosisMaxHeadPitchDeg.ResetToDefault();
930+
BasisSettingsDefaults.FBIKLordosisExtremeStartDeg.ResetToDefault();
931+
BasisSettingsDefaults.FBIKLordosisExtremeFullDeg.ResetToDefault();
932+
BasisSettingsDefaults.FBIKLordosisExtremeRollForwardMaxDeg.ResetToDefault();
933+
BasisSettingsDefaults.FBIKLordosisExtremeRollBackwardMaxDeg.ResetToDefault();
934+
BasisSettingsDefaults.FBIKLordosisExtremeHipsHorizontalMax.ResetToDefault();
935+
BasisSettingsDefaults.FBIKLordosisExtremeChestHorizontalMax.ResetToDefault();
936+
BasisSettingsDefaults.FBIKLordosisExtremeHipsDownMax.ResetToDefault();
937+
BasisSettingsDefaults.FBIKLordosisExtremeChestDownMax.ResetToDefault();
938+
BasisSettingsDefaults.FBIKLordosisExtremeHipsDownLookUp.ResetToDefault();
939+
BasisSettingsDefaults.FBIKLordosisExtremeChestDownLookUp.ResetToDefault();
836940
BasisSettingsDefaults.VSpineChestPitchFrac.ResetToDefault();
837941
BasisSettingsDefaults.VSpineChestRollFrac.ResetToDefault();
838942
BasisSettingsDefaults.VSpineSpinePitchFrac.ResetToDefault();

0 commit comments

Comments
 (0)