public Vector3 Noise3D(Vector3 p)
    {
        const float e = 0.01f;// 0.0009765625;

        Vector3 dx = new Vector3(e, 0.0f, 0.0f);
        Vector3 dy = new Vector3(0.0f, e, 0.0f);
        Vector3 dz = new Vector3(0.0f, 0.0f, e);

        Vector3 p_x0 = Perlin.Noise3D(p - dx);
        Vector3 p_x1 = Perlin.Noise3D(p + dx);
        Vector3 p_y0 = Perlin.Noise3D(p - dy);
        Vector3 p_y1 = Perlin.Noise3D(p + dy);
        Vector3 p_z0 = Perlin.Noise3D(p - dz);
        Vector3 p_z1 = Perlin.Noise3D(p + dz);

        //Vector3 p_x0 = sngen.Noise3D(p - dx);
        //Vector3 p_x1 = sngen.Noise3D(p + dx);
        //Vector3 p_y0 = sngen.Noise3D(p - dy);
        //Vector3 p_y1 = sngen.Noise3D(p + dy);
        //Vector3 p_z0 = sngen.Noise3D(p - dz);
        //Vector3 p_z1 = sngen.Noise3D(p + dz);

        float x = p_y1.z - p_y0.z - p_z1.y + p_z0.y;
        float y = p_z1.x - p_z0.x - p_x1.z + p_x0.z;
        float z = p_x1.y - p_x0.y - p_y1.x + p_y0.x;

        //const float divisor = 1.0f/ (2.0f * e);
        return((new Vector3(x, y, z) / (2.0f * e)).normalized);
    }