Example #1
0
    private Vector4 AttractorDir(Vector3 dir, LineAttractor attractor)
    {
        LineAttractorData data    = attractor.Data;
        Vector3           p0      = attractor.P0.position;
        Vector3           p1      = attractor.P1.position;
        Vector3           cp      = Utils.ClosestPointOnLine(transform.position, p0, p1);
        Vector3           lineDir = (p1 - p0).normalized;
        int lineAlignment         = Vector3.Dot(lineDir, dir) > 0 ? 1 : -1;

        if (dir == Vector3.zero)
        {
            lineAlignment = 0;
        }
        Vector3 attractorDir = lineDir * lineAlignment;
        float   d            = (transform.position - cp).magnitude;
        float   d01          = Mathf.Clamp01(Mathf.InverseLerp(data.Range, 0, d)); // closer to the line, higher the value

        if (data.Curve != null)
        {
            d01 = data.Curve.Evaluate(d01);
        }
        Vector3 lerpDir = Vector3.Lerp(dir, attractorDir, d01 * data.Power);

        return(new Vector4(lerpDir.x, lerpDir.y, lerpDir.z, d));
    }
Example #2
0
    private void OnDrawGizmos()
    {
        // positions history
        for (int i = 0; i < MoveVectorHistory.Count; i++)
        {
            Color color = Color.white;
            color.a      = Mathf.Lerp(0.1f, 1, (float)i / (float)MoveVectorHistory.Count);
            Gizmos.color = color;
            Gizmos.DrawSphere(PositionHistory[i], .05f);
            //Gizmos.DrawRay(PositionHistory[i], MoveVectorHistory[i]);
        }

        // line attractor gizmos
        if (UseAttractor)
        {
            // get closest attractor
            LineAttractor closestAttractor = null;
            float         closestDist      = Mathf.Infinity;
            foreach (LineAttractor attractor in LineAttractorsList)
            {
                Vector4 attractorDir = AttractorDir(InputDirRelToCamera, attractor);
                if (attractorDir.w < closestDist)
                {
                    closestDist      = attractorDir.w;
                    closestAttractor = attractor;
                }
            }

            // draw closest attractor dirs
            if (closestAttractor != null)
            {
                LineAttractorData data = closestAttractor.Data;
                Vector3           p0   = closestAttractor.P0.position;
                Vector3           p1   = closestAttractor.P1.position;

                // closest point and line
                Gizmos.color = Color.red;
                Vector3 cp = Utils.ClosestPointOnLine(transform.position, p0, p1);
                Gizmos.DrawSphere(cp, .2f);
                Gizmos.DrawLine(transform.position, cp);

                // temp values
                Vector3 inputDir     = InputDirRelToCamera;
                Vector3 lineDir      = (p1 - p0).normalized;
                Vector3 attractedDir = (lineDir + inputDir).normalized;
                Vector3 lerpDir      = AttractorDir(inputDir, closestAttractor);

                // gizmos dirs
                Gizmos.color = Color.white;
                Gizmos.DrawRay(transform.position, inputDir * 2);
                Gizmos.color = Color.blue;
                Gizmos.DrawRay(transform.position, InputDirRelToCamera * 2);
                Gizmos.color = Color.yellow;
                Gizmos.DrawRay(transform.position, lineDir * 2);
                Gizmos.color = Color.green * .75f;
                Gizmos.DrawRay(transform.position, attractedDir * 1.8f);
                Gizmos.color = Color.green;
                Gizmos.DrawRay(transform.position, lerpDir * 1.8f);
            }
        }
    }