Пример #1
0
        void Update()
        {
            // Returns current state of the gaze
            data = VarjoPlugin.GetGaze();

            // Check if gaze data is valid and calibrated
            if (data.status != VarjoPlugin.GazeStatus.INVALID)
            {
                switch (eye)
                {
                case Eye.both:
                    // Gaze data forward and position comes as 3 doubles: x,y,z. You need to construct a vector from them to a desired format.
                    gazeRayForward = new Vector3((float)data.gaze.forward[0], (float)data.gaze.forward[1], (float)data.gaze.forward[2]);
                    gazePosition   = new Vector3((float)data.gaze.position[0], (float)data.gaze.position[1], (float)data.gaze.position[2]);
                    break;

                case Eye.left:
                    gazeRayForward = new Vector3((float)data.left.forward[0], (float)data.left.forward[1], (float)data.left.forward[2]);
                    gazePosition   = new Vector3((float)data.left.position[0], (float)data.left.position[1], (float)data.left.position[2]);
                    break;

                case Eye.right:
                    gazeRayForward = new Vector3((float)data.right.forward[0], (float)data.right.forward[1], (float)data.right.forward[2]);
                    gazePosition   = new Vector3((float)data.right.position[0], (float)data.right.position[1], (float)data.right.position[2]);
                    break;
                }

                // Fetch head pose
                transform.position = VarjoManager.Instance.HeadTransform.position;
                transform.rotation = VarjoManager.Instance.HeadTransform.rotation;

                // Transform gaze direction and origin from HMD space to world space
                gazeRayDirection = transform.TransformVector(gazeRayForward);
                gazeRayOrigin    = transform.TransformPoint(gazePosition);

                // Raycast into world
                if (Physics.SphereCast(gazeRayOrigin, gazeRayRadius, gazeRayDirection, out gazeRayHit))
                {
                    // Use layers or tags preferably to identify looked objects in your application.
                    // This is done here via GetComponent for clarity's sake as example.
                    VarjoGazeTarget target = gazeRayHit.collider.gameObject.GetComponent <VarjoGazeTarget>();
                    if (target != null)
                    {
                        target.OnHit();
                    }

                    if (drawDebug)
                    {
                        Debug.DrawLine(gazeRayOrigin, gazeRayOrigin + gazeRayDirection * 10.0f, Color.green);
                    }
                }
                else
                {
                    if (drawDebug)
                    {
                        Debug.DrawLine(gazeRayOrigin, gazeRayOrigin + gazeRayDirection * 10.0f, Color.white);
                    }
                }
            }
        }
Пример #2
0
 void RequestGazeCalDelayed()
 {
     VarjoPlugin.GazeData data = VarjoPlugin.GetGaze();
     if (data.status != VarjoPlugin.GazeStatus.VALID)
     {
         GetComponent <VarjoExample.VarjoGazeCalibrationRequest>().RequestGazeCalibration();
     }
 }
Пример #3
0
 void Update()
 {
     if (!calibrated)
     {
         VarjoPlugin.GazeData data = VarjoPlugin.GetGaze();
         if (data.status == VarjoPlugin.GazeStatus.VALID)
         {
             calibrated = true;
             endcription.Perform();
             mooseAnimation.enabled = true;
         }
     }
 }
