using System.Collections.Generic;
using UnityEngine;
namespace Passer.Tracking {
using Passer.Humanoid.Tracking;
///
/// Hand tracking skeleton
///
public class HandSkeleton : SensorComponent {
public bool isLeft;
public new bool show = false;
protected List bones;
//protected static Material boneWhite;
public enum BoneId {
Invalid = -1,
Hand = 0,
ThumbProximal,
ThumbIntermediate,
ThumbDistal,
ThumbTip,
IndexMetaCarpal,
IndexProximal,
IndexIntermediate,
IndexDistal,
IndexTip,
MiddleMetaCarpal,
MiddleProximal,
MiddleIntermediate,
MiddleDistal,
MiddleTip,
RingMetaCarpal,
RingProximal,
RingIntermediate,
RingDistal,
RingTip,
LittleMetacarpal,
LittleProximal,
LittleIntermediate,
LittleDistal,
LittleTip,
Forearm,
Count
}
#region Start
protected virtual void InitializeSkeleton() {
bones = new List(new TrackedBone[(int)BoneId.Count]);
for (int i = 0; i < (int)Finger.Count; i++) {
Transform parent = this.transform;
for (int j = (int)FingerBone.Proximal; j <= (int)FingerBone.Tip; j++) {
BoneId boneId = BoneId.ThumbProximal + i * 5 + j - 1;
int boneIx = (int)boneId;
bones[boneIx] = TrackedBone.Create(boneId.ToString(), parent);
parent = bones[boneIx].transform;
if (boneId == BoneId.ThumbProximal) {
bones[boneIx].transform.localPosition = new Vector3(0, 0, 0.02F);
if (isLeft)
bones[boneIx].transform.localRotation = Quaternion.Euler(0, 20, 25);
else
bones[boneIx].transform.localRotation = Quaternion.Euler(0, -20, 25);
}
else if (j == (int)FingerBone.Proximal)
bones[boneIx].transform.localPosition = new Vector3(isLeft ? -0.06F : 0.06F, 0, 0.04F - i * 0.02F);
else if (i == (int)Finger.Little)
bones[boneIx].transform.localPosition = new Vector3(isLeft ? -0.015F : 0.015F, 0, 0);
else if (i == (int)Finger.Middle)
bones[boneIx].transform.localPosition = new Vector3(isLeft ? -0.023F : 0.023F, 0, 0);
else
bones[boneIx].transform.localPosition = new Vector3(isLeft ? -0.02F : 0.02F, 0, 0);
}
}
int forearmIx = (int)BoneId.Forearm;
bones[forearmIx] = TrackedBone.Create(BoneId.Forearm.ToString(), this.transform);
bones[forearmIx].transform.localPosition = new Vector3(isLeft ? 0.2F : -0.2F, 0, 0);
}
public static HandSkeleton FindHandSkeleton(Transform trackerTransform, bool isLeft) {
HandSkeleton[] handSkeletons = trackerTransform.GetComponentsInChildren();
foreach (HandSkeleton handSkeleton in handSkeletons) {
if (handSkeleton.isLeft == isLeft)
return handSkeleton;
}
return null;
}
public virtual GameObject CreateHandSkeleton(Transform trackerTransform, bool isLeft, bool showRealObjects) {
GameObject skeletonObj = new GameObject(isLeft ? "Left Hand Skeleton" : "Right Hand Skeleton");
skeletonObj.transform.parent = trackerTransform;
skeletonObj.transform.localPosition = Vector3.zero;
skeletonObj.transform.localRotation = Quaternion.identity;
return skeletonObj;
}
#endregion
#region Update
protected void UpdateSkeletonRender() {
if (bones == null)
return;
// Render Skeleton
foreach (TrackedBone bone in bones) {
if (bone == null)
continue;
LineRenderer boneRenderer = bone.transform.GetComponent();
if (boneRenderer != null) {
Vector3 localParentPosition = bone.transform.InverseTransformPoint(bone.transform.parent.position);
boneRenderer.SetPosition(1, localParentPosition);
boneRenderer.enabled = show;
}
}
}
protected bool rendered;
protected void EnableRenderer() {
if (rendered || !show)
return;
Renderer[] renderers = this.GetComponentsInChildren();
foreach (Renderer renderer in renderers) {
if (!(renderer is LineRenderer))
renderer.enabled = true;
}
rendered = true;
}
protected void DisableRenderer() {
if (!rendered)
return;
Renderer[] renderers = this.GetComponentsInChildren();
foreach (Renderer renderer in renderers) {
if (!(renderer is LineRenderer))
renderer.enabled = false;
}
rendered = false;
}
#endregion
public virtual Transform GetForearmBone() {
return bones[(int)BoneId.Forearm].transform;
}
public virtual Transform GetWristBone() {
return this.transform;
}
public virtual Transform GetBone(Finger finger, FingerBone fingerBone) {
if (bones == null)
return null;
int boneId = GetBoneId(finger, fingerBone);
if (boneId == -1 || bones[boneId] == null)
return null;
return bones[boneId].transform;
}
public virtual int GetBoneId(Finger finger, FingerBone fingerBone) {
return -1;
}
}
}