Fluxus
I've been meaning to try Fluxus for some time, and finally got around to it at the weekend. I initially jumped in at the deep end, trying to implement hypercube rendering, but I quickly realized I need to learn more about Scheme/Guile/OpenGL/Fluxus before I would be able to achieve it.
The first non-trivial thingy I made was a Menger Sponge:
(save-name "menger-sponge.scm") (define (build-sponge n o) (push) (if (< n 1) (begin (o) ) (begin (scale (vector (/ 1 3) (/ 1 3) (/ 1 3))) (push) (translate (vector -1 -1 -1)) (build-sponge (- n 1) o) (pop) (push) (translate (vector -1 -1 0)) (build-sponge (- n 1) o) (pop) (push) (translate (vector -1 -1 1)) (build-sponge (- n 1) o) (pop) (push) (translate (vector -1 0 -1)) (build-sponge (- n 1) o) (pop) (push) (translate (vector -1 0 1)) (build-sponge (- n 1) o) (pop) (push) (translate (vector -1 1 -1)) (build-sponge (- n 1) o) (pop) (push) (translate (vector -1 1 0)) (build-sponge (- n 1) o) (pop) (push) (translate (vector -1 1 1)) (build-sponge (- n 1) o) (pop) (push) (translate (vector 0 -1 -1)) (build-sponge (- n 1) o) (pop) (push) (translate (vector 0 -1 1)) (build-sponge (- n 1) o) (pop) (push) (translate (vector 0 1 -1)) (build-sponge (- n 1) o) (pop) (push) (translate (vector 0 1 1)) (build-sponge (- n 1) o) (pop) (push) (translate (vector 1 -1 -1)) (build-sponge (- n 1) o) (pop) (push) (translate (vector 1 -1 0)) (build-sponge (- n 1) o) (pop) (push) (translate (vector 1 -1 1)) (build-sponge (- n 1) o) (pop) (push) (translate (vector 1 0 -1)) (build-sponge (- n 1) o) (pop) (push) (translate (vector 1 0 1)) (build-sponge (- n 1) o) (pop) (push) (translate (vector 1 1 -1)) (build-sponge (- n 1) o) (pop) (push) (translate (vector 1 1 0)) (build-sponge (- n 1) o) (pop) (push) (translate (vector 1 1 1)) (build-sponge (- n 1) o) (pop) ) ) (pop) ) (clear-lights) (clear) (define L1 (make-light 0)) (light-position L1 (vector 0 0 0)) (light-ambient L1 (vector 0 0 0.1)) (light-specular L1 (vector 0 4 0)) (light-diffuse L1 (vector 1.5 0 0)) (shinyness 10) (colour (vector 0.75 0.75 1)) (ambient (vector 0.2 0.1 0.1)) (specular (vector 0.1 0.2 0.1)) (emissive (vector 0 0 0)) (opacity 1) (scale (vector 8 8 8)) (build-sponge 3 build-cube)
I couldn't go any higher than (build-sponge 4 build-cube) without running out of memory.
After that, I made a randomized tree thing, with the general idea that the cross-sectional area of the forked branches totals the area of the trunk branch at each division:
(save-name "rtree.scm") (define (build-rleaf) (push) (translate (vector 0 0.5 0)) (scale (vector 0.5 1 0.5)) (colour (vector 0 1 0)) (build-sphere 4 4) (pop) ) (define (build-rtree area) (push) (rotate (vector 0 65 0)) (translate (vector 0 0.7 0)) (scale (vector 0.8 (+ 0.8 area) 0.8)) (push) (scale (vector (sqrt area) (+ 0.8 area) (sqrt area))) (colour (vector 0.4 0.3 0)) (build-sphere 4 4) (pop) (if (< area 0.001) (build-rleaf) (begin (let ((split (+ (/ (flxrnd) 1.5) 0.1665))) (let ((a1 (* split area)) (a2 (* (- 1 split) area))) (rotate (vector 0 0 -20)) (build-rtree a1) (rotate (vector 0 0 55)) (build-rtree a2) ) )) ) (pop) ) (clear) (scale (vector 3 3 3)) (translate (vector 0 -2 0)) (rotate (vector 0 -45 0)) (build-stree 0.2)
And I also had some fun with the turtle builder, making Koch curves:
(define (koch n a) (turtle-prim 0) (turtle-reset) (koch-loop n 6 a (/ 180 a)) (turtle-vert) (turtle-build) ) (define (koch-loop n s a d) (if (> n 0) (begin (koch-loop (- n 1) (/ s d) a d) (turtle-turn (vector 0 0 a)) (koch-loop (- n 1) (/ s d) a d) (turtle-turn (vector 0 0 (* -2 a))) (koch-loop (- n 1) (/ s d) a d) (turtle-turn (vector 0 0 a)) (koch-loop (- n 1) (/ s d) a d) ) (begin (turtle-vert) (turtle-move s) ) ) ) (define (kochs n a) (translate (vector 0 3 0)) (koch n a) (if (> n 0) (kochs (- n 1) a) ) ) (define (kochss n as) (if (< 0 (length as)) (begin (push) (kochs n (car as)) (pop) (translate (vector 7 0 0)) (push) (kochss n (cdr as)) (pop) ) ) ) (clear-colour (vector 1 1 1)) (clear) (hint-unlit) (hint-wire) (line-width 1) (scale (vector 0.5 0.5 1)) (translate (vector -17 -12 0)) (colour (vector 1 0 0)) (kochss 6 (list 60 72 75 80 90))