ListDensityPlot3D data not dealing with tiny numbers

I’ve read in data from a PDE solver which has (x, y, z) and value. I grouped the single list into 4 values each using data = ReadList[…, Real]; p = Partition[data, 4]; I then tried
ListDensityPlot3D[p], but this gave me a division by zero error because of an Opacity problem, so I tried

ListDensityPlot3D[p, OpacityFunction -> Opacity[.25],  PlotRange -> All]

which runs for a while and then comes up with an empty plot.

The fourth value in the list is mostly zeros except for the central region which has values in the range of +/- 1e-5. Is there a command which will scale the values into a range ListDensityPlot3D is happy with, or is there an option to let the function know the values are tiny?

You may try a logarithmic rescaling of the actual values of p, or indirectly with a ColorFunction.

I tried ColorFunction, but maybe I don’t understand how to use it. I can post process the numbers to scale them though, before messing with Mathematica. Log(-x) is imaginary, so that complicates things.
Thanks, I was hoping I was missing something obvious, but a little more work to make the numbers nice won’t be that difficult.

If your data for f are all positive you may try ColorFunction -> Function[{x, y, z}, Hue[Log[z]].

If the minimum value of f is negative, try something like ColorFunction -> Function[{x, y, z}, Hue[Log[z-2*minimumValue]].