Created
March 30, 2021 19:41
-
-
Save khoparzi/8bbe8542cf7f8b4292c1a0174c0f8b4c to your computer and use it in GitHub Desktop.
Almost a month's worth of Marching.js sketches exploring various experiments with Signed Distance Fields and combinatorial geometries through the month of March 2021. [Marching.js](https://charlieroberts.github.io/marching/playground/) is a JavaScript shader compiler specifically focused on ray marching via signed distance functions.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // 1 Mar 2021 | |
| // Alright time for a new 30 day series! I present to you a new round of Marching.js | |
| m = march( | |
| u = Union2( | |
| hl1 = Halve(Onion(Sphere(3), 0.012), Halve.UP), | |
| hl2 = Halve(Onion(Sphere(2), 0.012), Halve.UP), | |
| hl3 = Halve(Onion(Sphere(1), 0.012), Halve.UP), | |
| hl4 = Halve(Onion(Sphere(0.5), 0.012), Halve.UP), | |
| ).material('black').rotate(90, 1, 0, 0) | |
| ) | |
| .fog( .15, Vec3(.5) ) | |
| .light( Light( Vec3(1,.5,0), Vec3(1), .125 ) ) | |
| .render(10, true) | |
| .camera( 0, 0, 10 ) | |
| onframe = t => { | |
| hl1.rotate(t * 250, 0, sin(t), 0.5) | |
| hl2.rotate(t * 350, 0, sin(t), 0.5) | |
| hl3.rotate(t * 450, 0, sin(t), 0.5) | |
| hl4.rotate(t * 550, 0, sin(t), 0.5) | |
| } | |
| // 2 Mar 2021 | |
| // Hex Glitches | |
| quality = 'low' | |
| use('hydra').then( ()=> { | |
| hydra = Hydra() | |
| hydra.shape(10,.2).rotate(0, 2).out() | |
| march( | |
| rpt = Repeat( | |
| sphere = HexPrism(.25, .45).texture( hydra.texture() ), | |
| 2 | |
| ).rotate(30, 1, 1, 1) | |
| ) | |
| .post( Edge(), Invert(1), f = Focus(.125) ) | |
| .render(10, true) | |
| sphere.tex.scale = 8 | |
| onframe = t => { | |
| rpt.rotate(20, 0, 1, 0) | |
| camera.pos.z = t/3 | |
| } | |
| }) | |
| // 3 - Weird Dice Mar 2021 | |
| march( | |
| Intersection( | |
| Sphere(1), | |
| Pipe(Repeat(Box(.125), .25).texture('stripes'), b = Box(.52)) | |
| ) | |
| ).background(Vec3(.5)).render('high', true) | |
| onframe = t => { | |
| b.rotate(t * 15, 1, 1, 0) | |
| } | |
| // 4 Mar 2021 | |
| smallBox = 1.25 | |
| speedMul = 3.5 | |
| march( | |
| su = RoundDifference( | |
| StairsUnion(Box(), b2 = Sphere(smallBox)) | |
| , b3 = Box(smallBox), 0.5 | |
| ) | |
| ).fog(.125, Vec3(0.8)).render(20, true) | |
| onframe = t => { | |
| b3.move(cos(t * speedMul + .5) * 1.5, 0, 0) | |
| b2.move(sin(t * speedMul) * 1.5, 0, 0) | |
| su.rotate(t * 45, 1, 1, 1) | |
| } | |
| // 5 Mar 2021 | |
| smallBox = 0.25 | |
| speedMul = 5 | |
| march( | |
| su = RoundDifference( | |
| StairsUnion(Mandelbox(3.5), b2 = Sphere(smallBox)) | |
| , b3 = Box(smallBox), 0.5 | |
| ) | |
| ).fog(.125, Vec3(0.8)).render(20, true) | |
| onframe = t => { | |
| b3.move(cos(t * speedMul + .5) * 1.5, 0, 0) | |
| b2.move(sin(t * speedMul) * 1.5, 0, 0) | |
| su.rotate(t * 45, 0, 1, 1) | |
| } | |
| // 6 Mar 2021 | |
| // mat = Material( 'phong', Vec3(.05, 0, 0), Vec3(1,0,0), Vec3(3), 64, Vec3( 0,6,4) ) | |
| mat = Material( 'phong', .125, 1, 1) | |
| march( | |
| tw = Twist(hp = HexPrism().material(mat), Vec2(0.75, 0.2)) | |
| ).background(Vec3(0.25)).fog(.012, Vec3(0.4)) | |
| .post( rays = Godrays() ) | |
| .render(10, true) | |
| // try below one line at a time | |
| rays.color = [1,0,1] | |
| rays.decay = 1.01 | |
| // change z position of rays to put | |
| // them in the box | |
| rays.threshold = .125 | |
| onframe = t => { | |
| hp.rotate(t * 30, 1, 0, 0) | |
| tw.rotate(t * 30, -1, 0, 0) | |
| } | |
| // 7 Mar 2021 | |
| march( | |
| tr1 = PolarRepeat(Torus().rotate(90, 1, 0, 0), 5).material('green'), | |
| Twist(tr2 = PolarRepeat(Torus(Vec2(1.5, .125)).rotate(90, 1, 0, 0), 8)).material('red'), | |
| Plane().rotate(90, 0.4, 0, 1).translate(0, 0, -6).material('glue') | |
| ) | |
| .light(Light(Vec3(2, 2, 3), Vec3(0, .51, .45))) | |
| .render(5, true) | |
| onframe = t => { | |
| tr1.rotate(t * 30, 0, 1, 0) | |
| tr2.rotate(t * 30, 0, sin(t / 4) * 0.8, 0.2) | |
| } | |
| // 8 Mar 2021 | |
| mat = Material( 'phong', .125, 1, .1) | |
| march( | |
| Twist(pr = PolarRepeat(tr = Torus(Vec2(1., .05)).rotate(90, 1, 0, 0).translate(0.75, 0, 0), 12), Vec3(0.53)).material(mat) | |
| ).background(Vec3(.5)) | |
| .light(Light(Vec3(2, 2, 3), Vec3(.5))) | |
| .post( rays = Godrays() ).render(2, true) | |
| rays.decay = .9 | |
| rays.threshold = .5 | |
| rays.color = [.1,.1,.1] | |
| onframe = t => { | |
| pr.rotate(45 * t, 1, 0, 1) | |
| tr.rotate(30 * t, 1, 1, 0) | |
| } | |
| // 9 Mar 2021 | |
| use('hydra').then(() => { | |
| h = Hydra() | |
| osc(1, 0.125, 1.5).brightness(-0.5).out() | |
| //voronoi().out() | |
| mat = Material( 'phong', .125, 1, .1) | |
| march( | |
| pr = PolarRepeat(tr = Torus88(Vec2(1., .05)).rotate(90, 1, 0, 0) | |
| .translate(0.75, 0, 0), 12).material(mat) | |
| .texture(h.texture()), | |
| Plane().material(mat) | |
| )//.background(Vec3(.5)) | |
| .light(Light(Vec3(1, 2, 3), Vec3(.75))) | |
| //.post( rays = Godrays() ) | |
| .render(5, true) | |
| onframe = t => { | |
| pr.rotate(10 * t, 0, 1, 0) | |
| tr.rotate(15 * t, -1, 0, 0) | |
| } | |
| }) | |
| // 10 Mar 2021 | |
| col1 = Vec3(0.25, .25, 0.1) | |
| col2 = Vec3(10.75, 0, 0) | |
| mat1 = Material('phong', col1, col1, 1) | |
| mat2 = Material('phong', col2, col2, 1) | |
| march( | |
| diff = Difference(Box(.6), pr = Repeat(Torus().rotate(90, 1, 0, 0), 1)).material(mat2) | |
| .scale(1.5) | |
| ).background(Vec3(.1)) | |
| .light(Light(Vec3(1, 2, 4), Vec3(1))) | |
| .post(Focus(), Godrays()) | |
| .render(10, true) | |
| onframe = t => { | |
| pr.rotate(45 * t, 1, -1, 0) | |
| diff.rotate(30 * t, 0, 1, 1) | |
| } | |
| ///////////////// | |
| // 11 - Spherical Differences | |
| march( | |
| Difference( | |
| mb = Mandelbulb(), | |
| Sphere(.975) | |
| ).rotate(90, 1, 0, 0).material('red') | |
| ).render('fractal.high', true) | |
| onframe = t => { | |
| mb.rotate(30 * t, 0, 1, 0) | |
| mb.fold = 3 + sin(t * 0.125) * 4 | |
| } | |
| //// | |
| // 12 - Checkered Union | |
| dif = StairsUnion(tr = Torus(Vec2(1.5, .2)), oh = Octahedron()).rotate(30, 1, 1, 0).texture('checkers') | |
| march( | |
| dif | |
| ).background(.8).render(10, true) | |
| onframe = t => { | |
| oh.rotate(t * 30, 1, 1, 0) | |
| tr.rotate(t * 30, -1, 0, 0) | |
| } | |
| // 13 - Mechanised Cephalopods | |
| col1 = Vec3(7) | |
| col2 = Vec3(.5, 0.125, 0.9) | |
| mat1 = Material('phong', col1, col1, .91) | |
| mat2 = Material('phong', col2, col2, .1) | |
| march( | |
| su = StairsUnion( | |
| tr1 = PolarRepeat(Torus(Vec2(.972, 0.12)).rotate(90, 1, 0, 0), 8), | |
| Capsule().translate(-.5, -.5, 0) | |
| , .4 | |
| ).material(mat1) | |
| ) | |
| .light(Light(Vec3(4, -1, 4), Vec3(0.35, .125, .25), .2, .1)) | |
| .background(.25) | |
| .post(Focus(.1)) | |
| .render(5, true) | |
| onframe = t => { | |
| tr1.rotate(t * 30, 0, 1, 0) | |
| su.rotate(t * 30, 0, sin(t / 4) * 0.8, 0.2) | |
| } | |
| // 14 - Shadow of Roses | |
| march( | |
| pr = PolarRepeat( | |
| ju = Julia(), | |
| 6 | |
| ).material('red').translate(0, .5), | |
| Plane().rotate(30, 1, 0, 0).material('white') | |
| ) | |
| .post(f = Focus(.45)) | |
| .light(Light(Vec3(2, 2, 3), Vec3(0.5, .51, .45))) | |
| .render('fractal.high', true) | |
| onframe = t => { | |
| pr.rotate(30 * t, 0, 1, 0) | |
| ju.fold = 1 + sin(t * 0.06125 * .5) * 2 | |
| } | |
| // 15 - Mental Monday | |
| march( | |
| mb = Mandelbulb() | |
| .material(Material('phong', Vec3(.0), Vec3(.5), Vec3(1), 32, Vec3(0))), | |
| Plane(Vec3(0, 0, 1), 0.5).material('white glow') | |
| ) | |
| .fog(.1, Vec3(0.5)) | |
| .background(Vec3(.5)) | |
| .light( | |
| l1 = Light(Vec3(-1, 1, 4), Vec3(1), 0.25), | |
| l2 = Light(Vec3(-2, 1, 4), Vec3(1), 0.25) | |
| ) | |
| .render('fractal.high') | |
| .camera(0, 0, 4) | |
| onframe = t => { | |
| mb.fold = 3 + (sin(t * 0.0625) * 5) | |
| } | |
| // 16 - Two Worlds | |
| use('hydra').then(() => { | |
| h = Hydra() | |
| solid() | |
| .add( | |
| shape(2) | |
| .scale(0.1) | |
| .rotate(0.000001) | |
| ) | |
| .modulate( | |
| noise(() => 5 + 0.01).scale(10, 0.1) | |
| ) | |
| .scale(2, 1, 5).out(o1) | |
| src(o1) | |
| .scrollX([0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2].ease('easeInOutCubic').fast(0.25)) | |
| .kaleid(200) | |
| .add( | |
| src(o1) | |
| .scrollY(0.75) | |
| .kaleid(4) | |
| .rotate([Math.PI * 0.25, Math.PI * 0.5, Math.PI * 0.75, Math.PI * 1.01, Math.PI * 1.25, Math.PI * 1.5].ease('easeInCubic').fast(0.25)), () => (time * 0.0125 % 1) * 2 - 1) | |
| .scale(.125, 1, () => window.innerWidth / window.innerHeight).contrast().out() | |
| march( | |
| sp = Sphere(1.5) | |
| .material('black') | |
| .texture(h.texture()) | |
| ).background(Vec3(.5)) | |
| .render(5, true) | |
| onframe = t => { | |
| sp.rotate(t * 30, 0, sin(t / 4) * 0.8, 0.2) | |
| } | |
| }) | |
| // 17 Mar - Army of Jupiters | |
| march( | |
| rpt = Repeat( | |
| un = Union(Sphere(.2), tr = Torus()), | |
| 2, 2 | |
| ).material('black') | |
| ).post(Godrays()) | |
| //.fog( .1, Vec3(0,0,.25) ) | |
| .background( Vec3(.5) ) | |
| .render(10, true) | |
| onframe = t => { | |
| un.rotate(t * 90, 0, sin(t), 0.5) | |
| rpt.rotate(3 * t, 1, -1, 0) | |
| } | |
| // 18 - Sphere Flowers | |
| march( | |
| StairsDifference( | |
| Sphere(1.2), | |
| rpt = PolarRepeat( | |
| Octahedron(), | |
| 6, .6 | |
| ) | |
| ) | |
| ) | |
| .background(Vec3(.7)) | |
| .render(10, true) | |
| onframe = t => { | |
| rpt.rotate(t * 30, 0, 1, -1) | |
| rpt.count = 3 + sin(t * 0.125) * 6 | |
| } | |
| // 19 - Spy Theme | |
| use('hydra').then(() => { | |
| h = Hydra() | |
| solid(1) | |
| .mult(src(s0).mult(shape(30, 0.8).scrollY(0.1)).scrollY(-0)) | |
| .scale(-1, 1, () => window.innerWidth / window.innerHeight).contrast() | |
| .repeat() | |
| .out() | |
| march( | |
| sp = Box(1.4) | |
| .texture(h.texture()) | |
| ).background(Vec3(.5)) | |
| .render(5, true) | |
| // | |
| onframe = t => { | |
| sp.rotate(t * 30, 0, -1, 0) | |
| } | |
| }) | |
| s0.initCam(0) | |
| // 20 - Bulbus Fragments | |
| mat1 = Vec3(0.8, 0.7, .35) | |
| march( | |
| si = StairsIntersection( | |
| ju = Julia(.875).scale(2).rotate(90, 0, 0.5, 1), rpt = Repeat(Sphere(.1), .15), .125) | |
| .material(Material('phong', mat1, mat1, Vec3(0.2, 0.1, 0), 2, Vec3(0))) | |
| ).light( | |
| l1 = Light(Vec3(3, 0, 3), Vec3(0.25), 0.125), l2 = Light(Vec3(-2, 0, 2), Vec3(0.125), 0.4) | |
| ).background(Vec3(.2)).render('fractal.high') | |
| onframe = t => { | |
| rpt.rotate(t * 20, 0, -1, 0) | |
| rpt.distance = .21 + sin(t * .125) * .12 | |
| ju.fold = 1 | |
| } | |
| // 21 - Lockdown | |
| march( | |
| si = StairsDifference( | |
| Box().material('white'), | |
| repeat = Repeat( | |
| sphere = Sphere(.0125), | |
| Vec3(.5) | |
| ), | |
| .125 | |
| ) | |
| ).post(Focus()) | |
| .light( | |
| l1 = Light(Vec3(3, 0, 3), Vec3(0.25), 0.125), l2 = Light(Vec3(-2, 2, 2), Vec3(0.125), 0.24) | |
| ).background(Vec3(.2)) | |
| .render(10, true) | |
| // start our FFT | |
| FFT.start() | |
| // animate | |
| onframe = time => { | |
| si.rotate(time * 15, 0, 1, 1) | |
| repeat.distance.x = FFT.low // - .32 | |
| repeat.distance.y = FFT.mid - .32 | |
| repeat.distance.z = FFT.high | |
| sphere = FFT.mid * FFT.high | |
| } | |
| // 22 - Drifting out of Focus | |
| march( | |
| Twist( | |
| mb = PolarRepeat( | |
| Box().scale(.24).rotate(30, 1, 0, 1).material('white'), | |
| 6 | |
| ) | |
| , Vec2(1.2) | |
| ) | |
| ).background(Vec3(.2)) | |
| .post( f = Focus() ) | |
| .fog( .15, Vec3(0) ) | |
| .render('high') | |
| onframe = t => { | |
| camera.pos.z = 2 + cos(t * 0.124) * .5 | |
| f.depth = sin(t * 0.126) * .15 | |
| mb.rotate(t * 15, -1, -1, -1) | |
| } | |
| // change width of focus | |
| f.radius = .05 | |
| f.depth = .15 | |
| // 23 - Happy Birthday Shaan! | |
| use('hydra').then(() => { | |
| h = Hydra() | |
| osc(20,0.1,1).rotate(10,0.6).pixelate(20,20).modulateKaleid( voronoi(5,0.3,0.3),4).out(o0); | |
| march( | |
| Repeat(sp = HexPrism(1.5), .2) | |
| .material('blackhole') | |
| .texture(h.texture()) | |
| ).background(Vec3(.5)) | |
| .render(5, true) | |
| onframe = t => { | |
| sp.rotate(t * 30, 0, sin(t / 4) * 0.8, 0.2) | |
| } | |
| }) | |
| // 24 - Twisted Toroidals | |
| mat1 = Material( 'phong', .05, 1, .5 ) | |
| // | |
| objs = [] | |
| for(let i = 0; i < 8; i++) { | |
| torus = Torus( v2(i * .25, i * .015) ) | |
| .rotate( 15 * i, 0, sin(i), cos(i) ) | |
| .material( mat1 ) | |
| objs[i] = torus | |
| } | |
| // | |
| mat = Material( 'phong', v3(0), v3(.1), v3(.25) ) | |
| tori = objs.reduce( ( current, next ) => this.Union( current, next ) ) | |
| // | |
| march( | |
| tw = Twist(tori, Vec2(.1, .4)) | |
| , Plane( v3(0,0,1), 1).material( mat ).translate(0, 0, -1) | |
| ) | |
| .light( | |
| l1 = Light(Vec3(-1, 1, -4), Vec3(0, 0, .31), 0.25), | |
| l2 = Light(Vec3(-2, 2, 5), Vec3(.51), 0.125) | |
| ).post(f = Focus(.15, .15)) | |
| .render('high') | |
| .camera( 0,0, 5 ) | |
| // | |
| onframe = t => { | |
| tori.rotate(t * 30, 0, 1, -1) | |
| f.depth = sin(t * 0.126) * .15 | |
| } | |
| // 25 - Stolen Ideas | |
| objs = [] | |
| for(let i = 0; i < 6; i++) { | |
| cy = Difference( | |
| Cylinder( Vec2(i * .24,.9) ), | |
| Cylinder( Vec2(i * .23,1) ) | |
| ).rotate(5 * i, 1, 0, 0) | |
| objs[i] = cy | |
| } | |
| // | |
| mat = Material( 'phong', Vec3(0), Vec3(.1), Vec3(.25) ) | |
| cys = objs.reduce( ( current, next ) => this.Union( current, next ) ) | |
| // | |
| march( | |
| tw = Union(cys.material('white'), Sphere(.12).move(0, .78, .04).material('black')).rotate(90, 1, .8, 0) | |
| , Plane( Vec3(0,0,1), 1).material( mat ).translate(0, 0, -1) | |
| ) | |
| .light( | |
| l1 = Light(Vec3(2, 1, 4), Vec3(.91), 0.25), | |
| l2 = Light(Vec3(-2, 2, 5), Vec3(.81), 0.25) | |
| ) | |
| .post(f = Focus(.15, .15)) | |
| .render('high') | |
| // | |
| onframe = t => { | |
| cys.rotate(t * 30, 0, 1, 0) | |
| } | |
| // 26 - Falling Time | |
| objs = [], sp = [] | |
| for(let i = 0; i < 12; i++) { | |
| cy = Difference( | |
| sp[i] = Sphere(.4), Torus(Vec2(0.4, 0.42)) | |
| ).rotate(15 * i, 1, 0, 0).move(cos(i) * 2, sin(i) * 2, 0) | |
| objs[i] = cy | |
| } | |
| // | |
| cys = objs.reduce( ( current, next ) => this.Union( current, next ) ) | |
| // | |
| march( | |
| cys.material('white') | |
| ).background(.35) | |
| .light(Light(Vec3(1, 2, 4), Vec3(.81))) | |
| .post(Antialias()) | |
| .render('high').camera(0, 0, 6) | |
| // | |
| onframe = t => { | |
| cys.rotate(t * 30, 0, 1, 0) | |
| for(let i = 0; i < 12; i++) { | |
| objs[i].rotate(15 * (i+2) * t, 1, 0.2, 0.5) | |
| } | |
| } | |
| // 27 - Evil Eye | |
| use('hydra').then(() => { | |
| h = Hydra() | |
| osc(200,0.1,1).kaleid(2.3).rotate(1.57).out(); | |
| march( | |
| Difference( | |
| pl = Plane().rotate(45, 1, 0, 0), | |
| Repeat(tr = Torus(Vec2(.5, .2)), .8) | |
| ).material('normal'), | |
| sp = Box(.7).rotate(90, 1, .5, 0)//.material(mat) | |
| .material('blackhole') | |
| .texture(h.texture()) | |
| ).render('high') | |
| // | |
| onframe = t => { | |
| gr = pow(sin(3.14 * t / 2) + 1, .5) | |
| tr.rotate(30 * t, 1, 0, 0) | |
| sp.move(0, gr) | |
| sp.rotate(gr * 30, -1, 0, 0) | |
| } | |
| }) | |
| // 28 - Shattered | |
| use('hydra').then(() => { | |
| h = Hydra() | |
| voronoi().out(); | |
| march( | |
| bb = Bump(Box(), h.texture(), .4) | |
| .material('white') | |
| ).background(Vec3(.61, 0, .81)).render('high') | |
| onframe = t => { | |
| tt = 1 - pow(abs(t), 1.) | |
| bb.rotate(tt * 30, 1, sin(t), 0) | |
| } | |
| }) | |
| // 29 - Big Guns | |
| colorsA = [] | |
| colorsA[0] = Vec3(0.86,0.22,0.27); | |
| colorsA[1] = Vec3(0.92,0.49,0.07); | |
| colorsA[2] = Vec3(0.91,0.89,0.26); | |
| colorsA[3] = Vec3(0.0,0.71,0.31); | |
| colorsA[4]= Vec3(0.05,0.35,0.65); | |
| colorsA[5] = Vec3(0.38,0.09,0.64); | |
| colorsA[6]= Vec3(.9,0.758,0.798); | |
| colorsA[7] = Vec3(0.361,0.969,0.282); | |
| colorsA[9] = Vec3(0.396,0.878,0.878); | |
| colorsA[10] = Vec3(1.0, 0.189, 0.745); | |
| colorsA[11] = Vec3(0.96, 0.474, 0.227); | |
| objs = [] | |
| size = .5 | |
| thickness = .86 | |
| const t = size - (size * .5) | |
| for(let i = 1; i < 5; i++) { | |
| const s = size * i | |
| bm1 = Mirror(Box(size * thickness).translate( t, 0, 0)) | |
| bm2 = Mirror(Box(size * thickness).translate( t, 0, 0)).rotate(90, 0, 1, 0) | |
| bm3 = Mirror(Box(size * thickness).translate( t, 0, 0)).rotate(90, 0, 0, 1) | |
| un2 = Union2(bm1, bm2, bm3) | |
| mat = Material('phong', colorsA[i+1], colorsA[i+1], .9) | |
| und = Difference(Box(size), un2).scale(.5 * i).material(mat) | |
| objs.push(und) | |
| } | |
| uns = objs.reduce( ( current, next ) => this.Union( current, next ) ) | |
| march( | |
| uns | |
| ) | |
| .light( | |
| l1 = Light(Vec3(2, 1, 4), Vec3(.91), 0.5), | |
| l2 = Light(Vec3(-1, 2, 5), Vec3(.81), 0.25) | |
| ) | |
| .background( Vec3(.125) ) | |
| .post(Edge(), Focus(.2, .0125)) | |
| .render('high') | |
| bins = [100,200,400,800,1600,3200,6400,12800,22050] | |
| FFT.start(bins) | |
| onframe = t => { | |
| for(let i = 0; i < objs.length; i++) { | |
| objs[i].rotate(90 * t * (i+2) * .25, 0, sin(t) * (i + 1) * .3, (i + 1) * .3) | |
| uns.scale(FFT[2] + .2) | |
| } | |
| } | |
| // 30 - Teleport! | |
| use('hydra').then(() => { | |
| h = Hydra() | |
| osc(10, 0, 1).rotate(1.57).out(); | |
| march( | |
| //rpt = Repeat( | |
| StairsUnion( | |
| bx = Box(.5), | |
| Repeat(tor = Torus(.11, 2), .25), | |
| .5, | |
| 5 | |
| ).material('blackhole').texture(h.texture()), | |
| Plane().texture('dots', { | |
| strength: -.5, | |
| scale: 2, | |
| color: [.1, .2, .1] | |
| }) | |
| ) | |
| .background(Vec3(.125)) | |
| .render('high', true) | |
| .camera(0, 0, 3) | |
| // | |
| onframe = t => { | |
| bx.rotate(90 * t, 0, 1, 0) | |
| tor.move(0, ((t * .5) % 1) * 2 - 1) | |
| } | |
| }) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment