123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- using System;
- using UnityEngine;
- namespace Leap.Unity
- {
- public abstract class FingerModel : MonoBehaviour
- {
- public void SetLeapHand(Hand hand)
- {
- this.hand_ = hand;
- if (this.hand_ != null)
- {
- this.finger_ = hand.Fingers[(int)this.fingerType];
- }
- }
- public Hand GetLeapHand()
- {
- return this.hand_;
- }
- public Finger GetLeapFinger()
- {
- return this.finger_;
- }
- public virtual void InitFinger()
- {
- this.UpdateFinger();
- }
- public abstract void UpdateFinger();
- public Vector3 GetTipPosition()
- {
- if (this.finger_ != null)
- {
- return this.finger_.Bone(Bone.BoneType.TYPE_DISTAL).NextJoint.ToVector3();
- }
- if (this.bones[3] && this.joints[1])
- {
- return 2f * this.bones[3].position - this.joints[1].position;
- }
- return Vector3.zero;
- }
- public Vector3 GetJointPosition(int joint)
- {
- if (joint >= 4)
- {
- return this.GetTipPosition();
- }
- if (this.finger_ != null)
- {
- return this.finger_.Bone((Bone.BoneType)joint).PrevJoint.ToVector3();
- }
- if (this.joints[joint])
- {
- return this.joints[joint].position;
- }
- return Vector3.zero;
- }
- public Ray GetRay()
- {
- Ray result = new Ray(this.GetTipPosition(), this.GetBoneDirection(3));
- return result;
- }
- public Vector3 GetBoneCenter(int bone_type)
- {
- if (this.finger_ != null)
- {
- Bone bone = this.finger_.Bone((Bone.BoneType)bone_type);
- return bone.Center.ToVector3();
- }
- if (this.bones[bone_type])
- {
- return this.bones[bone_type].position;
- }
- return Vector3.zero;
- }
- public Vector3 GetBoneDirection(int bone_type)
- {
- if (this.finger_ != null)
- {
- return (this.GetJointPosition(bone_type + 1) - this.GetJointPosition(bone_type)).normalized;
- }
- if (this.bones[bone_type])
- {
- return this.bones[bone_type].forward;
- }
- return Vector3.forward;
- }
- public Quaternion GetBoneRotation(int bone_type)
- {
- if (this.finger_ != null)
- {
- return this.finger_.Bone((Bone.BoneType)bone_type).Rotation.ToQuaternion();
- }
- if (this.bones[bone_type])
- {
- return this.bones[bone_type].rotation;
- }
- return Quaternion.identity;
- }
- public float GetBoneLength(int bone_type)
- {
- return this.finger_.Bone((Bone.BoneType)bone_type).Length;
- }
- public float GetBoneWidth(int bone_type)
- {
- return this.finger_.Bone((Bone.BoneType)bone_type).Width;
- }
- public float GetFingerJointStretchMecanim(int joint_type)
- {
- Quaternion quaternion = Quaternion.identity;
- if (this.finger_ != null)
- {
- quaternion = Quaternion.Inverse(this.finger_.Bone((Bone.BoneType)joint_type).Rotation.ToQuaternion()) * this.finger_.Bone(joint_type + Bone.BoneType.TYPE_PROXIMAL).Rotation.ToQuaternion();
- }
- else if (this.bones[joint_type] && this.bones[joint_type + 1])
- {
- quaternion = Quaternion.Inverse(this.GetBoneRotation(joint_type)) * this.GetBoneRotation(joint_type + 1);
- }
- float num = -quaternion.eulerAngles.x;
- if (num <= -180f)
- {
- num += 360f;
- }
- return num;
- }
- public float GetFingerJointSpreadMecanim()
- {
- Quaternion quaternion = Quaternion.identity;
- if (this.finger_ != null)
- {
- quaternion = Quaternion.Inverse(this.finger_.Bone(Bone.BoneType.TYPE_METACARPAL).Rotation.ToQuaternion()) * this.finger_.Bone(Bone.BoneType.TYPE_PROXIMAL).Rotation.ToQuaternion();
- }
- else if (this.bones[0] && this.bones[1])
- {
- quaternion = Quaternion.Inverse(this.GetBoneRotation(0)) * this.GetBoneRotation(1);
- }
- float num = 0f;
- Finger.FingerType fingerType = this.fingerType;
- if (this.finger_ != null)
- {
- this.fingerType = this.finger_.Type;
- }
- if (fingerType == Finger.FingerType.TYPE_INDEX || fingerType == Finger.FingerType.TYPE_MIDDLE)
- {
- num = quaternion.eulerAngles.y;
- if (num > 180f)
- {
- num -= 360f;
- }
- }
- if (fingerType == Finger.FingerType.TYPE_THUMB || fingerType == Finger.FingerType.TYPE_RING || fingerType == Finger.FingerType.TYPE_PINKY)
- {
- num = -quaternion.eulerAngles.y;
- if (num <= -180f)
- {
- num += 360f;
- }
- }
- return num;
- }
- public const int NUM_BONES = 4;
- public const int NUM_JOINTS = 3;
- public Finger.FingerType fingerType = Finger.FingerType.TYPE_INDEX;
- public Transform[] bones = new Transform[4];
- public Transform[] joints = new Transform[3];
- protected Hand hand_;
- protected Finger finger_;
- }
- }
|