public bool InsideTargetArea()
    {
        if (e == null)
        {
            // no targets happened yet
            return(false);
        }

        // get the pixel coords for the target and eye positions
        var targetPixelCoords = AngleHelperMethods.PositionToPixelCoords(target.transform.position);
        var eyePixelCoords    = AngleHelperMethods.PositionToPixelCoords(eyeLocation.transform.position);

        // calculate the pixel coord for the closest point in the target to the eye position
        var closestPointOnTarget = AngleHelperMethods.GetClosestPointOnTarget(e, eyePixelCoords);

        // calculate the long/lat for that pixel coord
        var closestPointOnTargetLonLat = new Vector2(AngleHelperMethods.PixelCoordToLong(closestPointOnTarget.x), AngleHelperMethods.PixelCoordToLat(closestPointOnTarget.y));

        // get long/lat as rays?
        var vectorToClosestPointOnTarget = AngleHelperMethods.LonLatToPosition(closestPointOnTargetLonLat.x, closestPointOnTargetLonLat.y);

        // show this on the screen as a ray
        //Debug.DrawRay(new Vector3(0,0,0), vectorToClosestPointOnTarget, Color.green, 1f);

        // claculate 3d angle between these, and add deactivationAngle to that - if less than this, deactivate object
        var vectorToTarget = target.transform.position;
        var angleTargetCentreToClosestTargetPoint = Vector3.Angle(vectorToTarget, vectorToClosestPointOnTarget);
        var vectorToObjectDeactivationIsBasedOn   = eyeLocation.transform.position; // unlike deactive, should consider "inside" based on eye location only

        if (Vector3.Angle(vectorToObjectDeactivationIsBasedOn, vectorToTarget) < angleTargetCentreToClosestTargetPoint)
        {
            return(true);
        }
        return(false);
    }
Esempio n. 2
0
    private void RotateToTarget()
    {
        var vectorToArrowPosition = arrow.transform.position;

        var rotH = Quaternion.AngleAxis(hAngle, Vector3.up);
        var vectorToAttentionPoint            = rotH * new Vector3(-1, 0, 0); // Vector3.forward;
        var horAngleBeteenArrowAndTargetPoint = Vector2.SignedAngle(new Vector2(vectorToAttentionPoint.x, vectorToAttentionPoint.z), new Vector2(vectorToArrowPosition.x, vectorToArrowPosition.z));

        if (horAngleBeteenArrowAndTargetPoint > 90 || horAngleBeteenArrowAndTargetPoint < -90)
        {
            // the target is on the other side - need to point left/right to assure arrow does't point over the top/bottom of sphere based on nearest bearing
            if (horAngleBeteenArrowAndTargetPoint > 0)
            {
                arrow.transform.localRotation = Quaternion.Euler(new Vector3(90, 0, -90));
            }
            else
            {
                arrow.transform.localRotation = Quaternion.Euler(new Vector3(-90, 0, -90));
            }
        }
        else
        {
            // target is on this side of the sphere - make the arrow point to the correct bearing
            var longLatsForArrowPosition = AngleHelperMethods.PositionToLonLat(vectorToArrowPosition);             //   GetLatLongForEyePosition(vectorToEyePosition);
            //Debug.LogError(longLatsForEyePosition);
            var longLatsForAttentionPosition = new Vector2(hAngle, vAngle);
            var bearingToTarget = GetBearingForLongLats(horAngleBeteenArrowAndTargetPoint, longLatsForArrowPosition, longLatsForAttentionPosition);

            arrow.transform.localRotation = Quaternion.Euler(new Vector3(bearingToTarget, 0, -90));
        }
    }
