mirror of
https://github.com/hanetzer/sdraw_mods_cvr.git
synced 2025-09-03 18:39:23 +00:00
Improved fingers binding
Mechanim filtering
This commit is contained in:
parent
5bec2fcdb1
commit
00c92e1913
19 changed files with 557 additions and 239 deletions
|
@ -9,14 +9,27 @@ namespace ml_bft
|
|||
{
|
||||
class FingerSystem
|
||||
{
|
||||
enum PlaneType
|
||||
{
|
||||
OXZ,
|
||||
OYX
|
||||
}
|
||||
|
||||
struct RotationOffset
|
||||
{
|
||||
public Transform m_target;
|
||||
public Transform m_source;
|
||||
public Quaternion m_offset;
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
m_source = null;
|
||||
m_target = null;
|
||||
m_offset = Quaternion.identity;
|
||||
}
|
||||
}
|
||||
|
||||
static readonly List<HumanBodyBones> ms_leftFingerBones = new List<HumanBodyBones>()
|
||||
static readonly HumanBodyBones[] ms_leftFingerBones =
|
||||
{
|
||||
HumanBodyBones.LeftThumbProximal, HumanBodyBones.LeftThumbIntermediate, HumanBodyBones.LeftThumbDistal,
|
||||
HumanBodyBones.LeftIndexProximal, HumanBodyBones.LeftIndexIntermediate, HumanBodyBones.LeftIndexDistal,
|
||||
|
@ -24,7 +37,7 @@ namespace ml_bft
|
|||
HumanBodyBones.LeftRingProximal, HumanBodyBones.LeftRingIntermediate, HumanBodyBones.LeftRingDistal,
|
||||
HumanBodyBones.LeftLittleProximal, HumanBodyBones.LeftLittleIntermediate, HumanBodyBones.LeftLittleDistal
|
||||
};
|
||||
static readonly List<HumanBodyBones> ms_rightFingerBones = new List<HumanBodyBones>()
|
||||
static readonly HumanBodyBones[] ms_rightFingerBones =
|
||||
{
|
||||
HumanBodyBones.RightThumbProximal, HumanBodyBones.RightThumbIntermediate, HumanBodyBones.RightThumbDistal,
|
||||
HumanBodyBones.RightIndexProximal, HumanBodyBones.RightIndexIntermediate, HumanBodyBones.RightIndexDistal,
|
||||
|
@ -32,6 +45,19 @@ namespace ml_bft
|
|||
HumanBodyBones.RightRingProximal, HumanBodyBones.RightRingIntermediate, HumanBodyBones.RightRingDistal,
|
||||
HumanBodyBones.RightLittleProximal, HumanBodyBones.RightLittleIntermediate, HumanBodyBones.RightLittleDistal
|
||||
};
|
||||
static readonly (HumanBodyBones, HumanBodyBones, bool)[] ms_rotationFixChains =
|
||||
{
|
||||
(HumanBodyBones.LeftThumbProximal,HumanBodyBones.LeftThumbIntermediate,true), (HumanBodyBones.LeftThumbIntermediate, HumanBodyBones.LeftThumbDistal,true),
|
||||
(HumanBodyBones.LeftIndexProximal,HumanBodyBones.LeftIndexIntermediate,true), (HumanBodyBones.LeftIndexIntermediate, HumanBodyBones.LeftIndexDistal,true),
|
||||
(HumanBodyBones.LeftMiddleProximal,HumanBodyBones.LeftMiddleIntermediate,true), (HumanBodyBones.LeftMiddleIntermediate, HumanBodyBones.LeftMiddleDistal,true),
|
||||
(HumanBodyBones.LeftRingProximal,HumanBodyBones.LeftRingIntermediate,true), (HumanBodyBones.LeftRingIntermediate, HumanBodyBones.LeftRingDistal,true),
|
||||
(HumanBodyBones.LeftLittleProximal,HumanBodyBones.LeftLittleIntermediate,true), (HumanBodyBones.LeftLittleIntermediate, HumanBodyBones.LeftLittleDistal,true),
|
||||
(HumanBodyBones.RightThumbProximal,HumanBodyBones.RightThumbIntermediate,false), (HumanBodyBones.RightThumbIntermediate, HumanBodyBones.RightThumbDistal,false),
|
||||
(HumanBodyBones.RightIndexProximal,HumanBodyBones.RightIndexIntermediate,false), (HumanBodyBones.RightIndexIntermediate, HumanBodyBones.RightIndexDistal,false),
|
||||
(HumanBodyBones.RightMiddleProximal,HumanBodyBones.RightMiddleIntermediate,false), (HumanBodyBones.RightMiddleIntermediate, HumanBodyBones.RightMiddleDistal,false),
|
||||
(HumanBodyBones.RightRingProximal,HumanBodyBones.RightRingIntermediate,false), (HumanBodyBones.RightRingIntermediate, HumanBodyBones.RightRingDistal,false),
|
||||
(HumanBodyBones.RightLittleProximal,HumanBodyBones.RightLittleIntermediate,false), (HumanBodyBones.RightLittleIntermediate, HumanBodyBones.RightLittleDistal,false)
|
||||
};
|
||||
|
||||
public static FingerSystem Instance { get; private set; } = null;
|
||||
|
||||
|
@ -71,22 +97,43 @@ namespace ml_bft
|
|||
if(PlayerSetup.Instance._animator.isHuman)
|
||||
{
|
||||
Utils.SetAvatarTPose();
|
||||
InputHandler.Instance?.Rebind(PlayerSetup.Instance.transform.rotation);
|
||||
InputHandler.Instance.Rebind(PlayerSetup.Instance.transform.rotation);
|
||||
|
||||
// Try to "fix" rotations of fingers
|
||||
foreach(var l_tuple in ms_rotationFixChains)
|
||||
{
|
||||
ReorientateTowards(
|
||||
PlayerSetup.Instance._animator.GetBoneTransform(l_tuple.Item1),
|
||||
PlayerSetup.Instance._animator.GetBoneTransform(l_tuple.Item2),
|
||||
InputHandler.Instance.GetSourceForBone(l_tuple.Item1, l_tuple.Item3),
|
||||
InputHandler.Instance.GetSourceForBone(l_tuple.Item2, l_tuple.Item3),
|
||||
PlaneType.OXZ
|
||||
);
|
||||
ReorientateTowards(
|
||||
PlayerSetup.Instance._animator.GetBoneTransform(l_tuple.Item1),
|
||||
PlayerSetup.Instance._animator.GetBoneTransform(l_tuple.Item2),
|
||||
InputHandler.Instance.GetSourceForBone(l_tuple.Item1, l_tuple.Item3),
|
||||
InputHandler.Instance.GetSourceForBone(l_tuple.Item2, l_tuple.Item3),
|
||||
PlaneType.OYX
|
||||
);
|
||||
}
|
||||
|
||||
// Bind hands
|
||||
m_leftHandOffset.m_source = PlayerSetup.Instance._animator.GetBoneTransform(HumanBodyBones.LeftHand);
|
||||
m_leftHandOffset.m_target = InputHandler.Instance?.GetSourceForBone(HumanBodyBones.LeftHand, true);
|
||||
m_leftHandOffset.m_target = InputHandler.Instance.GetSourceForBone(HumanBodyBones.LeftHand, true);
|
||||
if((m_leftHandOffset.m_source != null) && (m_leftHandOffset.m_target != null))
|
||||
m_leftHandOffset.m_offset = Quaternion.Inverse(m_leftHandOffset.m_source.rotation) * m_leftHandOffset.m_target.rotation;
|
||||
|
||||
m_rightHandOffset.m_source = PlayerSetup.Instance._animator.GetBoneTransform(HumanBodyBones.RightHand);
|
||||
m_rightHandOffset.m_target = InputHandler.Instance?.GetSourceForBone(HumanBodyBones.RightHand, false);
|
||||
m_rightHandOffset.m_target = InputHandler.Instance.GetSourceForBone(HumanBodyBones.RightHand, false);
|
||||
if((m_rightHandOffset.m_source != null) && (m_rightHandOffset.m_target != null))
|
||||
m_rightHandOffset.m_offset = Quaternion.Inverse(m_rightHandOffset.m_source.rotation) * m_rightHandOffset.m_target.rotation;
|
||||
|
||||
// Bind fingers
|
||||
foreach(HumanBodyBones p_bone in ms_leftFingerBones)
|
||||
{
|
||||
Transform l_avatarBone = PlayerSetup.Instance._animator.GetBoneTransform(p_bone);
|
||||
Transform l_controllerBone = InputHandler.Instance?.GetSourceForBone(p_bone, true);
|
||||
Transform l_controllerBone = InputHandler.Instance.GetSourceForBone(p_bone, true);
|
||||
if((l_avatarBone != null) && (l_controllerBone != null))
|
||||
{
|
||||
RotationOffset l_offset = new RotationOffset();
|
||||
|
@ -96,11 +143,10 @@ namespace ml_bft
|
|||
m_leftFingerOffsets.Add(l_offset);
|
||||
}
|
||||
}
|
||||
|
||||
foreach(HumanBodyBones p_bone in ms_rightFingerBones)
|
||||
{
|
||||
Transform l_avatarBone = PlayerSetup.Instance._animator.GetBoneTransform(p_bone);
|
||||
Transform l_controllerBone = InputHandler.Instance?.GetSourceForBone(p_bone, false);
|
||||
Transform l_controllerBone = InputHandler.Instance.GetSourceForBone(p_bone, false);
|
||||
if((l_avatarBone != null) && (l_controllerBone != null))
|
||||
{
|
||||
RotationOffset l_offset = new RotationOffset();
|
||||
|
@ -119,6 +165,10 @@ namespace ml_bft
|
|||
{
|
||||
m_ready = false;
|
||||
m_pose = new HumanPose();
|
||||
|
||||
m_leftHandOffset.Reset();
|
||||
m_rightHandOffset.Reset();
|
||||
|
||||
m_leftFingerOffsets.Clear();
|
||||
m_rightFingerOffsets.Clear();
|
||||
}
|
||||
|
@ -199,5 +249,49 @@ namespace ml_bft
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ReorientateTowards(Transform p_target, Transform p_targetEnd, Transform p_source, Transform p_sourceEnd, PlaneType p_plane)
|
||||
{
|
||||
if((p_target != null) && (p_targetEnd != null) && (p_source != null) && (p_sourceEnd != null))
|
||||
{
|
||||
Quaternion l_playerInv = Quaternion.Inverse(PlayerSetup.Instance.transform.rotation);
|
||||
Vector3 l_targetDir = l_playerInv * (p_targetEnd.position - p_target.position);
|
||||
Vector3 l_sourceDir = l_playerInv * (p_sourceEnd.position - p_source.position);
|
||||
switch(p_plane)
|
||||
{
|
||||
case PlaneType.OXZ:
|
||||
l_targetDir.y = 0f;
|
||||
l_sourceDir.y = 0f;
|
||||
break;
|
||||
case PlaneType.OYX:
|
||||
l_targetDir.z = 0f;
|
||||
l_sourceDir.z = 0f;
|
||||
break;
|
||||
}
|
||||
l_targetDir = Vector3.Normalize(l_targetDir);
|
||||
l_sourceDir = Vector3.Normalize(l_sourceDir);
|
||||
|
||||
Quaternion l_targetRot = Quaternion.identity;
|
||||
Quaternion l_sourceRot = Quaternion.identity;
|
||||
switch(p_plane)
|
||||
{
|
||||
case PlaneType.OXZ:
|
||||
l_targetRot = Quaternion.LookRotation(l_targetDir, Vector3.up);
|
||||
l_sourceRot = Quaternion.LookRotation(l_sourceDir, Vector3.up);
|
||||
break;
|
||||
case PlaneType.OYX:
|
||||
l_targetRot = Quaternion.LookRotation(l_targetDir, Vector3.forward);
|
||||
l_sourceRot = Quaternion.LookRotation(l_sourceDir, Vector3.forward);
|
||||
break;
|
||||
}
|
||||
|
||||
Quaternion l_diff = Quaternion.Inverse(l_targetRot) * l_sourceRot;
|
||||
if(p_plane == PlaneType.OYX)
|
||||
l_diff = Quaternion.Euler(0f, 0f, l_diff.eulerAngles.y);
|
||||
|
||||
Quaternion l_adjusted = l_diff * (l_playerInv * p_target.rotation);
|
||||
p_target.rotation = PlayerSetup.Instance.transform.rotation * l_adjusted;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@ namespace ml_bft
|
|||
m_bones.Clear();
|
||||
m_localRotations.Clear();
|
||||
m_renderers.Clear();
|
||||
|
||||
|
||||
Settings.ShowHandsChange -= this.OnShowHandsChange;
|
||||
}
|
||||
|
||||
|
|
|
@ -110,121 +110,113 @@ namespace ml_bft
|
|||
public override Transform GetSourceForBone(HumanBodyBones p_bone)
|
||||
{
|
||||
Transform l_result = null;
|
||||
if(m_left)
|
||||
switch(p_bone)
|
||||
{
|
||||
switch(p_bone)
|
||||
{
|
||||
case HumanBodyBones.LeftHand:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.wrist];
|
||||
break;
|
||||
case HumanBodyBones.LeftThumbProximal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.thumbProximal];
|
||||
break;
|
||||
case HumanBodyBones.LeftThumbIntermediate:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.thumbMiddle];
|
||||
break;
|
||||
case HumanBodyBones.LeftThumbDistal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.thumbDistal];
|
||||
break;
|
||||
case HumanBodyBones.LeftHand:
|
||||
l_result = (m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.wrist] : null);
|
||||
break;
|
||||
case HumanBodyBones.LeftThumbProximal:
|
||||
l_result = (m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.thumbProximal] : null);
|
||||
break;
|
||||
case HumanBodyBones.LeftThumbIntermediate:
|
||||
l_result = (m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.thumbMiddle] : null);
|
||||
break;
|
||||
case HumanBodyBones.LeftThumbDistal:
|
||||
l_result = (m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.thumbDistal] : null);
|
||||
break;
|
||||
|
||||
case HumanBodyBones.LeftIndexProximal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.indexProximal];
|
||||
break;
|
||||
case HumanBodyBones.LeftIndexIntermediate:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.indexMiddle];
|
||||
break;
|
||||
case HumanBodyBones.LeftIndexDistal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.indexDistal];
|
||||
break;
|
||||
case HumanBodyBones.LeftIndexProximal:
|
||||
l_result = (m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.indexProximal] : null);
|
||||
break;
|
||||
case HumanBodyBones.LeftIndexIntermediate:
|
||||
l_result = (m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.indexMiddle] : null);
|
||||
break;
|
||||
case HumanBodyBones.LeftIndexDistal:
|
||||
l_result = (m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.indexDistal] : null);
|
||||
break;
|
||||
|
||||
case HumanBodyBones.LeftMiddleProximal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.middleProximal];
|
||||
break;
|
||||
case HumanBodyBones.LeftMiddleIntermediate:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.middleMiddle];
|
||||
break;
|
||||
case HumanBodyBones.LeftMiddleDistal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.middleDistal];
|
||||
break;
|
||||
case HumanBodyBones.LeftMiddleProximal:
|
||||
l_result = (m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.middleProximal] : null);
|
||||
break;
|
||||
case HumanBodyBones.LeftMiddleIntermediate:
|
||||
l_result = (m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.middleMiddle] : null);
|
||||
break;
|
||||
case HumanBodyBones.LeftMiddleDistal:
|
||||
l_result = (m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.middleDistal] : null);
|
||||
break;
|
||||
|
||||
case HumanBodyBones.LeftRingProximal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.ringProximal];
|
||||
break;
|
||||
case HumanBodyBones.LeftRingIntermediate:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.ringMiddle];
|
||||
break;
|
||||
case HumanBodyBones.LeftRingDistal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.ringDistal];
|
||||
break;
|
||||
case HumanBodyBones.LeftRingProximal:
|
||||
l_result = (m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.ringProximal] : null);
|
||||
break;
|
||||
case HumanBodyBones.LeftRingIntermediate:
|
||||
l_result = (m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.ringMiddle] : null);
|
||||
break;
|
||||
case HumanBodyBones.LeftRingDistal:
|
||||
l_result = (m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.ringDistal] : null);
|
||||
break;
|
||||
|
||||
case HumanBodyBones.LeftLittleProximal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.pinkyProximal];
|
||||
break;
|
||||
case HumanBodyBones.LeftLittleIntermediate:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.pinkyMiddle];
|
||||
break;
|
||||
case HumanBodyBones.LeftLittleDistal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.pinkyDistal];
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch(p_bone)
|
||||
{
|
||||
case HumanBodyBones.RightHand:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.wrist];
|
||||
break;
|
||||
case HumanBodyBones.RightThumbProximal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.thumbProximal];
|
||||
break;
|
||||
case HumanBodyBones.RightThumbIntermediate:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.thumbMiddle];
|
||||
break;
|
||||
case HumanBodyBones.RightThumbDistal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.thumbDistal];
|
||||
break;
|
||||
case HumanBodyBones.LeftLittleProximal:
|
||||
l_result = (m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.pinkyProximal] : null);
|
||||
break;
|
||||
case HumanBodyBones.LeftLittleIntermediate:
|
||||
l_result = (m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.pinkyMiddle] : null);
|
||||
break;
|
||||
case HumanBodyBones.LeftLittleDistal:
|
||||
l_result = (m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.pinkyDistal] : null);
|
||||
break;
|
||||
|
||||
case HumanBodyBones.RightIndexProximal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.indexProximal];
|
||||
break;
|
||||
case HumanBodyBones.RightIndexIntermediate:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.indexMiddle];
|
||||
break;
|
||||
case HumanBodyBones.RightIndexDistal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.indexDistal];
|
||||
break;
|
||||
case HumanBodyBones.RightHand:
|
||||
l_result = (!m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.wrist] : null);
|
||||
break;
|
||||
case HumanBodyBones.RightThumbProximal:
|
||||
l_result = (!m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.thumbProximal] : null);
|
||||
break;
|
||||
case HumanBodyBones.RightThumbIntermediate:
|
||||
l_result = (!m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.thumbMiddle] : null);
|
||||
break;
|
||||
case HumanBodyBones.RightThumbDistal:
|
||||
l_result = (!m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.thumbDistal] : null);
|
||||
break;
|
||||
|
||||
case HumanBodyBones.RightMiddleProximal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.middleProximal];
|
||||
break;
|
||||
case HumanBodyBones.RightMiddleIntermediate:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.middleMiddle];
|
||||
break;
|
||||
case HumanBodyBones.RightMiddleDistal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.middleDistal];
|
||||
break;
|
||||
case HumanBodyBones.RightIndexProximal:
|
||||
l_result = (!m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.indexProximal] : null);
|
||||
break;
|
||||
case HumanBodyBones.RightIndexIntermediate:
|
||||
l_result = (!m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.indexMiddle] : null);
|
||||
break;
|
||||
case HumanBodyBones.RightIndexDistal:
|
||||
l_result = (!m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.indexDistal] : null);
|
||||
break;
|
||||
|
||||
case HumanBodyBones.RightRingProximal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.ringProximal];
|
||||
break;
|
||||
case HumanBodyBones.RightRingIntermediate:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.ringMiddle];
|
||||
break;
|
||||
case HumanBodyBones.RightRingDistal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.ringDistal];
|
||||
break;
|
||||
case HumanBodyBones.RightMiddleProximal:
|
||||
l_result = (!m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.middleProximal] : null);
|
||||
break;
|
||||
case HumanBodyBones.RightMiddleIntermediate:
|
||||
l_result = (!m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.middleMiddle] : null);
|
||||
break;
|
||||
case HumanBodyBones.RightMiddleDistal:
|
||||
l_result = (!m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.middleDistal] : null);
|
||||
break;
|
||||
|
||||
case HumanBodyBones.RightLittleProximal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.pinkyProximal];
|
||||
break;
|
||||
case HumanBodyBones.RightLittleIntermediate:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.pinkyMiddle];
|
||||
break;
|
||||
case HumanBodyBones.RightLittleDistal:
|
||||
l_result = m_bones[(int)SteamVR_Skeleton_JointIndexEnum.pinkyDistal];
|
||||
break;
|
||||
}
|
||||
case HumanBodyBones.RightRingProximal:
|
||||
l_result = (!m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.ringProximal] : null);
|
||||
break;
|
||||
case HumanBodyBones.RightRingIntermediate:
|
||||
l_result = (!m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.ringMiddle] : null);
|
||||
break;
|
||||
case HumanBodyBones.RightRingDistal:
|
||||
l_result = (!m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.ringDistal] : null);
|
||||
break;
|
||||
|
||||
case HumanBodyBones.RightLittleProximal:
|
||||
l_result = (!m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.pinkyProximal] : null);
|
||||
break;
|
||||
case HumanBodyBones.RightLittleIntermediate:
|
||||
l_result = (!m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.pinkyMiddle] : null);
|
||||
break;
|
||||
case HumanBodyBones.RightLittleDistal:
|
||||
l_result = (!m_left ? m_bones[(int)SteamVR_Skeleton_JointIndexEnum.pinkyDistal] : null);
|
||||
break;
|
||||
}
|
||||
return l_result;
|
||||
}
|
||||
|
|
|
@ -200,13 +200,13 @@ namespace ml_bft
|
|||
l_tracking.GetHandJoints(m_left ? HandTrackingFeature.Hand_Index.L : HandTrackingFeature.Hand_Index.R, out var l_positions, out var l_rotations, out _);
|
||||
if(l_positions.Length >= c_fingerBonesCount)
|
||||
{
|
||||
// Joints rotations are in global space, locations are in local space ... wth is wrong with OpenXR?
|
||||
// Joints rotations are in global space, locations are in ... space??? ... wth is wrong with OpenXR?
|
||||
Quaternion l_prefabRot = m_prefabRoot.rotation;
|
||||
for(int i = 0; i < c_fingerBonesCount; i++)
|
||||
{
|
||||
if(m_bones[i] != null)
|
||||
{
|
||||
m_bones[i].localPosition = l_positions[i];
|
||||
//m_bones[i].localPosition = l_positions[i];
|
||||
m_bones[i].rotation = l_prefabRot * (l_handInv * l_rotations[i]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
[assembly: MelonLoader.MelonInfo(typeof(ml_bft.BetterFingersTracking), "BetterFingersTracking", "1.0.0", "SDraw", "https://github.com/SDraw/ml_mods_cvr")]
|
||||
[assembly: MelonLoader.MelonInfo(typeof(ml_bft.BetterFingersTracking), "BetterFingersTracking", "1.0.1", "SDraw", "https://github.com/SDraw/ml_mods_cvr")]
|
||||
[assembly: MelonLoader.MelonGame(null, "ChilloutVR")]
|
||||
[assembly: MelonLoader.MelonPlatform(MelonLoader.MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)]
|
||||
[assembly: MelonLoader.MelonPlatformDomain(MelonLoader.MelonPlatformDomainAttribute.CompatibleDomains.MONO)]
|
||||
|
|
|
@ -10,7 +10,7 @@ Mod that overhauls behaviour of fingers tracking.
|
|||
Available mod's settings in `Settings - Input & Key-Bindings - Better Fingers Tracking`:
|
||||
* **Force SteamVR skeletal input:** forced usage of SteamVR skeletal input (works as long as controllers' driver supplies skeletal pose throught OpenVR interfaces); `false` by default
|
||||
* **Motion range:** fingers tracking motion range/mode/type; `With controller` by default
|
||||
* **Filter humanoid limits:** Limits fingers rotations to be valid for Unity's Mechanim; `false` by default
|
||||
* **Filter humanoid limits:** Limits fingers rotations to be valid for Unity's Mechanim; `true` by default
|
||||
* Note: Enabling this option ensures that visual representation of your fingers will be same for you and remote players, but it cancels out additional finger segments rotations that can be better visually in most cases.
|
||||
* **Show hands model:** shows transparent hands model (mostly as debug option); `false` by default
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ namespace ml_bft
|
|||
public static bool SkeletalInput { get; private set; } = false;
|
||||
public static MotionRangeType MotionRange { get; private set; } = MotionRangeType.WithController;
|
||||
public static bool ShowHands { get; private set; } = false;
|
||||
public static bool MechanimFilter { get; private set; } = false;
|
||||
public static bool MechanimFilter { get; private set; } = true;
|
||||
|
||||
static MelonLoader.MelonPreferences_Category ms_category = null;
|
||||
static List<MelonLoader.MelonPreferences_Entry> ms_entries = null;
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
<Authors>SDraw</Authors>
|
||||
<Company>None</Company>
|
||||
<Product>BetterFingersTracking</Product>
|
||||
<Version>1.0.1</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<div class ="row-wrapper">
|
||||
<div class ="option-caption">Filter humanoid limits: </div>
|
||||
<div class ="option-input">
|
||||
<div id="MechanimFilter" class ="inp_toggle no-scroll" data-current="false"></div>
|
||||
<div id="MechanimFilter" class ="inp_toggle no-scroll" data-current="true"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue