Пример #1
0
    // 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;
            }
        }
    }
Пример #2
0
    /// <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);
    }
Пример #3
0
    /// <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);
    }
Пример #4
0
    /// <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);
    }