chair for vellum furniture competition
anychair

An exploration as a part of thesis, anychair was a study in adaptive systems and their place in furniture. A simple seat tenuously rests upon four gas cylinders keeping the whole system completely dynamic. Once weight is applied to the chair, the cylinders engage and the chair rests upon the steel columns in their place.

Initially, the chair was designed to be a fashioned after the seats that so commonly make up classrooms everywhere (the wild legs acting in stark contrast). The chair transitioned to an topologically singular back in order to place the focus on the legs themselves, but comprised of a top and bottom bolted together with a neoprene spacer.
The chair was meant to have the same twisting, strained posture of the classical contrapposto with a sexy modern lightness.

function positionOffset() {
    var prevCookie = sessionStorage.getItem("compy");

    if (prevCookie == null) {
        var askWhich = prompt("which order?", "number");
        sessionStorage.setItem("compy", askWhich);

        // refreshAt(11,02,00);
    } else {
        prevCookie
        // refreshAt(11,02,00);
    }
}

positionOffset();

function refreshAt(hours, minutes, seconds) {
    var now = new Date();
    var then = new Date();

        if(now.getHours() > hours ||
            (now.getHours() == hours && now.getMinutes() > minutes) ||
            now.getHours() == hours && now.getMinutes() == minutes && now.getSeconds() >= seconds) {
            then.setDate(now.getDate() );
        }
        then.setHours(hours);
        then.setMinutes(minutes);
        then.setSeconds(seconds);

    var timeout = (then.getTime() - now.getTime());
    setTimeout(function() {

        tl.play()
        // window.location = window.location
    }, timeout);
}


var target1 = document.querySelector('.banner');
var target2 = document.querySelector('.banner2');
var target3 = document.querySelector('.banner3');

var windowNumber = sessionStorage.getItem("compy");
var place = eval(windowNumber) + 1;

// striptease logo across the screens and video per screen
var logoReplace = "<img id='logoImage' src='tape/svg_logo/full_banner-" + eval(place) + ".svg' />";
$('#striptease').append(logoReplace);

var videoReplace = "<video id='initialVideo' src='tape/initial/start-" + eval(place) + ".mp4' width='1024px' height='768px'></video>";
$('#video').append(videoReplace);

// total length of the image wall
// minus the initial images
var imageDistance = -21304;
var screenWidth = 1024;

var loopTime = 750;
var animationSpeed = -(imageDistance / loopTime);

var seekOffset = (screenWidth * windowNumber) / animationSpeed;
console.log(animationSpeed + ' pixels per second');
console.log(Math.round(seekOffset * 100)/100 + ' seconds elapsed');

var tl = new TimelineMax({repeat: Infinity});

tl.add(new TweenMax(target3, loopTime, {ease: 'linear', x: imageDistance}));

tl.pause();
tl.seek(seekOffset);


var banner = document.querySelector('#striptease');
var pusher = new Pusher('5a166c5d1895c86b8179');

var channel = pusher.subscribe('events');
    channel.bind('pause', function(data) {
        $('#striptease img').fadeIn(400);
    });
    channel.bind('play', function(data) {
        $('#striptease img').fadeOut(400);
    });
    channel.bind('refresh', function(data) {
        window.location = window.location;
    });
    channel.bind('start', function(data) {

        $('#striptease img').show();
        $('#striptease div').fadeOut(300);
        tl.play();
        setTimeout(function(){
            $('#striptease img').fadeOut(400);
        }, 3000);
    });
    channel.bind('fuck', function(data) {

        $('#video').show();
        var player = document.getElementById('initialVideo');
        player.play();

        setTimeout(function(){
            tl.play();

            $('#striptease div').hide(0);
            $('#striptease img').show();

            $('#video').hide(0);

            setTimeout(function(){
                $('#striptease img').fadeOut(400);
            }, 6000);

        }, 20000);
    });

var channelUser = pusher.subscribe(windowNumber);

//Store frame for motion functions
var previousFrame = null;

// Set-up Working Canvas
var canvas = document.getElementById("displayArea");
//canvas.setAttribute("width", window.innerWidth);
//canvas.setAttribute("height", window.innerHeight);
var canvasElement = document.getElementById("displayArea");
var displayArea = canvasElement.getContext("2d");

//Set-up Hand Circles
var stage = new Kinetic.Stage({
    container: 'stage',
    width: 1024,
    height: 768
});


var tips = new Array(2);
var layer = new Kinetic.Layer();

// two circles for, one for each hand
for (var t = 0; t <2; t++) {
    var tip = new Kinetic.Circle({
        x: (1024/4),
        y: (768/4),
        radius: 10,
        fill: "rgb(0,0,0)",
        stroke: "rgb(255,255,255)",
        strokeWidth: 4,
        opacity: .75,
        visible: false
    });
    tips[t] = tip;
    layer.add(tip);
}



// end of the shit


//Setup Leap loop with frame callback functions
var controller = new Leap.Controller({
    enableGestures: true,
    frameEventName: 'animationFrame'
});

img img