Esempio n. 3
0
    // From https://github.com/Mouledoux/ConnectedHome/blob/master/Assets/Scripts/TargetIndicator.cs
    private void UpdatePositionWithinFov()
    {
        var newPos     = GetScreenPointOfAttentionTarget(target);
        var leftEyeCam = leftEyeCamera.GetComponent <Camera>();

        var clampedPos = new Vector2();

        clampedPos.x = Mathf.Clamp(newPos.x, m_edgeBufferWidth, leftEyeCam.scaledPixelWidth - m_edgeBufferWidth); // (val, min, max)
        clampedPos.y = Mathf.Clamp(newPos.y, m_edgeBufferHeight, leftEyeCam.scaledPixelHeight - m_edgeBufferHeight);

        if (clampedPos.x != newPos.x || clampedPos.y != newPos.y)
        {
            // the target doesn't fall inside the viewport, so we should place flicker on bearing to target on sphere
            var vectorToAttentionPoint = target.transform.position;
            var vectorToHeadPosition   = leftEyeCamera.transform.forward;

            var horAngleBeteenHeadAndTargetPoint = Vector2.SignedAngle(new Vector2(vectorToAttentionPoint.x, vectorToAttentionPoint.z), new Vector2(vectorToHeadPosition.x, vectorToHeadPosition.z));

            //Debug.LogError(horAngleBeteenHeadAndTargetPoint);

            if (horAngleBeteenHeadAndTargetPoint > 90 || horAngleBeteenHeadAndTargetPoint < -90)
            {
                // the target is on the other side - need to point left/right to assure arrow does't point over the top/bottom of sphere based on nearest bearing
                if (horAngleBeteenHeadAndTargetPoint > 0)
                {
                    tangentRotate.transform.localRotation = Quaternion.Euler(new Vector3(0, 90f, 0f));
                }
                else
                {
                    tangentRotate.transform.localRotation = Quaternion.Euler(new Vector3(180f, 90f, 0f));
                }
            }
            else
            {
                var longLatForHead   = AngleHelperMethods.PositionToLonLat(leftEyeCamera.transform.forward);
                var longLatForTarget = AngleHelperMethods.PositionToLonLat(vectorToAttentionPoint);

                var bearingToTarget = GetBearingForLongLats(horAngleBeteenHeadAndTargetPoint, longLatForHead, longLatForTarget);

                // DEBUG: THIS DOESNT SEEM TO WORK QUITE RIGHT - but is it enough for a pilot study?
                // Actually this totally does work - the issue seems to be later, when we clamp the value to the screen fov
                var rollOfCamera = leftEyeCamera.transform.rotation.eulerAngles.z;
                tangentRotate.transform.localRotation = Quaternion.Euler(bearingToTarget - 90f + rollOfCamera, 90f, 0f);
            }

            newPos = GetScreenPointInDirection(leftEyeCam, tangentRotate.transform.position, tangentPoint.transform.position);

            clampedPos.x = Mathf.Clamp(newPos.x, m_edgeBufferWidth, leftEyeCam.scaledPixelWidth - m_edgeBufferWidth); // (val, min, max)
            clampedPos.y = Mathf.Clamp(newPos.y, m_edgeBufferHeight, leftEyeCam.scaledPixelHeight - m_edgeBufferHeight);
        }

        Ray rayToSceneFlicker = leftEyeCam.ScreenPointToRay(clampedPos);

        Debug.DrawRay(rayToSceneFlicker.origin, rayToSceneFlicker.direction, Color.green, 1f);
        SetAnglesForFlicker(rayToSceneFlicker);

        //m_icon.transform.position = newPos;
    }
Esempio n. 4
0
    private void SetAnglesForFlicker(Ray rayToSceneFlicker)
    {
        // var rotation = Quaternion.FromToRotation(camera.transform.forward, rayToSceneFlicker.direction);
        var oldLatLong = AngleHelperMethods.PositionToLonLat(transform.position);
        var newLatLong = AngleHelperMethods.PositionToLonLat(rayToSceneFlicker.direction);

        var longChange = oldLatLong.x - newLatLong.x;
        var latChange  = oldLatLong.y - newLatLong.y;

        // Debug.LogError("long change: " + longChange);
        // Debug.LogError("lat change: " + latChange);

        var up = new Vector3(0, 1, 0);

        transform.RotateAround(Vector3.zero, up, longChange * -1f);
        transform.RotateAround(Vector3.zero, transform.forward, latChange);
    }
Esempio n. 5
0
    public void SetTargetBox(AttentionEvent e)
    {
        var lon = AngleHelperMethods.PixelCoordToLong(e.targetHorPixel - (e.width / 2f));
        var lat = AngleHelperMethods.PixelCoordToLat(e.targetVerPixel - (e.height / 2f));
        var pos = AngleHelperMethods.LonLatToPosition(lon, lat);

        nodePositions[0] = pos;

        lon = AngleHelperMethods.PixelCoordToLong(e.targetHorPixel - (e.width / 2f));
        lat = AngleHelperMethods.PixelCoordToLat(e.targetVerPixel + (e.height / 2f));
        pos = AngleHelperMethods.LonLatToPosition(lon, lat);
        nodePositions[1] = pos;

        lon = AngleHelperMethods.PixelCoordToLong(e.targetHorPixel + (e.width / 2f));
        lat = AngleHelperMethods.PixelCoordToLat(e.targetVerPixel + (e.height / 2f));
        pos = AngleHelperMethods.LonLatToPosition(lon, lat);
        nodePositions[2] = pos;

        lon = AngleHelperMethods.PixelCoordToLong(e.targetHorPixel + (e.width / 2f));
        lat = AngleHelperMethods.PixelCoordToLat(e.targetVerPixel - (e.height / 2f));
        pos = AngleHelperMethods.LonLatToPosition(lon, lat);
        nodePositions[3] = pos;
    }
