VR4RoboticArm2/VR4RoboticArm/Library/PackageCache/com.meta.xr.sdk.movement/Runtime/Tracking/Scripts/HandDeformation.cs
IonutMocanu 48cccc22ad Main2
2025-09-08 11:13:29 +03:00

485 lines
25 KiB
C#

// Copyright (c) Meta Platforms, Inc. and affiliates.
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Meta.XR.Movement
{
/// <summary>
/// Used to try to maintain the same proportions in the fingers for both hands.
/// </summary>
[DefaultExecutionOrder(250)]
public class HandDeformation : MonoBehaviour
{
/// <summary>
/// Finger class used for deformation.
/// </summary>
[Serializable]
public class FingerInfo
{
/// <summary>
/// Main constructor.
/// </summary>
/// <param name="startTransform">Start transform for finger.</param>
/// <param name="endTransform">End transform for finger.</param>
/// <param name="endBoneId">Id of start bone.</param>
public FingerInfo(Transform startTransform, Transform endTransform,
OVRSkeleton.BoneId startBoneId, OVRSkeleton.BoneId endBoneId)
{
StartBoneTransform = startTransform;
EndBoneTransform = endTransform;
StartBoneId = startBoneId;
EndBoneId = endBoneId;
}
/// <summary>
/// The start bone transform.
/// </summary>
public Transform StartBoneTransform;
/// <summary>
/// The end bone transform.
/// </summary>
public Transform EndBoneTransform;
/// <summary>
/// The start transform bone id.
/// </summary>
public OVRSkeleton.BoneId StartBoneId;
/// <summary>
/// The end transform bone id.
/// </summary>
public OVRSkeleton.BoneId EndBoneId;
/// <summary>
/// The position offset based on local space to apply.
/// </summary>
public Vector3 EndPosOffset = Vector3.zero;
/// <summary>
/// The rotation offset to apply.
/// </summary>
public Quaternion EndRotOffset = Quaternion.identity;
private float _distance;
private const float _SNAP_THRESHOLD = 0.5f;
private Vector3 _direction;
private Vector3 _targetPos;
private Vector3 _currentPos;
/// <summary>
/// Updates the distance between the start and end bone transforms.
/// </summary>
public void UpdateDistance()
{
_distance = Vector3.Distance(StartBoneTransform.position, EndBoneTransform.position);
}
/// <summary>
/// Updates the direction from the start to the end bone transform.
/// </summary>
public void UpdateDirection()
{
Vector3 endPos = EndBoneTransform.position +
EndBoneTransform.right * EndPosOffset.x +
EndBoneTransform.up * EndPosOffset.y +
EndBoneTransform.forward * EndPosOffset.z;
_direction = (endPos - StartBoneTransform.position).normalized;
}
/// <summary>
/// Updates the end bone transform position with the direction and distance added to the
/// start bone transform position.
/// </summary>
/// <param name="useMoveTowards">True if we should move towards the target position.</param>
/// <param name="moveSpeed">The move towards speed.</param>
public void UpdateBonePosition(bool useMoveTowards, float moveSpeed)
{
_targetPos = StartBoneTransform.position + _direction * _distance;
if (Vector3.Distance(EndBoneTransform.position, _currentPos) >= _SNAP_THRESHOLD)
{
_currentPos = EndBoneTransform.position;
}
if (useMoveTowards)
{
_currentPos = Vector3.MoveTowards(_currentPos, _targetPos, Time.deltaTime * moveSpeed);
}
else
{
_currentPos = _targetPos;
}
EndBoneTransform.position = _currentPos;
}
/// <summary>
/// Update rotation based on offset relative to bind pose.
/// </summary>
public void UpdateRotationBasedOnOffset()
{
EndBoneTransform.rotation *= EndRotOffset;
}
}
/// <summary>
/// Finger offset class used for deformation.
/// </summary>
[Serializable]
public class FingerOffset
{
/// <summary>
/// The id of the finger to apply the offset to.
/// </summary>
[Tooltip(HandDeformationTooltips.FingerOffset.FingerId)]
public OVRSkeleton.BoneId FingerId;
/// <summary>
/// The finger position offset.
/// </summary>
[Tooltip(HandDeformationTooltips.FingerOffset.FingerPosOffset)]
public Vector3 FingerPosOffset;
/// <summary>
/// The finger rotation offset.
/// </summary>
[Tooltip(HandDeformationTooltips.FingerOffset.FingerRotOffset)]
public Vector3 FingerRotOffset;
}
/// <summary>
/// Custom skeleton to reference.
/// </summary>
[SerializeField]
[Tooltip(HandDeformationTooltips.CustomSkeleton)]
protected OVRCustomSkeleton _customSkeleton;
/// <summary>
/// If true, copy the finger offsets data into FingerInfo during every update.
/// </summary>
[SerializeField]
[Tooltip(HandDeformationTooltips.CopyFingerDataInUpdate)]
protected bool _copyFingerDataInUpdate;
/// <summary>
/// The array of finger offsets to be applied.
/// </summary>
[SerializeField]
[Tooltip(HandDeformationTooltips.FingerOffsets)]
protected FingerOffset[] _fingerOffsets;
private FingerInfo[] _fingers;
private bool _shouldUpdate = true;
/// <summary>
/// Initialize the finger offsets.
/// </summary>
protected void Awake()
{
List<FingerInfo> leftFingers = SetUpLeftHand();
List<FingerInfo> rightFingers = SetUpRightHand();
List<FingerInfo> allFingers = new List<FingerInfo>();
allFingers.AddRange(leftFingers);
allFingers.AddRange(rightFingers);
_fingers = allFingers.ToArray();
CopyFingerOffsetData();
foreach (var finger in _fingers)
{
finger.UpdateDistance();
}
}
private List<FingerInfo> SetUpLeftHand()
{
List<FingerInfo> fingers = new List<FingerInfo>();
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandWrist],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandThumbMetacarpal],
OVRSkeleton.BoneId.Body_LeftHandWrist, OVRSkeleton.BoneId.Body_LeftHandThumbMetacarpal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandThumbMetacarpal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandThumbProximal],
OVRSkeleton.BoneId.Body_LeftHandThumbMetacarpal, OVRSkeleton.BoneId.Body_LeftHandThumbProximal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandThumbProximal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandThumbDistal],
OVRSkeleton.BoneId.Body_LeftHandThumbProximal, OVRSkeleton.BoneId.Body_LeftHandThumbDistal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandThumbDistal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandThumbTip],
OVRSkeleton.BoneId.Body_LeftHandThumbDistal, OVRSkeleton.BoneId.Body_LeftHandThumbTip));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandWrist],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandIndexProximal],
OVRSkeleton.BoneId.Body_LeftHandWrist, OVRSkeleton.BoneId.Body_LeftHandIndexProximal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandIndexMetacarpal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandIndexProximal],
OVRSkeleton.BoneId.Body_LeftHandIndexMetacarpal, OVRSkeleton.BoneId.Body_LeftHandIndexProximal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandIndexProximal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandIndexIntermediate],
OVRSkeleton.BoneId.Body_LeftHandIndexProximal, OVRSkeleton.BoneId.Body_LeftHandIndexIntermediate));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandIndexIntermediate],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandIndexDistal],
OVRSkeleton.BoneId.Body_LeftHandIndexIntermediate, OVRSkeleton.BoneId.Body_LeftHandIndexDistal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandIndexDistal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandIndexTip],
OVRSkeleton.BoneId.Body_LeftHandIndexDistal, OVRSkeleton.BoneId.Body_LeftHandIndexTip));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandWrist],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandMiddleProximal],
OVRSkeleton.BoneId.Body_LeftHandWrist, OVRSkeleton.BoneId.Body_LeftHandMiddleProximal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandMiddleMetacarpal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandMiddleProximal],
OVRSkeleton.BoneId.Body_LeftHandMiddleMetacarpal, OVRSkeleton.BoneId.Body_LeftHandMiddleProximal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandMiddleProximal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandMiddleIntermediate],
OVRSkeleton.BoneId.Body_LeftHandMiddleProximal, OVRSkeleton.BoneId.Body_LeftHandMiddleIntermediate));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandMiddleIntermediate],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandMiddleDistal],
OVRSkeleton.BoneId.Body_LeftHandMiddleIntermediate, OVRSkeleton.BoneId.Body_LeftHandMiddleDistal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandMiddleDistal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandMiddleTip],
OVRSkeleton.BoneId.Body_LeftHandMiddleDistal, OVRSkeleton.BoneId.Body_LeftHandMiddleTip));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandWrist],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandRingProximal],
OVRSkeleton.BoneId.Body_LeftHandWrist, OVRSkeleton.BoneId.Body_LeftHandRingProximal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandRingMetacarpal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandRingProximal],
OVRSkeleton.BoneId.Body_LeftHandRingMetacarpal, OVRSkeleton.BoneId.Body_LeftHandRingProximal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandRingProximal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandRingIntermediate],
OVRSkeleton.BoneId.Body_LeftHandRingProximal, OVRSkeleton.BoneId.Body_LeftHandRingIntermediate));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandRingIntermediate],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandRingDistal],
OVRSkeleton.BoneId.Body_LeftHandRingIntermediate, OVRSkeleton.BoneId.Body_LeftHandRingDistal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandRingDistal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandRingTip],
OVRSkeleton.BoneId.Body_LeftHandRingDistal, OVRSkeleton.BoneId.Body_LeftHandRingTip));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandWrist],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandLittleMetacarpal],
OVRSkeleton.BoneId.Body_LeftHandWrist, OVRSkeleton.BoneId.Body_LeftHandLittleMetacarpal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandLittleMetacarpal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandLittleProximal],
OVRSkeleton.BoneId.Body_LeftHandLittleMetacarpal, OVRSkeleton.BoneId.Body_LeftHandLittleProximal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandLittleProximal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandLittleIntermediate],
OVRSkeleton.BoneId.Body_LeftHandLittleProximal, OVRSkeleton.BoneId.Body_LeftHandLittleIntermediate));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandLittleIntermediate],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandLittleDistal],
OVRSkeleton.BoneId.Body_LeftHandLittleIntermediate, OVRSkeleton.BoneId.Body_LeftHandLittleDistal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandLittleDistal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_LeftHandLittleTip],
OVRSkeleton.BoneId.Body_LeftHandLittleDistal, OVRSkeleton.BoneId.Body_LeftHandLittleTip));
for (int i = fingers.Count - 1; i >= 0; i--)
{
if (fingers[i].StartBoneTransform == null ||
fingers[i].EndBoneTransform == null)
{
fingers.RemoveAt(i);
}
}
return fingers;
}
private List<FingerInfo> SetUpRightHand()
{
List<FingerInfo> fingers = new List<FingerInfo>();
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandWrist],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandThumbMetacarpal],
OVRSkeleton.BoneId.Body_RightHandWrist, OVRSkeleton.BoneId.Body_RightHandThumbMetacarpal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandThumbMetacarpal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandThumbProximal],
OVRSkeleton.BoneId.Body_RightHandThumbMetacarpal, OVRSkeleton.BoneId.Body_RightHandThumbProximal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandThumbProximal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandThumbDistal],
OVRSkeleton.BoneId.Body_RightHandThumbProximal, OVRSkeleton.BoneId.Body_RightHandThumbDistal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandThumbDistal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandThumbTip],
OVRSkeleton.BoneId.Body_RightHandThumbDistal, OVRSkeleton.BoneId.Body_RightHandThumbTip));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandWrist],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandIndexProximal],
OVRSkeleton.BoneId.Body_RightHandWrist, OVRSkeleton.BoneId.Body_RightHandIndexProximal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandIndexMetacarpal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandIndexProximal],
OVRSkeleton.BoneId.Body_RightHandIndexMetacarpal, OVRSkeleton.BoneId.Body_RightHandIndexProximal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandIndexProximal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandIndexIntermediate],
OVRSkeleton.BoneId.Body_RightHandIndexProximal, OVRSkeleton.BoneId.Body_RightHandIndexIntermediate));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandIndexIntermediate],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandIndexDistal],
OVRSkeleton.BoneId.Body_RightHandIndexIntermediate, OVRSkeleton.BoneId.Body_RightHandIndexDistal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandIndexDistal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandIndexTip],
OVRSkeleton.BoneId.Body_RightHandIndexDistal, OVRSkeleton.BoneId.Body_RightHandIndexTip));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandWrist],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandMiddleProximal],
OVRSkeleton.BoneId.Body_RightHandWrist, OVRSkeleton.BoneId.Body_RightHandMiddleProximal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandMiddleMetacarpal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandMiddleProximal],
OVRSkeleton.BoneId.Body_RightHandMiddleMetacarpal, OVRSkeleton.BoneId.Body_RightHandMiddleProximal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandMiddleProximal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandMiddleIntermediate],
OVRSkeleton.BoneId.Body_RightHandMiddleProximal, OVRSkeleton.BoneId.Body_RightHandMiddleIntermediate));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandMiddleIntermediate],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandMiddleDistal],
OVRSkeleton.BoneId.Body_RightHandMiddleIntermediate, OVRSkeleton.BoneId.Body_RightHandMiddleDistal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandMiddleDistal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandMiddleTip],
OVRSkeleton.BoneId.Body_RightHandMiddleDistal, OVRSkeleton.BoneId.Body_RightHandMiddleTip));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandWrist],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandRingProximal],
OVRSkeleton.BoneId.Body_RightHandWrist, OVRSkeleton.BoneId.Body_RightHandRingProximal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandRingMetacarpal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandRingProximal],
OVRSkeleton.BoneId.Body_RightHandRingMetacarpal, OVRSkeleton.BoneId.Body_RightHandRingProximal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandRingProximal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandRingIntermediate],
OVRSkeleton.BoneId.Body_RightHandRingProximal, OVRSkeleton.BoneId.Body_RightHandRingIntermediate));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandRingIntermediate],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandRingDistal],
OVRSkeleton.BoneId.Body_RightHandRingIntermediate, OVRSkeleton.BoneId.Body_RightHandRingDistal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandRingDistal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandRingTip],
OVRSkeleton.BoneId.Body_RightHandRingDistal, OVRSkeleton.BoneId.Body_RightHandRingTip));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandWrist],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandLittleMetacarpal],
OVRSkeleton.BoneId.Body_RightHandWrist, OVRSkeleton.BoneId.Body_RightHandLittleMetacarpal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandLittleMetacarpal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandLittleProximal],
OVRSkeleton.BoneId.Body_RightHandLittleMetacarpal, OVRSkeleton.BoneId.Body_RightHandLittleProximal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandLittleProximal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandLittleIntermediate],
OVRSkeleton.BoneId.Body_RightHandLittleProximal, OVRSkeleton.BoneId.Body_RightHandLittleIntermediate));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandLittleIntermediate],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandLittleDistal],
OVRSkeleton.BoneId.Body_RightHandLittleIntermediate, OVRSkeleton.BoneId.Body_RightHandLittleDistal));
fingers.Add(new FingerInfo
(_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandLittleDistal],
_customSkeleton.CustomBones[(int)OVRSkeleton.BoneId.Body_RightHandLittleTip],
OVRSkeleton.BoneId.Body_RightHandLittleDistal, OVRSkeleton.BoneId.Body_RightHandLittleTip));
for (int i = fingers.Count - 1; i >= 0; i--)
{
if (fingers[i].StartBoneTransform == null ||
fingers[i].EndBoneTransform == null)
{
fingers.RemoveAt(i);
}
}
return fingers;
}
/// <summary>
/// Apply the finger offsets.
/// </summary>
protected void LateUpdate()
{
if (!_customSkeleton.IsInitialized)
{
return;
}
if (_customSkeleton.IsDataValid)
{
_shouldUpdate = true;
}
if (_shouldUpdate)
{
if (_copyFingerDataInUpdate)
{
CopyFingerOffsetData();
}
foreach (var finger in _fingers)
{
finger.UpdateDirection();
}
foreach (var finger in _fingers)
{
finger.UpdateRotationBasedOnOffset();
}
foreach (var finger in _fingers)
{
finger.UpdateBonePosition(false, 1.0f);
}
if (!_customSkeleton.IsDataValid)
{
_shouldUpdate = false;
}
}
}
private void CopyFingerOffsetData()
{
foreach (var fingerOffset in _fingerOffsets)
{
foreach (var finger in _fingers)
{
if (finger.EndBoneId == fingerOffset.FingerId)
{
finger.EndPosOffset = fingerOffset.FingerPosOffset;
finger.EndRotOffset = Quaternion.Euler(fingerOffset.FingerRotOffset);
}
}
}
}
}
}