Orient BestGrip(Orient orient)
    {
        float robotPos = 0.7025f;
        var   left     = new Vector3(1, 0, 1);
        var   right    = new Vector3(1, 0, -1);
        var   bestPos  = orient.Center.x < robotPos ? left : right;

        var angle = Orient.GetAngle(orient.Rotation * Vector3.right, bestPos);

        if (Abs(angle) > 90f)
        {
            orient.Rotation *= Quaternion.Euler(0, 180f, 0);
        }

        return(orient);
    }
Example #2
0
    static Orient?FindTile(Vector3 marker, IEnumerable <Vector3> topLayerMarkers)
    {
        float xLength    = 0.175f;
        float zLength    = 0.02f;
        float epsilon    = 0.01f;
        float epsilonDeg = 5f;

        foreach (var otherX in topLayerMarkers)
        {
            float distanceX = (marker - otherX).magnitude;
            if (Abs(distanceX - xLength) > epsilon)
            {
                continue;
            }

            foreach (var otherZ in topLayerMarkers)
            {
                float distanceZ = (marker - otherZ).magnitude;
                if (Abs(distanceZ - zLength) > epsilon)
                {
                    continue;
                }

                var vmx    = otherX - marker;
                var vmz    = otherZ - marker;
                var zAngle = Orient.GetAngle(vmx, vmz);
                if (Abs(zAngle - 90f) > epsilonDeg)
                {
                    continue;
                }

                var angle    = Orient.GetAngle(Vector3.right, vmx);
                var rotation = Quaternion.Euler(0, -angle, 0);
                var center   = otherX * 0.5f + marker * 0.5f;
                return(new Orient(center, rotation));
            }
        }

        return(null);
    }