Takes a 2D heightmap stored in an ndarray and generates a matching normal map.
Uses a method that is fast, but less accurate - I believe this approach works best :)
Generates a normal map.
heightmap should be a 2D ndarray, where each value corresponds to the
height at that point.
options.output is an optional 3D ndarray to output to. If not supplied,
one will be created. It's essentially the same size as the heightmap but
with an added dimension for X/Y/Z rotation values. So the shape of this
ndarray should be equivalent to:
heightmapshape0 heightmapshape1 3
options.xzscale The scale of the horizontal planes. Defaults to 1.
options.yscale The scale of the vertical plane. Defaults to 1.
options.wrap a boolean for whether the heightmap is tiling and the normal
map should wrap around the edges. Defaults to true.