Beispiel #1
0
    private int findMiddlePoint(StreemData networkData, int firstPoint)
    {
        float minDistance = 0;
        int   result      = 0;
        bool  found       = false;

        for (int i = 0; i < 4; i++)
        {
            if (i != firstPoint)
            {
                float tempMinDist = Vector3.Distance(networkData._markers[firstPoint].pos, networkData._markers[i].pos);

                if (!found)
                {
                    minDistance = tempMinDist;
                    found       = true;
                    result      = i;
                }
                else if (tempMinDist < minDistance)
                {
                    minDistance = tempMinDist;
                    result      = i;
                }
            }
        }

        point2.transform.position = networkData._markers[result].pos;
        middlePointVec            = networkData._markers[result].pos;

        return(result);
    }
Beispiel #2
0
    private int findThumb(StreemData networkData, int firstPoint, int middle)
    {
        int   result      = 0;
        float minDistance = 0.0f;
        bool  found       = false;

        for (int i = 0; i < 4; i++)
        {
            if (i != firstPoint && i != middle)
            {
                float tempminDistance = Vector3.Distance(wrist.transform.position, networkData._markers[i].pos);

                if (!found)
                {
                    minDistance = tempminDistance;
                    found       = true;
                    result      = i;
                }
                else if (tempminDistance < minDistance)
                {
                    minDistance = tempminDistance;
                    result      = i;
                }
            }
        }

        thumb.transform.position = networkData._markers[result].pos;
        thumbPointVec            = networkData._markers[result].pos;

        return(result);
    }
Beispiel #3
0
    public bool checkPointGesture(StreemData networkData)
    {
        //Sort the array to take the 4 closest to the wrist markers
        Array.Sort(networkData._markers, delegate(Marker marker1, Marker marker2)
        {
            float distance1 = Vector3.Distance(wrist.transform.position, marker1.pos);
            float distance2 = Vector3.Distance(wrist.transform.position, marker2.pos);

            return(distance1.CompareTo(distance2));
        });

        firstPoint = findFirstPoint(networkData);
        middle     = findMiddlePoint(networkData, firstPoint);
        theThumb   = findThumb(networkData, firstPoint, middle);
        laser      = findLaserPoint(networkData, firstPoint, theThumb, middle);

        if (checkFingerAngle(networkData, firstPoint, middle, laser))
        {
            // LaserPointing = true;
            return(true);
        }
        else
        {
            //LaserPointing = false;
            return(false);
        }
    }
Beispiel #4
0
    public bool checkWristOrientation(StreemData networkData)
    {
        _moveVector = transform.position;
        _moveVector = networkData._rigidBody[0].pos + origin.position;

        // Rigid body rotation streamed from Motive Tracker
        Quaternion rot = networkData._rigidBody[0].ori * origin.rotation;

        // Invert pitch and yaw
        Vector3 euler = rot.eulerAngles;

        rot.eulerAngles = new Vector3(-euler.x, euler.y, -euler.z);

        // Apply rotation
        wrist.transform.rotation = rot;
        wrist.transform.position = _moveVector;

        TheWrist = wrist.transform;

        if ((wrist.transform.rotation.eulerAngles.x >= 0.0f && wrist.transform.rotation.eulerAngles.x <= 25.0f) ||
            (wrist.transform.rotation.eulerAngles.x >= 315.0f && wrist.transform.rotation.eulerAngles.x <= 360.0f))
        {
            return(true);
        }
        else
        {
            //LaserPointing = false;
            return(false);
        }
    }
Beispiel #5
0
    // Update is called once per frame
    void Update()
    {
        if (OptitrackManagement.DirectMulticastSocketClient.IsInit() && OptitrackManagement.DirectMulticastSocketClient.IsDataReceivedCorrectly())
        {
            StreemData networkData = OptitrackManagement.DirectMulticastSocketClient.GetStreemData();

            if (_manager.checkWristOrientation(networkData))
            {
                if (_manager.checkPointGesture(networkData))
                {
                    _manager.LaserPointing = true;

                    if (_manager.SelectGesture)
                    {
                        if (frameCounter <= framesOfSelectGesture)
                        {
                            if (_manager.checkForClick(networkData))
                            {
                                _manager.ClickGesture  = true;
                                _manager.SelectGesture = false;
                                frameCounter           = 0;
                            }
                            else
                            {
                                frameCounter++;
                            }
                        }
                        else
                        {
                            frameCounter           = 0;
                            _manager.SelectGesture = false;
                        }
                    }
                    else if (_manager.checkSelectGesture(networkData))
                    {
                        _manager.SelectGesture = true;
                        _manager.ClickGesture  = false;
                    }
                    else
                    {
                        _manager.SelectGesture = false;
                        _manager.ClickGesture  = false;
                    }
                }
                else
                {
                    noGestures();
                }
            }
            else
            {
                noGestures();
            }
        }
        else
        {
            noGestures();
        }
    }
Beispiel #6
0
    private bool checkFingerAngle(StreemData networkData, int firstPoint, int middle, int laser)
    {
        Vector3 v1 = networkData._markers[firstPoint].pos;
        Vector3 v2 = networkData._markers[middle].pos;
        Vector3 v3 = networkData._markers[laser].pos;

        float angle = signedAngleBetween(v1, v3, v2);

        if (angle >= 2.30f && angle <= 2.95f)
        {
            return(true);
        }
        else
        {
            return(false);
        }
    }
Beispiel #7
0
    private int findLaserPoint(StreemData networkData, int firstPoint, int theThumb, int middle)
    {
        int result = 0;

        for (int i = 0; i < 4; i++)
        {
            if (i != firstPoint && i != theThumb && i != middle)
            {
                result = i;
            }
        }

        laserpoint.transform.position = networkData._markers[result].pos;
        laserPointVec = networkData._markers[result].pos;

        return(result);
    }
Beispiel #8
0
    public bool checkForClick(StreemData networkData)
    {
        Vector3 v1 = networkData._markers[middle].pos;
        Vector3 v2 = networkData._markers[firstPoint].pos;
        Vector3 v3 = networkData._markers[theThumb].pos;

        float angle = signedAngleBetween(v1, v3, v2);

        // Debug.Log(angle);
        if (angle <= 0.25f)
        {
            return(true);
        }
        else
        {
            return(false);
        }
    }
Beispiel #9
0
    private int findFirstPoint(StreemData networkData)
    {
        float minDistance = Vector3.Distance(wrist.transform.position, networkData._markers[0].pos);
        int   result      = 0;

        for (int i = 0; i < 4; i++)
        {
            float tempDist = Vector3.Distance(wrist.transform.position, networkData._markers[i].pos);

            if (tempDist < minDistance)
            {
                minDistance = tempDist;
                result      = i;
            }
        }

        poin1.transform.position = networkData._markers[result].pos;
        firstPointVec            = networkData._markers[result].pos;

        return(result);
    }