Esempio n. 1
0
    public static Vector2 RayConeDistance(GCone _cone, GRay _ray)
    {
        Vector2 distances = RayConeCalculate(_cone, _ray);

        if (Vector3.Dot(_cone.normal, _ray.GetPoint(distances.x) - _cone.origin) < 0)
        {
            distances.x = -1;
        }
        if (Vector3.Dot(_cone.normal, _ray.GetPoint(distances.y) - _cone.origin) < 0)
        {
            distances.y = -1;
        }
        return(distances);
    }
Esempio n. 2
0
    static Vector2 RayConeCalculate(GCone _cone, GRay _ray)
    {
        Vector2 distances = Vector2.one * -1;
        Vector3 offset    = _ray.origin - _cone.origin;

        float RDV     = Vector3.Dot(_ray.direction, _cone.normal);
        float ODN     = Vector3.Dot(offset, _cone.normal);
        float cosA    = Mathf.Cos(UMath.AngleToRadin(_cone.angle));
        float sqrCosA = cosA * cosA;

        float a             = RDV * RDV - sqrCosA;
        float b             = 2f * (RDV * ODN - Vector3.Dot(_ray.direction, offset) * sqrCosA);
        float c             = ODN * ODN - Vector3.Dot(offset, offset) * sqrCosA;
        float determination = b * b - 4f * a * c;

        if (determination < 0)
        {
            return(distances);
        }
        determination = Mathf.Sqrt(determination);
        distances.x   = (-b + determination) / (2f * a);
        distances.y   = (-b - determination) / (2f * a);
        return(distances);
    }