Files
VR-WuKong/Packages/PICO Unity Integration SDK-3.3.2-20251111/Runtime/Scripts/Hand/PXR_HandPoseConfig.cs
2025-11-13 17:40:28 +08:00

276 lines
7.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#if !PICO_OPENXR_SDK
/*******************************************************************************
Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved.
NOTICEAll information contained herein is, and remains the property of
PICO Technology Co., Ltd. The intellectual and technical concepts
contained herein are proprietary to PICO Technology Co., Ltd. and may be
covered by patents, patents in process, and are protected by trade secret or
copyright law. Dissemination of this information or reproduction of this
material is strictly forbidden unless prior written permission is obtained from
PICO Technology Co., Ltd.
*******************************************************************************/
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Unity.XR.PXR
{
[Serializable]
public class PXR_HandPoseConfig : ScriptableObject
{
[DisplayOnly]
public ShapesRecognizer shapesRecognizer;
[DisplayOnly]
public BonesRecognizer bonesRecognizer;
[DisplayOnly]
public TransRecognizer transRecognizer;
}
[Serializable]
public class ShapesRecognizer
{
public Finger thumb = new Finger(HandFinger.Thumb);
public Finger index = new Finger(HandFinger.Index);
public Finger middle = new Finger(HandFinger.Middle);
public Finger ring = new Finger(HandFinger.Ring);
public Finger pinky = new Finger(HandFinger.Pinky);
public float holdDuration = 0.09f;
[Serializable]
public class Finger
{
[HideInInspector]
public HandFinger handFinger;
public Flexion flexion;
public Curl curl;
public Abduction abduction;
public FingerConfigs fingerConfigs;
public Finger(HandFinger finger)
{
handFinger = finger;
flexion = Flexion.Any;
curl = Curl.Any;
abduction = Abduction.Any;
fingerConfigs = new FingerConfigs(finger);
}
}
[Serializable]
public class FingerConfigs
{
public RangeConfigs flexionConfigs;
public RangeConfigs curlConfigs;
public RangeConfigsAbduction abductionConfigs;
public FingerConfigs(HandFinger finger)
{
flexionConfigs = new RangeConfigs(flexionMin, flexionMax, defaultFlexionWidth);
if (finger == HandFinger.Thumb)
{
curlConfigs = new RangeConfigs(curlThumbMin, curlThumbMax, defaultCurlWidth);
abductionConfigs = new RangeConfigsAbduction(abductionThumbMid, abductionThumbWidth);
}
else
{
curlConfigs = new RangeConfigs(curlMin, curlMax, defaultCurlWidth);
abductionConfigs = new RangeConfigsAbduction(abductionMid, abductionWidth);
}
}
}
public enum ShapeType
{
flexion,
curl,
abduction
}
public enum Flexion
{
Any,
Open,
Close,
//Custom
}
public enum Curl
{
Any,
Open,
Close,
//Custom
}
public enum Abduction
{
Any,
Open,
Close,
}
[Serializable]
public class RangeConfigs
{
public float min;
public float max;
public float width;
public RangeConfigs(float n, float m, float w)
{
min = n;
max = m;
width =w;
}
}
[Serializable]
public class RangeConfigsAbduction
{
public float mid;
public float width;
public RangeConfigsAbduction(float m, float w)
{
mid = m;
width = w;
}
}
public const float defaultFlexionWidth = 10f;
public const float flexionThumbOpenMin = 155f;
public const float flexionThumbOpenMax = 180f;
public const float flexionThumbCloseMin = 90f;
public const float flexionThumbCloseMax = 120f;
public const float flexionOpenMin = 144f;
public const float flexionOpenMax = 180f;
public const float flexionCloseMin = 90f;
public const float flexionCloseMax = 126f;
public const float flexionMin = 90f;
public const float flexionMax = 180f;
public const float defaultCurlWidth = 20f;
public const float curlThumbOpenMin = 90f;
public const float curlThumbOpenMax = 180f;
public const float curlThumbCloseMin = 45f;
public const float curlThumbCloseMax = 90f;
public const float curlThumbMin = 45f;
public const float curlThumbMax = 180f;
public const float curlOpenMin = 107f;
public const float curlOpenMax = 180f;
public const float curlCloseMin = 0f;
public const float curlCloseMax = 73f;
public const float curlMin = 0f;
public const float curlMax = 180f;
public const float abductionThumbMid = 13f;
public const float abductionThumbWidth = 6f;
public const float abductionMid = 10f;
public const float abductionWidth = 6f;
public const float abductionMin = 0f;
public const float abductionMax = 90f;
}
[Serializable]
public class BonesRecognizer
{
public List<BonesGroup> Bones = new List<BonesGroup>();
public float holdDuration = 0.022f;
[Serializable]
public class BonesGroup
{
[LabelAttribute("Joint 1")]
public HandBones bone1 = HandBones.Wrist;
[LabelAttribute("Joint 2")]
public HandBones bone2 = HandBones.Wrist;
public float distance = 0.025f;
[LabelAttribute("Margin")]
public float thresholdWidth = 0.003f;
[HideInInspector]
public bool activeState;
}
public enum HandBones
{
Palm = 0,
Wrist = 1,
Thumb_Metacarpal = 2,
Thumb_Proximal = 3,
Thumb_Distal = 4,
Thumb_Tip = 5,
Index_Metacarpal = 6,
Index_Proximal = 7,
Index_Intermediate = 8,
Index_Distal = 9,
Index_Tip = 10,
Middle_Metacarpal = 11,
Middle_Proximal = 12,
Middle_Intermediate = 13,
Middle_Distal = 14,
Middle_Tip = 15,
Ring_Metacarpal = 16,
Ring_Proximal = 17,
Ring_Intermediate = 18,
Ring_Distal = 19,
Ring_Tip = 20,
Little_Metacarpal = 21,
Little_Proximal = 22,
Little_Intermediate = 23,
Little_Distal = 24,
Little_Tip = 25
}
}
[Serializable]
public class TransRecognizer
{
public TrackAxis trackAxis;
public SpaceType spaceType;
public TrackTarget trackTarget;
public enum SpaceType
{
WorldSpace,
LocalXY,
LocalYZ,
LocalXZ
}
public enum TrackAxis
{
Fingers, Palm, Thumb
}
public enum TrackTarget
{
TowardsFace,
AwayFromFace,
WorldUp,
WorldDown,
}
public float angleThreshold = 35f;
public float thresholdWidth = 10f;
public float holdDuration = 0.022f;
}
public class DisplayOnly : PropertyAttribute { }
public class LabelAttribute : PropertyAttribute
{
public string name;
public LabelAttribute(string name)
{
this.name = name;
}
}
}
#endif