Пример #4
0
    void LogGazeData(VarjoPlugin.GazeData data)
    {
        // Get HMD position and rotation
        hmdPosition = VarjoManager.Instance.HeadTransform.position;
        hmdRotation = VarjoManager.Instance.HeadTransform.rotation.eulerAngles;

        string[] logData = new string[18];

        // Gaze data frame number
        logData[0] = data.frameNumber.ToString();

        // Gaze data capture time (nanoseconds)
        logData[1] = data.captureTime.ToString();

        // Log time (milliseconds)
        logData[2] = (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond).ToString();

        // HMD
        logData[3] = hmdPosition.ToString("F3");
        logData[4] = hmdRotation.ToString("F3");

        // Combined gaze
        bool invalid = data.status == VarjoPlugin.GazeStatus.INVALID;

        logData[5] = invalid ? InvalidString : ValidString;
        logData[6] = invalid ? "" : Double3ToString(data.gaze.forward);
        logData[7] = invalid ? "" : Double3ToString(data.gaze.position);

        // Left eye
        bool leftInvalid = data.leftStatus == VarjoPlugin.GazeEyeStatus.EYE_INVALID;

        logData[8]  = leftInvalid ? InvalidString : ValidString;
        logData[9]  = leftInvalid ? "" : Double3ToString(data.left.forward);
        logData[10] = leftInvalid ? "" : Double3ToString(data.left.position);
        logData[11] = leftInvalid ? "" : data.leftPupilSize.ToString();

        // Right eye
        bool rightInvalid = data.rightStatus == VarjoPlugin.GazeEyeStatus.EYE_INVALID;

        logData[12] = rightInvalid ? InvalidString : ValidString;
        logData[13] = rightInvalid ? "" : Double3ToString(data.right.forward);
        logData[14] = rightInvalid ? "" : Double3ToString(data.right.position);
        logData[15] = rightInvalid ? "" : data.rightPupilSize.ToString();

        // Focus
        logData[16] = invalid ? "" : data.focusDistance.ToString();
        logData[17] = invalid ? "" : data.focusStability.ToString();

        //Debug.Log("Log HMD Pos: " + logData[3]);
        //Debug.Log("Log HMD Rot: " + logData[4]);
    }
Пример #5
0
        private void GazeRay()
        {
            // Returns current state of the gaze
            data = VarjoPlugin.GetGaze();

            // Check if gaze data is valid and calibrated
            if (data.status != VarjoPlugin.GazeStatus.INVALID)
            {
                switch (eye)
                {
                case Eye.both:
                    // Gaze data forward and position comes as 3 doubles: x,y,z. You need to construct a vector from them to a desired format.
                    gazeRayForward = new Vector3((float)data.gaze.forward[0], (float)data.gaze.forward[1], (float)data.gaze.forward[2]);
                    gazePosition   = new Vector3((float)data.gaze.position[0], (float)data.gaze.position[1], (float)data.gaze.position[2]);
                    break;

                case Eye.left:
                    gazeRayForward = new Vector3((float)data.left.forward[0], (float)data.left.forward[1], (float)data.left.forward[2]);
                    gazePosition   = new Vector3((float)data.left.position[0], (float)data.left.position[1], (float)data.left.position[2]);
                    break;

                case Eye.right:
                    gazeRayForward = new Vector3((float)data.right.forward[0], (float)data.right.forward[1], (float)data.right.forward[2]);
                    gazePosition   = new Vector3((float)data.right.position[0], (float)data.right.position[1], (float)data.right.position[2]);
                    break;
                }

                // Fetch head pose
                transform.position = VarjoManager.Instance.HeadTransform.position;
                transform.rotation = VarjoManager.Instance.HeadTransform.rotation;

                // Transform gaze direction and origin from HMD space to world space
                gazeRayDirection = transform.TransformVector(gazeRayForward);
                gazeRayOrigin    = transform.TransformPoint(gazePosition);



                gazeCircle.gameObject.transform.position = gazeRayOrigin + (gazeRayDirection * 7.0f);
                ChangeGazeCircleSize(data.focusDistance);

                // Raycast into world
                if (Physics.SphereCast(gazeRayOrigin, gazeRayRadius, gazeRayDirection, out gazeRayHit))
                {
                    if (drawDebug)
                    {
                        Debug.DrawLine(gazeRayOrigin, gazeRayOrigin + gazeRayDirection * 10.0f, Color.green);
                    }

                    HeatmapDataReceiver dataTarget = gazeRayHit.collider.gameObject.GetComponent <HeatmapDataReceiver>();

                    if (dataTarget != null)
                    {
                        dataTarget.ReceivePosition(gazeRayHit.point, gazeRayRadius);
                    }

                    GazeTargetPanel panelTarget = gazeRayHit.collider.gameObject.GetComponent <GazeTargetPanel>();

                    if (panelTarget != null)
                    {
                        panelTarget.OnGazeRayHit();
                    }
                }
                else
                {
                    if (drawDebug)
                    {
                        Debug.DrawLine(gazeRayOrigin, gazeRayOrigin + gazeRayDirection * 10.0f, Color.white);
                    }
                }
            }
        }