First, it's not physically based, so it's not an exact science. If what I'm about to tell you doesn't suit your tastes, feel free to change the mapping.
Second, even if it were physically based, the "mapping" depends on your physical world location (e.g. 12pm in Ushuaia is not the same as 12pm in Spain). It also depends on politics (e.g. in Spain at 21hs on summer you still have plenty of sunlight, in Argentina which should be in GMT-4 but is in GMT-3 for no particular reason... at 21hs it's really dark already).
For simplicity, the model assumes that 0.5 -> sun is downwards at maximum brightness (i.e. typical 12pm midday) and -0.5 the same but at night (typical midnight?)
Now whether you want to apply a linear scale (e.g. 0 -> 6am-ish; 0.5 -> 12pm; 1.0 -> 9pm-ish; -1 -> 9pm-ish; -0.5 12am; 1 -> 6am-ish ) or another scale (e.g. you square / square root / cosine-interpolate the value) is up to your findings.
By different scales I mean:
-
Morning: lerp( 6am, 12pm, w * 2 ) for w in range [0; 0.5] vs:
-
Morning: lerp( 6am, 12pm, sqrt( w * 2 ) ) for w in range [0; 0.5] vs:
-
Morning: lerp( 6am, 12pm, pow( w * 2, factor ) ) for w in range [0; 0.5] vs:
-
Morning: cosine_interpolate( 6am, 12pm, w * 2 ) for w in range [0; 0.5] vs
-
Something else
Also on most locations the sun rarely is ever a perfect (0, -1, 0) nor does it move from (-1, 0, 0) to (1, 0, 0) where z is always 0 which is why we provide setSunDir where you can specify the sun direction explicitly (i.e. when z varies according to time of day).
We still ask for normalizedTimeOfDay to know how bright it should be and which colours to apply.
Does this satisfy the questions?