Esempio n. 6
0
 public List <string> GetLoggingData()
 {
     //  "long", "lat", "pixel_x", "pixel_y",
     return(new List <string>(new string[] { hAngle.ToString(), vAngle.ToString(), AngleHelperMethods.LongToPixelCoordX(hAngle).ToString(), AngleHelperMethods.LatToPixelCoordY(vAngle).ToString() }));
 }
Esempio n. 7
0
 public void ApplyLongLatToPosition(float longitude, float latitude)
 {
     // Debug.Log("Applying target position");
     transform.position = AngleHelperMethods.LonLatToPosition(longitude, latitude);
 }
    // Update is called once per frame
    void Update()
    {
        if (e == null)
        {
            // no targets happened yet
            return;
        }

        // get the pixel coords for the target and eye positions
        var targetPixelCoords = AngleHelperMethods.PositionToPixelCoords(target.transform.position);
        var eyePixelCoords    = AngleHelperMethods.PositionToPixelCoords(eyeLocation.transform.position);

        // calculate the pixel coord for the closest point in the target to the eye position
        var closestPointOnTarget = AngleHelperMethods.GetClosestPointOnTarget(e, eyePixelCoords);

        // calculate the long/lat for that pixel coord
        var closestPointOnTargetLonLat = new Vector2(AngleHelperMethods.PixelCoordToLong(closestPointOnTarget.x), AngleHelperMethods.PixelCoordToLat(closestPointOnTarget.y));

        // get long/lat as rays?
        var vectorToClosestPointOnTarget = AngleHelperMethods.LonLatToPosition(closestPointOnTargetLonLat.x, closestPointOnTargetLonLat.y);

        // show this on the screen as a ray
        //Debug.DrawRay(new Vector3(0,0,0), vectorToClosestPointOnTarget, Color.green, 1f);

        // claculate 3d angle between these, and add deactivationAngle to that - if less than this, deactivate object
        var vectorToTarget = target.transform.position;
        var angleTargetCentreToClosestTargetPoint = Vector3.Angle(vectorToTarget, vectorToClosestPointOnTarget);
        var totalAllowableAngleForDeactivation    = angleTargetCentreToClosestTargetPoint + deactivationAngle;
        var totalAllowableAngleForReactivation    = angleTargetCentreToClosestTargetPoint + reactivationAngle;
        var vectorToObjectDeactivationIsBasedOn   = deactivateBasedOnThisObjectsLocation.transform.position;

        if (cueIsActive && Vector3.Angle(vectorToObjectDeactivationIsBasedOn, vectorToTarget) < totalAllowableAngleForDeactivation)
        {
            targetPreviouslyEntered = true;
            cueIsActive             = false;

            Debug.Log("Entered target area");

            // deactivation angle reached
            if (objectToDeactivateArrow != null)
            {
                objectToDeactivateArrow.ActivationStatusChangedByAngleToTarget(false);
            }
            else
            {
                objectToDeactivateFlicker.ActivationStatusChangedByAngleToTarget(false);
            }
        }
        else if (!cueIsActive && Vector3.Angle(vectorToObjectDeactivationIsBasedOn, vectorToTarget) > totalAllowableAngleForReactivation)
        {
            Debug.Log("Deactivated cue based on angle");

            cueIsActive = true;
            if (objectToDeactivateArrow != null)
            {
                objectToDeactivateArrow.ActivationStatusChangedByAngleToTarget(true);
            }
            else
            {
                objectToDeactivateFlicker.ActivationStatusChangedByAngleToTarget(true);
            }

            if (targetPreviouslyEntered)             // stop the first instance of arrow or flicker increasing this
            {
                attentionEventsController.CueReactivatedOnLeavingTargetArea();
            }
        }
    }