-local function make_mandelbulb(max_iter, power, texture)
- return function(p)
- local z = V.new(p)
- local dr = 1.0
- local r = 0.0
-
- for i=1,max_iter do
- r = V.norm(z)
- if r>2.0 then
- break
- end
-
- -- convert to polar coordinates
- theta = math.acos(z[3]/r)
- phi = math.atan(z[2],z[1])
- dr = math.pow(r, power-1.0)*power*dr + 1.0
-
- -- scale and rotate the point
- zr = math.pow(r ,power)
- theta = theta*power
- phi = phi*power
-
- -- convert back to cartesian coordinates
- z = V.new{math.sin(theta)*math.cos(phi),
- math.sin(phi)*math.sin(theta),
- math.cos(theta)} * zr
- z = z + p
- end
-
- return {dist = 0.5*math.log(r)*r/dr,
- texture = texture}
- end
-end