Skip to content

Instantly share code, notes, and snippets.

@NegishiTakumi
Last active August 29, 2015 14:21
Show Gist options
  • Save NegishiTakumi/048dba202328d5215846 to your computer and use it in GitHub Desktop.
Save NegishiTakumi/048dba202328d5215846 to your computer and use it in GitHub Desktop.
FingerController
using System.Collections.Generic;
using Leap;
using UnityEngine;
using System.Collections;
using System.Linq;
/// <summary>
/// LeapMotionで取得した手からモデルの指に適用する
/// </summary>
public class FingerController : MonoBehaviour
{
public Transform m_thumb, m_index, m_middle, m_ring, m_pinky;
//モデル側の指リスト
private List<Transform> m_thumbList, m_indexList, m_middleList, m_ringList, m_pinkyList;
//LeapMotionの手側の指リスト
private List<Transform> l_thumbList, l_indexList, l_middleList, l_ringList, l_pinkyList;
//左手かどうか
public bool isLeftHand;
//手が存在しているかを1フレームずらして判別するためのBool値
private bool isExisting;
private void Start()
{
FingerListInitialize(m_thumb, ref m_thumbList);
FingerListInitialize(m_index, ref m_indexList);
FingerListInitialize(m_middle, ref m_middleList);
FingerListInitialize(m_ring, ref m_ringList);
FingerListInitialize(m_pinky, ref m_pinkyList);
}
private void LateUpdate()
{
var leapHandTransform = isLeftHand ? AvailableHandDetecter.instance.LeapLeftHandTransform : AvailableHandDetecter.instance.LeapRightHandTransform;
if (leapHandTransform == null)
{
isExisting = false;
return;
}
if (!isExisting) InitLeapHandAndFingers(leapHandTransform);
SyncFinger(m_thumbList, l_thumbList);
SyncFinger(m_indexList, l_indexList);
SyncFinger(m_middleList, l_middleList);
SyncFinger(m_ringList, l_ringList);
SyncFinger(m_pinkyList, l_pinkyList);
isExisting = true;
}
private void SyncFinger(List<Transform> modelFingerList, List<Transform> leapFingerList)
{
for (int i = 0; i < modelFingerList.Count; i++)
{
modelFingerList[i].localRotation = leapFingerList[i].localRotation;
}
}
private void InitLeapHandAndFingers(Transform palmTransform)
{
//名前順に指を取得する。
var q = palmTransform.GetComponentInChildren<Transform>().Cast<Transform>().OrderBy(t => t.name).ToList();
FingerListInitialize(q[0], ref l_thumbList);
FingerListInitialize(q[1], ref l_indexList);
FingerListInitialize(q[2], ref l_middleList);
FingerListInitialize(q[3], ref l_ringList);
FingerListInitialize(q[4], ref l_pinkyList);
}
private void FingerListInitialize(Transform fingerParentTransform, ref List<Transform> fingerList)
{
fingerList = new List<Transform>();
MonoBehaviourExtension.GetSelfAndChildList(fingerParentTransform, ref fingerList);
}
}
using System;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using System.Collections;
public class HandSyncWithLeap : MonoBehaviour
{
//This code must attach to Character Model (Rig=Humanoid)
protected Animator animator;
List<Transform> leftFingerList = new List<Transform>();
List<Transform> rightFingerList = new List<Transform>();
List<Transform> leapLeftFingerList = new List<Transform>();
List<Transform> leapRightFingerList = new List<Transform>();
// Use this for initialization
void Start()
{
var leap_LeftWrist = GameObject.FindWithTag("LeftWrist");
var leap_RightWrist = GameObject.FindWithTag("RightWrist");
animator = GetComponent<Animator>();
foreach (var bone in Enum.GetValues(typeof(HumanBodyBones)))
{
var str = bone.ToString();
if (str.Contains("Left") &&
(str.Contains("Distal") || str.Contains("Proximal") || str.Contains("Intermediate")))
{
leftFingerList.Add(animator.GetBoneTransform((HumanBodyBones)bone));
}
if (str.Contains("Right") &&
(str.Contains("Distal") || str.Contains("Proximal") || str.Contains("Intermediate")))
{
rightFingerList.Add(animator.GetBoneTransform((HumanBodyBones)bone));
}
}
GetLeapHandChildren(leap_LeftWrist.transform,true);
GetLeapHandChildren(leap_RightWrist.transform,false);
leapLeftFingerList = normalizeLeapFingerChildren(leapLeftFingerList);
leapRightFingerList = normalizeLeapFingerChildren(leapRightFingerList);
}
private void GetLeapHandChildren(Transform tr, bool isLeft)
{
var q = tr.GetComponentInChildren<Transform>();
foreach (var t in q)
{
var str = t.ToString();
var isBorCorD = str.Contains("B") || str.Contains("C") || str.Contains("D");
var isEND = str.Contains("END");
if (isLeft)
{
if (isBorCorD && !isEND)
{
leapLeftFingerList.Add((Transform)t);
}
}
else
{
if (isBorCorD && !isEND)
{
leapRightFingerList.Add((Transform)t);
}
}
GetLeapHandChildren((Transform)t, isLeft);
}
}
private List<Transform> normalizeLeapFingerChildren(List<Transform> leapFingerTransforms)
{
var _thumb = leapFingerTransforms.Where(t => t.ToString().Contains("Thumb"));
var _index = leapFingerTransforms.Where(t => t.ToString().Contains("Index"));
var _finger = leapFingerTransforms.Where(t => t.ToString().Contains("Middle"));
var _ring = leapFingerTransforms.Where(t => t.ToString().Contains("Ring"));
var _pinky = leapFingerTransforms.Where(t => t.ToString().Contains("Pinky"));
var q = _thumb.Concat(_index).Concat(_finger).Concat(_ring).Concat(_pinky).ToList();
return q;
}
private void FingersUpdater2(bool isLeft)//Transform[] CharacterFingersArray, Transform[] leapFingersArray,bool isLeft)
{
for (int i = 0; i < leapLeftFingerList.Count; i++)
{
var llfa = leapLeftFingerList[i];
if (!llfa.ToString().Contains("Thumb"))
{
var temp = new Quaternion(llfa.localRotation.z, llfa.localRotation.y, llfa.localRotation.x,
llfa.localRotation.w);
leftFingerList[i].localRotation = temp;
}
else
{
Debug.Log(llfa.ToString());
if (!llfa.ToString().Contains("ThumbB"))
leftFingerList[i].localRotation = llfa.localRotation;
}
}
}
private void LeftFingerUpdater()//Transform[] CharacterFingersArray, Transform[] leapFingersArray,bool isLeft)
{
var fingerList = leftFingerList;
for (int i = 0; i < leapLeftFingerList.Count; i++)
{
var lfa = leapLeftFingerList[i];
if (!lfa.ToString().Contains("Thumb"))
{
var temp = new Quaternion(lfa.localRotation.z, lfa.localRotation.y, lfa.localRotation.x,
lfa.localRotation.w);
fingerList[i].localRotation = temp;
}
else
{
if (!lfa.ToString().Contains("ThumbB"))
fingerList[i].localRotation = lfa.localRotation;
}
}
}
private void RightFingerUpdater()
{
var fingerList = rightFingerList;
for (int j = 0; j < leapRightFingerList.Count; j++)
{
var lfa = leapRightFingerList[j];
if (!lfa.ToString().Contains("Thumb"))
{
var temp = new Quaternion(lfa.localRotation.z, lfa.localRotation.y, -lfa.localRotation.x,
lfa.localRotation.w);
fingerList[j].localRotation = temp;
}
else
{
if (!lfa.ToString().Contains("ThumbB"))
fingerList[j].localRotation = lfa.localRotation;
}
}
}
// Update is called once per frame
void LateUpdate()
{
LeftFingerUpdater();
RightFingerUpdater();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment