85 lines
2.0 KiB
C#
85 lines
2.0 KiB
C#
using System.Collections;
|
|
using UnityEngine;
|
|
|
|
namespace VIVE.OpenXR.Toolkits.RealisticHandInteraction
|
|
{
|
|
public class MeshHandPose : HandPose
|
|
{
|
|
[SerializeField]
|
|
private HandMeshManager m_HandMesh;
|
|
|
|
private bool keepUpdate = false;
|
|
|
|
protected override void OnEnable()
|
|
{
|
|
StartCoroutine(WaitInit());
|
|
}
|
|
|
|
protected override void OnDisable()
|
|
{
|
|
base.OnDisable();
|
|
if (keepUpdate)
|
|
{
|
|
keepUpdate = false;
|
|
StopCoroutine(UpdatePose());
|
|
}
|
|
}
|
|
|
|
public void SetHandMeshRenderer(HandMeshManager handMeshRenderer)
|
|
{
|
|
m_HandMesh = handMeshRenderer;
|
|
SetType(handMeshRenderer.isLeft ? HandPoseType.MESH_LEFT : HandPoseType.MESH_RIGHT);
|
|
}
|
|
|
|
public bool SetJointPose(JointType joint, Pose jointPose, bool local = false)
|
|
{
|
|
if (m_HandMesh != null)
|
|
{
|
|
return m_HandMesh.SetJointPositionAndRotation(joint, jointPose.position, jointPose.rotation, local);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private IEnumerator WaitInit()
|
|
{
|
|
yield return new WaitUntil(() => m_Initialized);
|
|
base.OnEnable();
|
|
if (!keepUpdate)
|
|
{
|
|
keepUpdate = true;
|
|
StartCoroutine(UpdatePose());
|
|
}
|
|
}
|
|
|
|
private IEnumerator UpdatePose()
|
|
{
|
|
while (keepUpdate)
|
|
{
|
|
yield return new WaitForFixedUpdate();
|
|
|
|
HandPose handPose = HandPoseProvider.GetHandPose(m_HandMesh.isLeft ? HandPoseType.HAND_LEFT : HandPoseType.HAND_RIGHT);
|
|
m_IsTracked = handPose.IsTracked();
|
|
|
|
for (int i = 0; i < poseCount; i++)
|
|
{
|
|
if (m_HandMesh.GetJointPositionAndRotation((JointType)i, out Vector3 position, out Quaternion rotation) &&
|
|
m_HandMesh.GetJointPositionAndRotation((JointType)i, out Vector3 localPosition, out Quaternion localRotation, local: true))
|
|
{
|
|
m_Position[i] = position;
|
|
m_Rotation[i] = rotation;
|
|
m_LocalPosition[i] = localPosition;
|
|
m_LocalRotation[i] = localRotation;
|
|
}
|
|
else
|
|
{
|
|
m_Position[i] = Vector3.zero;
|
|
m_Rotation[i] = Quaternion.identity;
|
|
m_LocalPosition[i] = Vector3.zero;
|
|
m_LocalRotation[i] = Quaternion.identity;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|