Diamond Theory

October 22nd, 2012

Kyle McDonalds has recently posted on Twitter, about porting graphics from old issues of COMPUTER Graphics and Art. Here is my attempt to visualize the “Diamond Theory” by Steven H. Cullinane, I found in the issue from Feb, 1977.

Diamond Theory from Kamen Dimitrov on Vimeo.

DSLR + Kinect Mount

October 16th, 2012

My Manfrotto kit just arrived and the first thing I wanted to try is to get my DSLR and Kinect mounted together, so I could do some experiments with RGBD Toolkit. The mount is pretty basic – 2xManfrotto Super Clamp and one Manfrotto Tilt-Top head, this setup is pretty solid once you get all handles tighten up! Here are some photos:

Digital Blender

October 3rd, 2012

I have been wanting to do some experiments with mixing real and digital objects, and projection mapping for a while now. So when I saw my sad blender in the corner of my kitchen, a light bulb flashed over my head and I decided that my blender will be perfect for making some “digital cubes” smoothies!

That’s just a taste:

Kinect Triangulation to SVG (FREE OSX App)

September 11th, 2012

Here is a little tool for OSX, I made with Openframeworks. It’s an app for turning Kinect triangulated blobs into SVG files. Please note that you need a Kinect camera plugged in to use this!

You can download it here: KinectToSVG.zip

Usage:

) Unzip in a folder and do not delete the “data/” folder.
) Plug-in your Kinect
) Stay close to it, around 1-1.5m
) Press ‘space’ to save your SVG
) Your SVG is saved in the “data/” folder with the name “mesh.svg”, it will overwrite the file, everytime you save!
) Have fun!

* Props to Marek Bereza and his Kinect blob triangulation code found in https://github.com/HellicarAndLewis/Triptych

Openframeworks Experiments

September 10th, 2012

I have been playing around, doing some experiments with Openframeworks lately. Here are some of the results, I will post the code, if somebody is interested.

Earth – is a unrealistic visualisation of the earth and some flying fireballs between random countries :)

Twitter Particles – is a realtime Twitter visualisation, using particles.
Source Code: https://github.com/kamend/TwitterParticles

3D Generative Ribbons

July 30th, 2012

I spent few hours to port a 3d Ribbons Processing example to Openframeworks, it turned out pretty great, especially combined with ofxFX.

Here is the source code, if somebody wants to play around!

Long Exposure Kinect Clouds

June 25th, 2012

I have been thinking about this idea for a long time, so tonight, I though to give it a quick go. I think the results turned out pretty interesting: unique Kinect point clouds and colors. The setup is pretty much self explanatory: a projector beaming the Kinect cloud on a while wall, with a custom software I made with Openframeworks, my DSLR pointed directly at the wall and connected via USB so I could shoot remotely and of course me, making a fool of my self in front of the Kinect sensor.














My personal favourite:

The next step is calibrating the Kinect with the projector and beaming the clouds directly over myself, results coming soon!

Perlin Noise and GLSL

June 21st, 2012

After reading this post on Creative Applications and then going to Inigo Quilez’s website and reading his post about warping, I decided to have some fun with GLSL, Perlin Noise and Openframeworks. The results are just beautiful:

I am just posting a small code example I did, if somebody wants to take things further or just play around.

Openframeworks Draw Code:

    ofBackground(0, 0, 0);
    shader.begin();
    shader.setUniform1f("time", ofGetFrameNum() * 0.001);
    ofRect(0,0,1024,768);
    shader.end();

Vertex Shader:

uniform float time;

void main() {
     gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

Fragment Shader:

uniform float time;

vec4 mod289(vec4 x)
{
    return x - floor(x * (1.0 / 289.0)) * 289.0;
}

vec4 permute(vec4 x)
{
    return mod289(((x*34.0)+1.0)*x);
}

vec4 taylorInvSqrt(vec4 r)
{
    return 1.79284291400159 - 0.85373472095314 * r;
}

vec2 fade(vec2 t) {
    return t*t*t*(t*(t*6.0-15.0)+10.0);
}

// Classic Perlin noise
float cnoise(vec2 P)
{
    vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0);
    vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0);
    Pi = mod289(Pi); // To avoid truncation effects in permutation
    vec4 ix = Pi.xzxz;
    vec4 iy = Pi.yyww;
    vec4 fx = Pf.xzxz;
    vec4 fy = Pf.yyww;
    
    vec4 i = permute(permute(ix) + iy);
    
    vec4 gx = fract(i * (1.0 / 41.0)) * 2.0 - 1.0 ;
    vec4 gy = abs(gx) - 0.5 ;
    vec4 tx = floor(gx + 0.5);
    gx = gx - tx;
    
    vec2 g00 = vec2(gx.x,gy.x);
    vec2 g10 = vec2(gx.y,gy.y);
    vec2 g01 = vec2(gx.z,gy.z);
    vec2 g11 = vec2(gx.w,gy.w);
    
    vec4 norm = taylorInvSqrt(vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));
    g00 *= norm.x;  
    g01 *= norm.y;  
    g10 *= norm.z;  
    g11 *= norm.w;  
    
    float n00 = dot(g00, vec2(fx.x, fy.x));
    float n10 = dot(g10, vec2(fx.y, fy.y));
    float n01 = dot(g01, vec2(fx.z, fy.z));
    float n11 = dot(g11, vec2(fx.w, fy.w));
    
    vec2 fade_xy = fade(Pf.xy);
    vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x);
    float n_xy = mix(n_x.x, n_x.y, fade_xy.y);
    return 2.3 * n_xy;
}

