Looking Outward – 05

Eugene Golovanchuk (aka Skeeva) is an art director and 3D digital artist. His artwork uses “3D dark art surrealism, captivating in its cyberpunk flare.” Much of his work has a focus on fashion, developing outfits digitally. I chose to look specifically at his project “Oversized” made in March 2020 which was one of his personal projects where he wanted to learn how to use “Marvelous Designer” to simulate clothing and animation. This project shows animations of three different outfits (with a focus on oversized coats), and the video above shows the first outfit of the series. He uses imagery and animation to show off the garments he designed, and they are so cool. His artwork is fascinating as it seems so real, yet so out of this world and like nothing I have ever seen before. The patterns and textures are mesmerizing. I think this is also very interesting because so much of fashion is about texture and materiality, and Skeeva is able to achieve this kind of detail all through a computer.

Title: Oversized
Artist: Eugene Golovanchuk (Skeeva)
Link: https://theskeeva.com/oversized
https://theskeeva.com/work

Project 04 String Art

Throughout this project, I felt it was a little difficult to figure out what I wanted to create, but it was interesting to consider how forms could appear with the use of repeated lines. Originally, I was thinking about a butterfly with the ground and sky as a background, but I decided to use translate and rotate to twist the ground to instead become colorful lines emphasizing the butterfly’s movement (instead of the ground) which I think makes it a little more fun and dynamic.

project3

// Rachel Legg / rlegg / Section C

var dx1;
var dy1;
var dx2;
var dy2;
var dx3;
var dy3;
var dx4;
var dy4;
var numLines = 15;

function setup() {
    createCanvas(300, 400);
    background(0);
}

