// Update is called once per frame void Update() { for (int i = 0; i < 2; i++) { //含有中指和食指的数据 if (m_HandData.FingerDatas[i].ContainsKey(Finger.FingerType.TYPE_INDEX) && m_HandData.FingerDatas[i].ContainsKey(Finger.FingerType.TYPE_THUMB)) { FingerData indexFingerData = m_HandData.FingerDatas[i][Finger.FingerType.TYPE_INDEX]; Vector indexPos = indexFingerData.m_Point.m_Position; Vector thumbPos = m_HandData.FingerDatas[i][Finger.FingerType.TYPE_THUMB].m_Point.m_Position; //print("IndexToThumb:" + indexPos.DistanceTo(thumbPos) ); print((indexFingerData.m_Point.m_Position - indexFingerData.m_Position).AngleTo(indexFingerData.m_Point.m_Direction) * 180 / Mathf.PI); if (FingerMatch.StrightState(indexFingerData)) { m_IsHandPinch[i] = true; m_Distance[i] = indexPos.DistanceTo(thumbPos); } else { m_IsHandPinch[i] = false; m_Distance[i] = 0f; } } else { m_IsHandPinch[i] = false; m_Distance[i] = 0f; } } }
/// <summary> /// 判定一个手掌是否处于弯曲状态。 /// 手掌中有matchNumber个手指满足即可,实际设定为2-3个 /// </summary> /// <param name="dic_FingersData"></param> /// <param name="matchNumber"></param> /// <param name="dir">【返回值】:如果匹配成功方向为掌心的方向</param> /// <returns>是否为弯曲状态</returns> bool BendState(Dictionary <Finger.FingerType, FingerData> dic_FingersData, PointData palmData, int matchNumber, out Vector dir) { bool isBend = false; dir = Vector.Zero; int count = 0; Dictionary <Finger.FingerType, FingerData> fingersOutThumb = new Dictionary <Finger.FingerType, FingerData>(dic_FingersData); fingersOutThumb.Remove(Finger.FingerType.TYPE_THUMB); var values = fingersOutThumb.Values; //float eulerAngule = 0f; //遍历四指,匹配个数满足设定个数认定手掌为弯曲,并且设定弯曲的方向为掌心方向。 foreach (FingerData fingerData in values) { if (FingerMatch.BendState(fingerData)) //,out eulerAngule)) { count++; } } //print ("Bend Count:"+count+" BendEuler:"+eulerAngule); if (count >= matchNumber) { isBend = true; dir = palmData.m_Direction; } return(isBend); }
/// <summary> /// 通过给定手指数据,判断是否处于伸手状态 /// 当三个手指符合不包括拇指,判定为伸掌状态 /// </summary> /// <param name="fingerData"></param> /// <param name="?"></param> bool OpenState(Dictionary <Finger.FingerType, FingerData> dic_FingersData, PointData palmData, out Vector dir, out Vector palmPos, out Vector palmDir) { bool isOpen = false; dir = Vector.Zero; palmPos = Vector.Zero; palmDir = Vector.Zero; int count = 0; Dictionary <Finger.FingerType, FingerData> fingersOutThumb = new Dictionary <Finger.FingerType, FingerData>(dic_FingersData); fingersOutThumb.Remove(Finger.FingerType.TYPE_THUMB); var values = fingersOutThumb.Values; foreach (FingerData fingerData in values) { if (FingerMatch.StrightState(fingerData)) { count++; } } // print ("FingerStright Count:"+count); if (count >= m_MatchNumber) { isOpen = true; } //指定输出的伸手方向为中指指向 //如果没有识别中指,判定为false //如果中指不是伸直状态,判定为false if (fingersOutThumb.ContainsKey(Finger.FingerType.TYPE_MIDDLE)) { FingerData middleFingerData = fingersOutThumb[Finger.FingerType.TYPE_MIDDLE]; if (FingerMatch.StrightState(middleFingerData)) { dir = middleFingerData.m_Point.m_Direction; palmPos = palmData.m_Position; palmDir = palmData.m_Direction; } else { isOpen = false; } } else { isOpen = false; } return(isOpen); }
/// <summary> /// 判定一个手掌是否处于食指指向状态。 /// 手掌中有matchNumber个手指满足即可,实际设定为2个。 /// </summary> /// <param name="dic_FingersData"></param> /// <param name="matchNumber"></param> /// <param name="dir">【返回值】:如果匹配成功方向为掌心的方向</param> /// <returns>是否为食指指向状态。</returns> bool IndexPointState(Dictionary <Finger.FingerType, FingerData> dic_FingersData, out Vector dir) { bool isBend = false; dir = Vector.Zero; int count = 0; Dictionary <Finger.FingerType, FingerData> fingersOutThumbAndIndex = new Dictionary <Finger.FingerType, FingerData>(dic_FingersData); fingersOutThumbAndIndex.Remove(Finger.FingerType.TYPE_THUMB); //如果不存在食指的信息就不需要继续判断了 if (fingersOutThumbAndIndex.ContainsKey(Finger.FingerType.TYPE_INDEX)) { FingerData indexFinger = fingersOutThumbAndIndex[Finger.FingerType.TYPE_INDEX]; //食指处于伸直状态才继续进行判断 if (FingerMatch.StrightState(indexFinger)) { fingersOutThumbAndIndex.Remove(Finger.FingerType.TYPE_INDEX); var values = fingersOutThumbAndIndex.Values; //遍历四指,匹配个数满足设定个数认定手掌为弯曲,并且设定弯曲的方向为掌心方向。 foreach (FingerData fingerData in values) { if (FingerMatch.BendState(fingerData)) { count++; } } //log //print("FingerPoint bend count:"+count); //判定弯曲手指的个数是否符合要求 //判定食指是否是伸直状态 if (count >= m_MatchNumber) { isBend = true; dir = indexFinger.m_Point.m_Direction;//食指的方向 } } } return(isBend); }