Last active
August 29, 2015 14:21
-
-
Save NegishiTakumi/048dba202328d5215846 to your computer and use it in GitHub Desktop.
FingerController
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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