function draw() {

 background(0);
    
    //move over orgin and rotate so aligns w/ butterfly
    push();   
    translate(-132, -20);  
    rotate(radians(15));


    //light blue lines toward center @ slant
    stroke(0);
    strokeWeight(1);
    line(0, 300, 10, 390);
    line(250, 250, 200, 350);
    dx1 = (10-0)/numLines;
    dy1 = (390 - 300)/numLines;
    dx2 = (350-250)/numLines;
    dy2 = (200 - 250)/numLines;


    stroke(135, 206, 235);    //lightblue 
    var x1 = 0;
    var y1 = 400;
    var x2 = 180;
    var y2 = 300;
    for (var i = 0; i <= numLines; i += 1){
        line(x1, y1, x2, y2);
        x1 += dx1;
        y1 += dy1;
        x2 += dx2;
        y2 += dy2;
    }

    //layer and tranlate green group to the right
    push();
    translate(0, 25);
    rotate(radians(-15));    //more tilt and move orgin
    noStroke();
    strokeWeight(1);
    line(0, 300, 10, 390);
    line(250, 250, 200, 350);
    dx1 = (10-0)/numLines;
    dy1 = (390 - 300)/numLines;
    dx2 = (350-250)/numLines;
    dy2 = (200 - 250)/numLines;


    stroke(144, 238, 144);         //light green
    var x1 = 0;
    var y1 = 400;
    var x2 = 180;
    var y2 = 300;
    for (var i = 0; i <= numLines; i += 1){
        line(x1, y1, x2, y2);
        x1 += dx1;
        y1 += dy1;
        x2 += dx2;
        y2 += dy2;
    }
    pop();

    //layer and tranlate pink group to the right
    push();
    translate(0, 55);
    rotate(radians(-30));
    noStroke();
    strokeWeight(1);
    line(0, 300, 10, 390);
    line(250, 250, 200, 350);
    dx1 = (10-0)/numLines;
    dy1 = (390 - 300)/numLines;
    dx2 = (350-250)/numLines;
    dy2 = (200 - 250)/numLines;


    stroke(255, 0, 127);         //pink
    var x1 = 0;
    var y1 = 400;
    var x2 = 180;
    var y2 = 300;
    for (var i = 0; i <= numLines; i += 1){
        line(x1, y1, x2, y2);
        x1 += dx1;
        y1 += dy1;
        x2 += dx2;
        y2 += dy2;
    }
    pop();


    //layer and tranlate purple group to the right
    push();
    translate(0, 120);
    rotate(radians(-45));
    noStroke();
    strokeWeight(1);
    line(0, 300, 10, 390);
    line(250, 250, 200, 350);
    dx1 = (10-0)/numLines;
    dy1 = (390 - 300)/numLines;
    dx2 = (350-250)/numLines;
    dy2 = (200 - 250)/numLines;


    stroke(147, 112, 219);         //purple
    var x1 = 0;
    var y1 = 400;
    var x2 = 180;
    var y2 = 300;
    for (var i = 0; i <= numLines; i += 1){
        line(x1, y1, x2, y2);
        x1 += dx1;
        y1 += dy1;
        x2 += dx2;
        y2 += dy2;
    }

    pop();

    //layer and tranlate yellow group to the right
    push();
    translate(0, 170);
    rotate(radians(-50));      
    noStroke();
    strokeWeight(1);
    line(0, 300, 10, 390);
    line(250, 250, 200, 350);
    dx1 = (10-0)/numLines;
    dy1 = (390 - 300)/numLines;
    dx2 = (350-250)/numLines;
    dy2 = (200 - 250)/numLines;


    stroke("yellow");         //yellow
    var x1 = 0;
    var y1 = 400;
    var x2 = 180;
    var y2 = 300;
    for (var i = 0; i <= numLines; i += 1){
        line(x1, y1, x2, y2);
        x1 += dx1;
        y1 += dy1;
        x2 += dx2;
        y2 += dy2;
    }
    pop();
    pop();
    
    


//butterfly!!!
//blue part of wings : top left to bottom right
    
    push();
    translate(175, 15);    //make smaller and move to align w/ lines
    rotate(radians(12));
    scale(2/5);
    

    stroke("blue");
    strokeWeight(2);        
    line(0, 0, 50, 180);
    line(250, 220, 300, 400);
    dx1 = (50 - 0)/numLines;
    dy1 = (180 - 0)/numLines;
    dx2 = (300 - 250)/numLines;
    dy2 = (400 - 220)/numLines;

    var x1 = 0;
    var y1 = 0;
    var x2 = 250;
    var y2 = 220;
    for (var i = 0; i <= numLines; i += 1){
        line(x1, y1, x2, y2);
        x1 += dx1;
        y1 += dy1;
        x2 += dx2;
        y2 += dy2;
    }


//magenta part of wings : top right to bottom left
    
    stroke("magenta");     
    strokeWeight(2);
    line(50, 220, 0, 400);
    line(300, 0, 250, 180);
    dx3 = (0-50)/numLines;
    dy3 = (400 - 220)/numLines;
    dx4 = (250 - 300)/numLines;
    dy4 = (180 - 0)/numLines;

    var x3 = 50;
    var y3 = 220;
    var x4 = 300;
    var y4 = 0;
    for (var i = 0; i <= numLines; i += 1){
        line(x3, y3, x4, y4);
        x3 += dx3;
        y3 += dy3;
        x4 += dx4;
        y4 += dy4;
    }

//butterfly body in center of criss cross
stroke("yellow");
strokeWeight(1);
noFill();

for(var l = 10; l <= 200; l += 10){       //repeated rings make up body
    ellipse(150, l + 90, 10, 10);
}
line((width/2) + 3, height/4, (width/2) + 30, (height/4) - 35);
line((width/2) - 3, height/4, (width/2) - 30, (height/4) - 35);
pop();

noLoop();

}

Looking Outwards – 04

“5 Horizons” Installation by Ryoichi Kurokawa

The artwork “5 Horizons” is an audiovisual installation created by Japanese artist Ryoichi Kurokawa. Created in 2010, it is made up of five screens and speakers. The experince is an eight minutes long loop. He builds his structures with recordings and digitally-made structures. Kurokawa synthesizes the image to the sound, creating a very cool, immersive spatial experience for the viewers. I admire the layering of this installation, not only between the sound and imagery, but also how the imagery is able to morph (from dynamic waves to nature scenes and so on)! It is very well executed for all the moving parts. With further research, Kurokawa is interested in synesthtesia which you can see come though his work as he blends together the visual and audtiory senses. He also is inspired by nature, and it very interesting to see how he blurs the boundary between the natural and digital world in this installation.

Title : 5 Horizons
Artist : Ryoichi Kurokawa

Links : http://www.ryoichikurokawa.com/project/r5h.html
https://mutek.org/en/artists/ryoichi-kurokawa

Project 03 Dynamic Drawing

project3

For this project, I wanted some kind of flower scene. I had a lot of fun figuring out how to make it seem like they can grow based on the position of the mouse, along with making the cloud interactive both with the sun and the mouse. I added the spinning parts to try the rotate and push & pop methods and figure out how they work.

Initial idea of moving flower and cloud with mouseX and mouseY. Also, figuring out how to make scene darker when cloud covers the sun.

// Rachel Legg / rlegg / Section C

var x;
var y;
var offset = 5;
var fOne;
var fThree;
var edge = 599;
var angle = 0;

function setup() {
    createCanvas(600, 450);
    background(255);
    x = 1/5 * width;
}

function draw() {
        //if mouse is on right side, it is night , or else it is day
    if (mouseX <= width / 2){
        background(135, 206, 235);    //dark blue
        noStroke();
        ellipse(75, 75, 40);
        fill("yellow");
        noStroke();
        ellipse(75, 75, 40);
    }else{
        background(0, 0, 102);
        fill(255);
        noStroke();
        ellipse(75, 75, 40);
        fill(0, 0, 102);
        ellipse(80, 70, 40);
    }
    
    //ground
    fill(111, 78, 55);                              //brown
    noStroke();
    rect(0, 4/5 * height, width, 4/5 * height);
    fill("green");                             //grass
    rect(0, 4/5 * height, width, 20);


//flower 1
//flower stem grows and shrink based on mouse location
    if(mouseX < 200 & mouseY <= (4/5 *height)){
        stroke("green");
        line(1/4 * width, 4/5 * height, 1/4 * width, mouseY);
        fill(255);
        noStroke();
        fOne = 1/4 * width;
        circle(fOne, mouseY - 17, 30);
        circle(fOne - 20, mouseY - 5, 30);
        circle(fOne + 20, mouseY - 5, 30);
        circle(fOne - 12, mouseY + 13, 30);
        circle(fOne + 12, mouseY + 13, 30);
        fill("yellow");
        stroke("pink");
        strokeWeight(4);
        circle(1/4 * width, mouseY, 20);
    //flower spinds when not interacting
    }else{
        strokeWeight(4);
        stroke("green");
        line(1/4 * width, 4/5 * height, 1/4 * width, 2/3 * height);
        fill(255);
        noStroke();
        push();      
        translate(150, 300);
        rotate(radians(angle));
        circle(0, -17, 30);
        circle(-20, -5, 30);
        circle(20, -5, 30);
        circle(-12, 13, 30);
        circle(12, 13, 30);
        fill("yellow");
        stroke("pink");
        strokeWeight(4);
        circle(0, 0, 20);
        pop();
        angle += 2
    }

    //flower 2
        if(mouseX < 400 & mouseX > 200 && mouseY <= (4/5 *height)){
            stroke("green");
            line(width / 2, 4/5 * height, width / 2, mouseY);
            fill(250, 172, 382);
            noStroke();
            circle(width / 2, mouseY, 40, 40);
            fill(77, 208, 99);
            circle(width / 2, mouseY, 25, 25);
            fill(255, 51, 51);
            circle(width / 2, mouseY, 10, 10);
        }else{
            strokeWeight(4);
            stroke("green");
            line(width / 2, 4/5 * height, width / 2, 2/3 * height);
            fill(250, 172, 382);
            noStroke();
            circle(width / 2, 2/3 * height, 40, 40);
            fill(77, 208, 99);
            circle(width / 2, 2/3 * height, 25, 25);
            fill(255, 51, 51);
            circle(width / 2, 2/3 * height, 10, 10);
    }

    //flower 3
    if(mouseX > 400 & mouseY <= (4/5 *height)){
        stroke("green");
        line(3/4 * width, 4/5 * height, 3/4 * width, mouseY);
        noStroke();
        fThree = 3/4 * width;
        fill(0, 128, 255);
        circle(fThree + 20, mouseY - 17, 25);
        circle(fThree - 20, mouseY - 17, 25);
        circle(fThree + 20, mouseY + 17, 25);
        circle(fThree - 20, mouseY + 17, 25);
        fill(0, 51, 102);
        ellipse(fThree, mouseY - 17, 20, 30);
        ellipse(fThree - 20, mouseY, 30, 20);
        ellipse(fThree + 20, mouseY, 30, 20);
        ellipse(fThree, mouseY + 17, 20, 30);
        fill(255, 153, 204);
        circle(3/4 * width, mouseY, 30);
        fill(255, 51, 153);
        stroke(204, 204, 255);
        strokeWeight(4);
        circle(3/4 * width, mouseY, 20);
    }else{
        strokeWeight(4);
        stroke("green");
        line(3/4 * width, 4/5 * height, 3/4 * width, 2/3 * height);
        fill(255);
        noStroke();
        noStroke();
        push();      
        translate(450, 300);
        rotate(radians(angle));
        fill(0, 128, 255);
        circle(20, -17, 25);
        circle(-20, -17, 25);
        circle(20, 17, 25);
        circle(-20, 17, 25);
        fill(0, 51, 102);
        ellipse( 0, -17, 20, 30);
        ellipse(-20, 0, 30, 20);
        ellipse(20, 0, 30, 20);
        ellipse(0, 17, 20, 30);
        fill(255, 153, 204);
        circle(0, 0, 30);
        fill(255, 51, 153);
        stroke(204, 204, 255);
        strokeWeight(4);
        circle(0, 0, 20);
        pop();
        angle += 2
    }

    //cloud follows mouse back and forth
    if (mouseX > x) {
        x += 0.5;
        offset = -5;
    }
    if (mouseX < x) {
        x -= 0.5;
        offset = 5;
    }
    if (x > 599){             //constrain to frame
        x = 599;
    }

    fill(255);
    noStroke();
    ellipse(x, 100, 100);
    ellipse(x + 50, 110, 70);
    ellipse(x - 50, 110, 70);


    //if cloud covers sun, screen gets darker
    var shadeCover = 20;

    if (x <= 125 & x >= 30){
        background(0, 0, 102, shadeCover);
    }

}




