version 2.5.0

This commit is contained in:
Sean Lu
2025-01-10 17:17:03 +08:00
parent ddc3c4c6d8
commit 2372c9429a
1086 changed files with 290974 additions and 77367 deletions

View File

@@ -0,0 +1,136 @@
// Copyright HTC Corporation All Rights Reserved.
using System;
using System.Text;
using UnityEngine;
using VIVE.OpenXR.Hand;
namespace VIVE.OpenXR.Models
{
public class HandModelActions : MonoBehaviour
{
#region Log
const string LOG_TAG = "VIVE.OpenXR.Models.HandModelActions";
StringBuilder m_sb = null;
StringBuilder sb
{
get
{
if (m_sb == null) { m_sb = new StringBuilder(); }
return m_sb;
}
}
void DEBUG(StringBuilder msg) { Debug.LogFormat("{0} {1}", LOG_TAG, msg); }
void ERROR(StringBuilder msg) { Debug.LogErrorFormat("{0} {1}", LOG_TAG, msg); }
#endregion
#region Inspector
[SerializeField] private bool m_IsLeft = false;
[SerializeField] private GameObject m_Wrist = null;
[SerializeField] private GameObject m_Palm = null;
[SerializeField] private GameObject m_Thumb_Metacarpal = null;
[SerializeField] private GameObject m_Thumb_Proximal = null;
[SerializeField] private GameObject m_Thumb_Distal = null;
[SerializeField] private GameObject m_Thumb_Tip = null;
[SerializeField] private GameObject m_Index_Metacarpal = null;
[SerializeField] private GameObject m_Index_Proximal = null;
[SerializeField] private GameObject m_Index_Intermediate = null;
[SerializeField] private GameObject m_Index_Distal = null;
[SerializeField] private GameObject m_Index_Tip = null;
[SerializeField] private GameObject m_Middle_Metacarpal = null;
[SerializeField] private GameObject m_Middle_Proximal = null;
[SerializeField] private GameObject m_Middle_Intermediate = null;
[SerializeField] private GameObject m_Middle_Distal = null;
[SerializeField] private GameObject m_Middle_Tip = null;
[SerializeField] private GameObject m_Ring_Metacarpal = null;
[SerializeField] private GameObject m_Ring_Proximal = null;
[SerializeField] private GameObject m_Ring_Intermediate = null;
[SerializeField] private GameObject m_Ring_Distal = null;
[SerializeField] private GameObject m_Ring_Tip = null;
[SerializeField] private GameObject m_Little_Metacarpal = null;
[SerializeField] private GameObject m_Little_Proximal = null;
[SerializeField] private GameObject m_Little_Intermediate = null;
[SerializeField] private GameObject m_Little_Distal = null;
[SerializeField] private GameObject m_Little_Tip = null;
[HideInInspector]
public bool ForceHidden = false;
#endregion
private SkinnedMeshRenderer skinMeshRenderer = null;
private void Awake()
{
skinMeshRenderer = GetComponentInChildren<SkinnedMeshRenderer>();
}
private void Update()
{
if (skinMeshRenderer == null) { return; }
if (!XR_EXT_hand_tracking.Interop.GetJointLocations(m_IsLeft, out XrHandJointLocationEXT[] handJointLocation))
{
skinMeshRenderer.enabled = false;
return;
}
skinMeshRenderer.enabled = !ForceHidden;
UpdateJointPosition(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_WRIST_EXT], ref m_Wrist);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_WRIST_EXT], ref m_Wrist);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_PALM_EXT], ref m_Palm);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_THUMB_METACARPAL_EXT], ref m_Thumb_Metacarpal);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_THUMB_PROXIMAL_EXT], ref m_Thumb_Proximal);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_THUMB_DISTAL_EXT], ref m_Thumb_Distal);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_THUMB_TIP_EXT], ref m_Thumb_Tip);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_INDEX_METACARPAL_EXT], ref m_Index_Metacarpal);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_INDEX_PROXIMAL_EXT], ref m_Index_Proximal);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_INDEX_INTERMEDIATE_EXT], ref m_Index_Intermediate);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_INDEX_DISTAL_EXT], ref m_Index_Distal);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_INDEX_TIP_EXT], ref m_Index_Tip);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_MIDDLE_METACARPAL_EXT], ref m_Middle_Metacarpal);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_MIDDLE_PROXIMAL_EXT], ref m_Middle_Proximal);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_MIDDLE_INTERMEDIATE_EXT], ref m_Middle_Intermediate);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_MIDDLE_DISTAL_EXT], ref m_Middle_Distal);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_MIDDLE_TIP_EXT], ref m_Middle_Tip);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_RING_METACARPAL_EXT], ref m_Ring_Metacarpal);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_RING_PROXIMAL_EXT], ref m_Ring_Proximal);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_RING_INTERMEDIATE_EXT], ref m_Ring_Intermediate);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_RING_DISTAL_EXT], ref m_Ring_Distal);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_RING_TIP_EXT], ref m_Ring_Tip);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_LITTLE_METACARPAL_EXT], ref m_Little_Metacarpal);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_LITTLE_PROXIMAL_EXT], ref m_Little_Proximal);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_LITTLE_INTERMEDIATE_EXT], ref m_Little_Intermediate);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_LITTLE_DISTAL_EXT], ref m_Little_Distal);
UpdateJointRotation(handJointLocation[(int)XrHandJointEXT.XR_HAND_JOINT_LITTLE_TIP_EXT], ref m_Little_Tip);
}
private void UpdateJointPosition(XrHandJointLocationEXT pose, ref GameObject joint)
{
if (((UInt64)pose.locationFlags & (UInt64)XrSpaceLocationFlags.XR_SPACE_LOCATION_POSITION_TRACKED_BIT) != 0)
{
Vector3 pos = OpenXRHelper.ToUnityVector(pose.pose.position);
m_Wrist.transform.localPosition = pos;
}
}
private void UpdateJointRotation(XrHandJointLocationEXT pose, ref GameObject joint)
{
if (((UInt64)pose.locationFlags & (UInt64)XrSpaceLocationFlags.XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT) != 0)
{
Quaternion rot = OpenXRHelper.ToUnityQuaternion(pose.pose.orientation);
joint.transform.rotation = rot;
}
}
}
}