# 3 dimensional vector representation with Hue color data

I am trying to represent 3-dimensional vectors in a 3-dimensional space. In my field, there is a common color coding (color wheel) as in the picture.

For (vx,vy,vz) vectors: (0,0,1) is white, (0,0,-1) is black, (vx,vy,0) is a Hue coloring. As vz changes from -1 to 1, we may need to adjust the saturation and brightness for Hue function, but I am stuck how to show it. How can I make a VectorColorFunction for ListVectorPlot3D with such color-wheel?

For example, the third image is a failed one with

g = VectorPlot3D[{x, y, z}, {x, -6, 6}, {y, -6, 6}, {z, -6, 6},
VectorStyle -> "Arrow3D", VectorPoints -> 15,
VectorColorFunction ->
Function[{x, y, z, vx, vy, vz, n},
ColorData["Rainbow"][Arg[vx + I vy]]], AxesLabel -> {x, y, z},
VectorScale -> {0.15, Scaled[0.5]},
RegionFunction -> Function[{x, y, z}, 4^2 < x^2 + y^2 + z^2 < 5^2]]


First let's define a helper function which maps from unit vectors to our desired colors:

HSLFromUnitVector = Function[{x, y, z},
Hue[Mod[Arg[x + I*y]/(2 \[Pi]), 1], Min[1, 1 - z], (1 + z)/2]
]


I named it HSL... based on the HSL color space which it shares a close resemblance with. It's quite certainly not a 100% accurate implementation of it, but it should give you the general idea and, with a bit of time could be perfected if needed.

Then we can use it to get the coloring in the vector field plot:

VectorPlot3D[{x, y, z}, {x, -6, 6}, {y, -6, 6}, {z, -6, 6},
VectorStyle -> "Arrow3D", VectorPoints -> 15,
VectorColorFunction -> Function[{x, y, z, vx, vy, vz, n},
HSLFromUnitVector @@ Normalize[{vx, vy, vz}]
],
VectorColorFunctionScaling -> False, AxesLabel -> {x, y, z},
VectorScale -> {0.15, Scaled[0.5]},
RegionFunction -> Function[{x, y, z}, 4^2 < x^2 + y^2 + z^2 < 5^2]
] Notice the added VectorColorFuncctionScaling->False which makes sure that our VctorColorFunction gets the original {vx,vy,vz} values and not rescaled values, which would sabotage our color scheme.

The effect is easier to see on a sphere:

SphericalPlot3D[1, {\[Theta], 0, \[Pi]}, {\[Phi], -\[Pi], \[Pi]},
ColorFunctionScaling -> False,
ColorFunction -> Function[{x, y, z, u, v}, HSLFromUnitVector @@ {x, y, z}]
] 