Looking Outward – 03

This video shows the process of building Digital Grotesque!

Digital Grotesque is a creation of architecture where the artist, Benjamin Dillenburger, uses algorithms to generate the geometry, and then uses sand printing to create the builds. The 3D printed sandstone parts (which are made up of sandstone and resin) can then be connected together to make up the completed piece, and it is huge. It is essentially printing architecture!! The artist uses a computer to generate very intricate, complex parts, and it is absolutely amazing to me that the computer was able to execute this amount of detail at such a large scale without needing any intervention. I also really admire the use of texture that is able to come through. Dillenburger shares that the precision is down to millimeters and that this kind of detail could never be drawn by hand as there are 260 million facets and 30 billion voxels. I often have thought about how modern buildings have lost their detailed quality, and this technology makes me wonder how the future of architecture and style could change with generative processes and technology.

Title: Digital Grotesque (2013)
Artist: Benjamin Dillenburger
Link: http://benjamin-dillenburger.com/grotto/

Project 02 Variable Face

In my process, I wanted to figure out how to play with color and how that could change through pressing the mouse. I also was interested in and had a lot of fun figuring out how simple shape changes could affect expression.

project2
//Rachel Legg Class Section C

var eyeSize = 50;
var eyeHeight = 25;
var faceWidth = 300;
var bodyWidth = 400;
var faceHeight = 300;
var eyebrowHeight = 200;

var r;         // making rgb variable
var g;
var b;
var on = false;

var x = 0;
var y = 0;

function setup() {
    createCanvas(640, 480);
    background(220);
}
 
function draw() {
    noStroke();
    if(on){                                  //alternate background color on click
        background(252, 169, 133);    //orange
    }else{
        background(204, 236, 239);    //blue
    }

    //shirt
    fill(r, g, b);                                    
    ellipse(width / 2, height, bodyWidth, height);             
    fill(r + 10, g + 10, b +10);  
    ellipse(width / 4, height, bodyWidth / 4, height / 2);         
    ellipse(width * 3/4, height, bodyWidth / 4, height / 2); 

    //head
    if(on){                                //alternate head color on click
        fill(253, 222, 238);  //pink
    }else{
        fill(224, 243, 176);  //green
    }
    ellipse(width / 2, height / 2, faceWidth,  faceHeight);  

    //eyes
    fill(r, g, b, 200);                                          
    var eyeLX = width / 2 - faceWidth * 0.25;                   
    var eyeRX = width / 2 + faceWidth * 0.25; 
    if(mouseX < width / 2){
        ellipse(eyeLX, height / 2, eyeSize, eyeHeight);               
        ellipse(eyeRX, height / 2, eyeSize, eyeHeight);
        fill(0);                                                                //pupils
        ellipse(eyeLX, height / 2, 1/2 * eyeSize, 3/4 * eyeHeight);
        ellipse(eyeRX, height / 2, 1/2 * eyeSize, 3/4 * eyeHeight);
        fill(255, 255, 255, 200);
        ellipse(eyeLX + 4, (height / 2) - 4, 1/8 * eyeSize, 1/8 * eyeHeight);    //glare
        ellipse(eyeRX + 4, (height / 2) - 4, 1/8 * eyeSize, 1/8 * eyeHeight);
    }else{
        if(on){                                //alternate nose color on click
            stroke(251, 182, 209);    //darker pink
        }else{
            stroke(145, 210, 144);    //darker green
    }
        strokeWeight(2);
        line(eyeLX - 10, height / 2, eyeLX + 10, height / 2);         //closing eyes when mouse is on right side
        line(eyeRX + 10, height / 2, eyeRX - 10, height / 2);
    }               

    //mouth
    if(mouseY > height / 2){
        fill(0);
        noStroke();
        circle(width / 2, 2/3 * height, 20, 20);                     //open mouth when below half
    }else{
        if(on){                       //alternate nose color on click
            stroke(251, 182, 209);    //darker pink
        }else{
            stroke(145, 210, 144);    //darker green
    }
        strokeWeight(2);
        line(2/5 * width, 2/3 * height, 3/5 * width, 2/3 * height);  
    }

    //nose
    noStroke();
    if(on){                           //alternate nose color on click
        fill(251, 182, 209);          //darker pink
    }else{
        fill(145, 210, 144);          //darker green
    }
    beginShape();
    curveVertex(1/5 * width, 4/5 * height); 
    curveVertex(1/2 * width, 5/9 * height);
    curveVertex(1/2 * width, 5/9 * height);
    curveVertex(4/5 * width, 4/5 * height);
    endShape();

    //eyebrow
    if(on){                       //alternate eyebrow color on click
        stroke(251, 182, 209);    //darker pink
    }else{
        stroke(145, 210, 144);    //darker green
    }
    strokeWeight(3);
    if(mouseX < width/ 2){
        line(eyeLX - 10, eyebrowHeight - 10, eyeLX + 15, eyebrowHeight - 15);               
        line(eyeRX + 10, eyebrowHeight - 5, eyeRX - 15, eyebrowHeight - 15);
    }else{
        line(eyeLX - 10, eyebrowHeight - 30, eyeLX + 15, eyebrowHeight - 20);               
        line(eyeRX + 10, eyebrowHeight - 30, eyeRX - 15, eyebrowHeight - 20);
    }

}
 
function mousePressed() {
    if(on){                               //change background on click
        on = false;
    }else{
        on =true;
    }
    faceWidth = random(300, 500);         //with click, face width changes
    bodyWidth = random(375, 415);         //with click, shirt width changes along with arms
    faceHeight = random(200, 400);        //face height changes
    eyeSize = random(20, 80);             //eye size changes
    eyeHeight = random (20, 60);
    r = random(0, 255);                   //eye and shirt color change
    g = random (0, 255);
    b = random (0, 255);
    eyebrowHeight = random(180, 200);     //eyebrow position changes
}

Looking Outwards – 02

When exploring generative art and different artists, I discovered Georg Nees and had fun looking through his work. Nees has a background in math and physics and started working in the field of computer graphics in 1964. He was one of the first artists to use algorithms on a computer to create his artwork. He first publicly displayed his work in 1965. The artwork was first coded on punched paper tape before being created by a drawing machine (Zuse Graphomat Z64). I think it is pretty cool to hear about an older system of coding like punching paper and translating to a drawing machine, and I admire the want to make art with a different system like computers. I enjoy looking at Nees’s artwork as it holds both a simplicity and complexity. The black line on a white background seems simple, but the patterns and images become so complicated. There is a sense of order and chaos. Pretty amazing that they are all created with code!

Schotter by Georg Nees

Artist: Georg Nees
Source: http://dada.compart-bremen.de/item/agent/15

Project 01 | Self Portrait

here is my self portrait!

sketch