// Classic Perlin noise, periodic variant
float pnoise(vec2 P, vec2 rep)
{
    vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0);
    vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0);
    Pi = mod(Pi, rep.xyxy); // To create noise with explicit period
    Pi = mod289(Pi);        // To avoid truncation effects in permutation
    vec4 ix = Pi.xzxz;
    vec4 iy = Pi.yyww;
    vec4 fx = Pf.xzxz;
    vec4 fy = Pf.yyww;
    
    vec4 i = permute(permute(ix) + iy);
    
    vec4 gx = fract(i * (1.0 / 41.0)) * 2.0 - 1.0 ;
    vec4 gy = abs(gx) - 0.5 ;
    vec4 tx = floor(gx + 0.5);
    gx = gx - tx;
    
    vec2 g00 = vec2(gx.x,gy.x);
    vec2 g10 = vec2(gx.y,gy.y);
    vec2 g01 = vec2(gx.z,gy.z);
    vec2 g11 = vec2(gx.w,gy.w);
    
    vec4 norm = taylorInvSqrt(vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));
    g00 *= norm.x;  
    g01 *= norm.y;  
    g10 *= norm.z;  
    g11 *= norm.w;  
    
    float n00 = dot(g00, vec2(fx.x, fy.x));
    float n10 = dot(g10, vec2(fx.y, fy.y));
    float n01 = dot(g01, vec2(fx.z, fy.z));
    float n11 = dot(g11, vec2(fx.w, fy.w));
    
    vec2 fade_xy = fade(Pf.xy);
    vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x);
    float n_xy = mix(n_x.x, n_x.y, fade_xy.y);
    return 2.3 * n_xy;
}

float fbm(vec2 P, int octaves, float lacunarity, float gain)
{
	float sum = 0.0;
	float amp = 1.0;
    vec2 pp = P;
    
	int i;
	
	for(i = 0; i < octaves; i+=1)
	{
        amp *= gain; 
		sum += amp * cnoise(pp);
        pp *= lacunarity;
    }
	return sum;

}


float pattern(in vec2 p) {
    float l = 2.5;
    float g = 0.4;
    int oc = 10;
    
    vec2 q = vec2( fbm( p + vec2(0.0,0.0),oc,l,g),fbm( p + vec2(5.2,1.3),oc,l,g));
    vec2 r = vec2( fbm( p + 4.0*q + vec2(1.7,9.2),oc,l,g ), fbm( p + 4.0*q + vec2(8.3,2.8) ,oc,l,g));
    return fbm( p + 4.0*r ,oc,l,g);    
}

float pattern2( in vec2 p, out vec2 q, out vec2 r , in float time)
{
    float l = 2.3;
    float g = 0.4;
    int oc = 10; 
    
    q.x = fbm( p + vec2(time,time),oc,l,g);
    q.y = fbm( p + vec2(5.2*time,1.3*time) ,oc,l,g);
    
    r.x = fbm( p + 4.0*q + vec2(1.7,9.2),oc,l,g );
    r.y = fbm( p + 4.0*q + vec2(8.3,2.8) ,oc,l,g);
    
    return fbm( p + 4.0*r ,oc,l,g);
}

void main() {
    
    vec2 q = gl_FragCoord.xy / vec2(640.0,480.0);
    vec2 p = -1.0 + 2.0 * q;
    vec2 qq;
    vec2 r;
    float color = pattern2(p,qq,r,time);
    
    vec4 c = vec4(color,color,color,color);
    c *= 3.5;
    
    gl_FragColor = c;
}

FLORA – Interactive Installation

May 28th, 2012

Here is a short documentary of the installation we did for the Burgas Contemporary Festival 2012. The installation utilize Openframeworks for receiving and sending motion sensor data, Resolume for visualisation and MadMapper + Syphon for spreading and mapping the whole content over the building.

Cinema4d + Boujou + After Effects

May 16th, 2012

Here is the result of a day spent with Boujou, Cinema 4d and After Effects. If somebody has any questions how it has been done, feel free to ask me.