Beispiel #1
0
    // Update is called once per frame
    void Update()
    {
        //position of Letters relatet to its parents
        LetterPosX = this.gameObject.transform.localPosition.x;
        LetterPosY = this.gameObject.transform.localPosition.y;
        LetterPosZ = this.gameObject.transform.localPosition.z;

        Transform cameraTransform = Camera.main.transform;

        ulong   timeStamp          = smiInstance.smi_GetTimeStamp();
        Vector3 leftGazeDirection  = smiInstance.smi_GetLeftGazeDirection();
        Vector3 rightGazeDirection = smiInstance.smi_GetRightGazeDirection();
        Vector2 binocularPor       = smiInstance.smi_GetBinocularPor();
        Vector3 cameraRaycast      = smiInstance.smi_GetCameraRaycast();
        Vector2 leftPor            = smiInstance.smi_GetLeftPor();
        Vector2 rightPor           = smiInstance.smi_GetRightPor();
        Vector3 leftBasePoint      = smiInstance.smi_GetLeftGazeBase();
        Vector3 rightBasePoint     = smiInstance.smi_GetRightGazeBase();

        //Define real position of Letters related to the FOV of the Eyetracker
        LetterxPosFOV = (1080 + this.transform.parent.transform.localPosition.x + LetterPosX);
        LetteryPosFOV = -(-600 + this.transform.parent.transform.localPosition.y + LetterPosY);

        if (SMI.SMIEyeTrackingUnity.smi_IsValid(cameraRaycast))
        {
            //Distance between Letter and Camera
            LetterDistanceCamera = Vector3.Distance(this.transform.position, cameraTransform.position);
            //Define the direction from Kamera to Letter
            targetDir          = this.transform.position - cameraTransform.position;
            targetRightBaseDir = this.transform.position - cameraTransform.TransformPoint(rightBasePoint);
            targetLeftBaseDir  = this.transform.position - cameraTransform.TransformPoint(leftBasePoint);
            //Calculate the Angle between the direction of Camera and Letter and the direction of the Raycast of the eyes
            angleCameraLetter       = Vector3.Angle(cameraTransform.TransformDirection(cameraRaycast), targetDir);
            angleleftGazeDirection  = Vector3.Angle(cameraTransform.TransformDirection(leftGazeDirection), targetLeftBaseDir);
            angleRightGazeDirection = Vector3.Angle(cameraTransform.TransformDirection(rightGazeDirection), targetRightBaseDir);



            Vector2 angularTarget = new Vector2(Vector3.SignedAngle(Vector3.forward, new Vector3(this.transform.localPosition.x, 0, LetterDistanceCamera), Vector3.up),
                                                Vector3.SignedAngle(Vector3.forward, new Vector3(0, this.transform.localPosition.y, LetterDistanceCamera), Vector3.up));
            Vector2 angularResult = new Vector2(Vector3.SignedAngle(Vector3.forward, new Vector3(cameraRaycast.x, 0, cameraRaycast.z), Vector3.up),
                                                Vector3.SignedAngle(Vector3.forward, new Vector3(0, cameraRaycast.y, cameraRaycast.z), Vector3.up));

            float errX      = angularResult.x - angularTarget.x;
            float errY      = angularResult.y - angularTarget.y;
            float realAngle = Mathf.Sqrt(errX * errX + errY * errY);



            /*
             *
             * Einige Berechnungen wurden doppelt ausgeführt zur überprüfung des Wahrheitsgehaltes der Funktionen.
             *
             *
             */


            time += Time.deltaTime;



            EyeXPos = binocularPor.x;
            EyeYPos = binocularPor.y;

            //Debug.Log ("LetterPos [x;y] " + LetterxPosFOV + "," + LetteryPosFOV + "EyeXPos " + EyeXPos + "," + EyeYPos);

            //Richtungsvektor des Eye berechnen
            EyeDirVecX = EyeXPos - EyeOldPosX;
            EyeDirVecY = EyeYPos - EyeOldPosY;


            //Richtungsvektor des Buchstaben
            LetterDirVecX = LetterxPosFOV - LetterOldPosX;
            LetterDirVecY = LetteryPosFOV - LetterOldPosY;

            //Richtungsvektoren in Vecotrschreibweise
            //Eye
            RichtungsVecEye = new Vector2(EyeDirVecX, EyeDirVecY);
            //Letter
            RichtungsVecLetter = new Vector2(LetterDirVecX, LetterDirVecY);

            //Distanz zwischen alter und neuer Position (Länge des Richtugnsvektors)
            EyeDistance    = Vector2.Distance(new Vector2(EyeXPos, EyeYPos), new Vector2(EyeOldPosX, EyeOldPosY));
            LetterDistance = Vector2.Distance(new Vector2(LetterxPosFOV, LetteryPosFOV), new Vector2(LetterOldPosX, LetterOldPosY));


            //normierter Richtungsvektor Letter und Eye
            NorRichtungsVecLetter = (1 / LetterDistance) * RichtungsVecLetter;
            NorRichtungsVecEye    = (1 / EyeDistance) * RichtungsVecEye;


            //Geschwindigkeitsberechnung der Buchstaben über Distanz und Zeit
            EyeSpeed        = (EyeDistance * (time - oldtime));
            LetterRealspeed = (LetterDistance * (time - oldtime));


            //Geschwindigkeitsabgleich zwischen Auge und Buchstabe
            SpeedDivision = (LetterRealspeed / EyeSpeed);

            //Winkelberechnung des Winkels zwischen Richtungsvektor Buchstabe und Richtungsvektor Auge
            DirAngelLetterToGazeVec    = Vector2.Angle(RichtungsVecLetter, RichtungsVecEye);
            NorDirAngelLetterToGazeVec = Vector2.Angle(NorRichtungsVecLetter, NorRichtungsVecEye);

            //Abstand zwischen Buchstabe und Augen Anhand der POR und FOV Position
            DistanceEyeAndLetterPOR = Vector2.Distance(new Vector2(EyeXPos, EyeYPos), new Vector2(LetterxPosFOV, LetteryPosFOV));

            //Berechnung der Match-Werte
            calculateMatchValue(SpeedDivision, angleCameraLetter, DirAngelLetterToGazeVec);
            calculateMatchValueGewichtet(SpeedDivision, angleCameraLetter, DirAngelLetterToGazeVec);
            calculateMatchValueGewichtet2(SpeedDivision, angleCameraLetter, DirAngelLetterToGazeVec);

            //PORPosition
            EyeOldPosX = EyeXPos;
            EyeOldPosY = EyeYPos;

            //Letterposition
            LetterOldPosX = LetterxPosFOV;
            LetterOldPosY = LetteryPosFOV;


            timedifferenz = 0f;


            oldtime = time;
        }
    }