function setup() {
    createCanvas(300, 300);
    background(220);
    text("p5.js vers 0.9.0 test.", 10, 15);
}

function draw() {
    background(106, 148, 212);     //blue
    fill(34, 67, 116);             //dark blue
    stroke(34, 67, 116);           
    triangle(0, 299, 299, 0, 299, 299);

    //hair
    fill(61, 97, 153);            //medium blue
    stroke(61, 97, 153); 
    ellipse(150, 65, 75, 55);
    fill(92, 128, 184);           //lighter medium blue
    stroke(92, 128, 184);
    ellipse(150, 148, 140, 160);

    //shirt
    fill(255, 153, 204);            //pink
    stroke(255, 153, 204);
    rect(30, 240, 240, 120, 60);
    fill(219, 112, 147);            //darker pink
    stroke(219, 112, 147);
    ellipse(150, 245, 80, 40);    

    //neck
    fill(216, 226, 240);            //a little darker than light blue
    stroke(216, 226, 240);
    rect(115, 150, 70, 90);        
    ellipse(150, 240, 70, 40);

    //face
    fill(226, 237, 252);
    stroke(229, 239, 255);
    ellipse(150, 162, 130, 142);    //light blue
    fill(255, 153, 204, 40);        //transparent pink
    stroke(255, 153, 204, 0);
    circle(110, 190, 30);
    circle(190, 190, 30);

    //nose
    fill(160, 188, 229);
    stroke(160, 188, 229);
    circle(150, 180, 17);        
    circle(141, 183, 8);
    circle(159, 183, 8);
    fill(229, 239, 255);
    stroke(229, 239, 255);
    circle(150, 177, 17);        
    circle(141, 180, 8);
    circle(159, 180, 8);
    noLoop();

    //eyes
    fill(255);                     //white
    stroke(160, 188, 229, 50);
    circle(125, 150, 25);          
    circle(175, 150, 25);
    fill(160, 188, 229);           //blue
    stroke(160, 188, 229);
    ellipse(121, 150, 16, 19);
    ellipse(172, 150, 16, 19);
    fill(34, 67, 116);             //dark blue
    stroke(34, 67, 116);
    ellipse(118, 150, 12, 15);
    ellipse(169, 150, 12, 15);
    fill(255);
    stroke(255)                    //white
    circle(119, 147, 5);
    circle(170, 147, 5);
    stroke(160, 188, 229);
    strokeWeight(4);                //blue
    line(112, 134, 124, 130);
    line(186, 134, 174, 130);
    noLoop();


    //mouth
    fill(160, 188, 229);            //blue
    stroke(160, 188, 229);
    strokeWeight(1);
    arc(150, 203, 35, 12, 0, PI);
    fill(229, 239, 255);            //light blue
    stroke(229, 239, 255);
    arc(150, 201, 35, 8, 0, PI);
}

Blog 01

Blog 01 | Think about an interactive and/or computational project involving a creative or artistic bent (from anywhere, by anyone except yourself) that you knew about before starting this course, and which you find inspirational.

Connected Worlds Interactive Installation

I chose the “Connected Worlds” interactive installation, designed by Design I/O. As an environments designer, I admire this project because it creates a learning experience that embeds digital and physical interactions with beautiful visuals. Essentially, the experience is made up of 6 digital ecosystems that all rely on a water source. Visitors are able to mold the path of the water source on
the ground using foam logs that use motion tracking devices to affect the behavior of the digital water. The ecosystems react to the water and the goal is to show how water is vital to wildlife and their homes. The ecosystem wildlife also react to visitors’ hand movements. I love that it is fun and playful and yet still holds purpose. Design I/O developed with openFrameworks (an open source creative coding toolkit). They needed software for their single system network, the interactive floor, and interactive walls. There is a lot of feedback and reactions that are a part of this experience, leading to a very complicated computer system. There are 8 different MacBook Pros that control the different environments and are communicating with each other! Here is a “Behind the
Scenes” video (https://vimeo.com/131665883) that explains all the technology! I feel this project exemplifies what future experiences can morph into and can ultimately be applied to anything from education, to retail, to social experiences.

Reference: https://www.design-io.com/projects/connectedworlds (I definitely recommend looking though the imagery!)
Designers: Design I/O Team: Emily Gobeille, Theo Watson, & Nicholas Hardeman
Title: Connected Worlds