I started experimenting more in Unity. First, I worked on converting some point cloud stuff I was doing in TouchDesigner to Unity's compute shaders. The screen capture didn't come out too well, but it runs at about 100fps.
I also started building a whip weapon in the style of Dr. Strange-meets-vaporwave. It really needs to be in VR for the full effect.
29 June 2017
12 April 2017
Melange dev
Some quick videos showing my Masters project, Melange. The strings are used as waveforms to sonify the fluid field.
Strings visible:
Turning up string velocity feedback:
Strings visible:
Turning up string velocity feedback:
10 April 2017
150 Media Stream
Last month I flew to Chicago to get my piece Cirrus running on 150 Media Stream. The LED wall is 150' x 22' and runs four 4k streams across five computers. Cirrus is a live real time fluid dynamics + reaction-diffusion simulation.
Videos are sped up 5x.
19 March 2017
Spring-mass GLSL
This spring-mass system was adapted to the GPU in GLSL from Paul Bourke's example. I'm using it to sonify the fluid in a way that allows for more structure and flexibility than directly sampling the velocity field. I'll post more about this technique in the future.
The system uses a 1024 x 4 texture map with simple one-dimensional spring connections that bind each pixel to its horizontal neighbor, forming 4 lines. I extended Paul's example to include an anchor force which pulls the particles back to a rest position (in this case concentric rings), and an impulse force that applies velocity from an outside source.
layout(location=0) out vec3 fragColorPosition; layout(location=1) out vec3 fragColorVelocity; uniform float dt; uniform float springConstant; uniform float restLength; uniform float dampingConstant; uniform float viscousDrag; uniform float anchorForce; uniform float impulseForce; uniform float mass; uniform float fluidLengthThreshold; vec2 springs[2] = vec2[2](vec2(-1.,0.), vec2(1.,0.)); const int POSITION_OLD = 0; const int VELOCITY_OLD = 1; const int VELOCITY_NEW = 2; const int ANCHOR = 3; const float smallf = 0.000001; void main() { // Calculate forces vec3 pos0 = texture(sTD2DInputs[POSITION_OLD], vUV.st).xyz; vec3 vel0 = texture(sTD2DInputs[VELOCITY_OLD], vUV.st).xyz; vec3 vel_new = texture(sTD2DInputs[VELOCITY_NEW], pos0.xy).xyz; vec3 anchor = texture(sTD2DInputs[ANCHOR], vUV.st).xyz; vec3 force = vec3(0.); force -= viscousDrag * vel0; force += vel_new * dt * dt * impulseForce; force += (anchor-pos0) * anchorForce; // spring interaction // 1d horizontal connection float cellSize = uTD2DInfos[POSITION_OLD].res.x; // 1/width for (int i = 0; i < 2; i++) { vec2 offset = vec2(cellSize, 0.); offset *= springs[i]; vec2 coord = vUV.st + offset; if (coord.x < 0.) coord.x = 1.-cellSize; if (coord.x > 1.) coord.x = 0.+cellSize; vec3 pos1 = texture(sTD2DInputs[POSITION_OLD], coord).xyz; vec3 vel1 = texture(sTD2DInputs[VELOCITY_OLD], coord).xyz; vec3 dx = pos0 - pos1; float len = length(dx) + smallf; vec3 f = vec3(springConstant * (len - restLength)); f += dampingConstant * (vel0 - vel1) * dx/vec3(len); f *= -dx/vec3(len); force += f; } // Apply derivative vec3 dpdt = vel0; vec3 dvdt = force/vec3(mass); pos0 += dpdt * dt; vel0 += dvdt * dt; fragColorPosition = pos0; fragColorVelocity = vel0; } //main
19 February 2017
12 February 2017
150 Media Stream
Pieces are coming together for the media wall installation in Chicago. It has a website now:
150mediastream.com
Here are some photos of a test shoot of my fluid work that I'm now calling Cirrus. They only had one half of the display working:
150mediastream.com
Here are some photos of a test shoot of my fluid work that I'm now calling Cirrus. They only had one half of the display working:
Subscribe to:
Posts (Atom)