Introduction: Illusion Wave

(This video is Akinori Goto's. We added the interactive elements to this idea.)

  • Concept

Zoetrope ( Repeated ImageSequence) + 3D Modeling + Light

Find a new animation of light

By developing the basic concept of the classic Zoetrope, we made our own fantastic modeling referring to the works of 'Akinori Goto’.

In order to implement animated images in 3D printing structures, we used light instead of cylinder devices to modernize them into unique light works.

  • Detail description

One sequence of operations was rounded into frames. There’s a principle that when 3D objects are spinning circular, there’s a thin light shooting them. And it looks like all frames are moving making an animation.

Also we designed this artwork to resemble the shape of the record player.

The user can experience four different 3D animation zoetrope by changing the LP plate. In addition, people can adjust the speed of the rotary plate with the knob on the right of the main body.

Step 1: Principle and Composition

  • inspired by 'Akinori Goto'. Interactive Elements (When a person presses a button, different light animations come out of the beam depending on each button, adding four different modeling and light animations to create a variety of looks).

    [Modeling] Sketch out what kind of animation we wanted to show. A total of four (bird, ballet, single lady, person) modeling configurations.

Step 2: Product Composition

Step 3: Materials

inner part

  • Power supply SMPS 12V 50W 4.2A
  • Stepping motor 12v 0.4A
  • Arduino UNO x 2
  • Motor Drive : Easy Driver
  • Push Button x 4
  • speed nobo x 1

output part

  • Box - Formax (50cm*56cm) x 2, (55.5cm*7cm) x 4
  • circle1 - Acrylic (42cm diameter)
  • circle2 - Formax (42cm diameter)
  • a beam projector

using program

  • [window] Processing 3.0(To play the video according to the button)
  • [window] Arduino ( Pressing the button of the processing code )
  • [window.exe program] SPARROW( A program that links processing and Arduino )
  • [mac OS, window] Rhino 5.0 ( A program we used for modeling )
  • [mac OS] Adobe after effect CC ( For light images )

Step 4: Modeling by Rhino, Illustrator

  • A total of four models were produced in the following manner. (Bird, ballet, rolling person, single lady)

  1. First, find image sequences (image continuous operation).
  2. Work as an illustrator, one by one, with a pen tool.
  3. Draw a circle on Rhino.
  4. Place the line drawn by the illustrator exactly on the circle.(Note: Be sure to take a clear look at the position when you bring it in. If the position changes, it will not work continuously, or the height will become louder.)
  5. Connect the lines one by one.
  6. Give thickness to all lines. (Approximate: horizontal line: 0.3 mm / vertical line: 0.4 mm)

    7.Convert the file to the .stl file and move it to the 3D printer. (It does not matter if you have a good printer, but if you want to use a small printer, split it into 4 or 8 parts like we did.

    8. Attach each part and place it on a circular spindle.

Step 5: External

Designed to resemble a record player. It was made easily using fomax and acrylic.

Detailed figures and configuration are shown in Step 2.

Step 6: Internal

참고: turntable 참고한 내부 모델링 https://www.thingiverse.com/thing:2031323

based on Nema17 42mm stepping motor (200 steps per round) as I have already owned them. The pinion gear is the widely available 16-teeth aluminium GT2 gear used in 3D Printers and the main gear is 3D Printed 90-teeth GT2. The belt used is 200mm (100-teeth) GT2. Additionally you need 1x 608ZZ ball bearing, M8 bolt, M8 nut & M3 screws-nuts (nyloc nuts). The table surface is the D180 round glass for the Kossel 3D Printer (I have ordered D220 size glass but at first received smaller one, later the correct-sized was received and I did not know what to do with the first).
All parts were printed using PLA and 0.3mm nozzle/0.15mm layer (I do prefer longer in time but higher quality printouts), and you need 3 "GlassHolder.stl" copies. The flat holders surfaces can be used to fix glass to holder using clips (not shown on the photos).

Step 7: Arduino & Processing Code

=====Arduino=====

const int Apin = 13; //button1

const int Bpin = 12; //button2

const int Cpin = 11; //button3

const int Dpin = 10; //button4

const int plus = 8; //Power supply pin

const int chattering = 0; //Filter chattering in ms units. (chattering is a phenomenon in which a button is pressed once but the button is recognized as being pressed several times)

int a,b,c,d,e = 0; //Variable to input 1 only once

int A,B,C,D,E = 0; //Variable to input 1 only once

void setup() {

pinMode(Apin,INPUT_PULLUP); //Signals received from outside (signals generated when an external button is pressed)

pinMode(Bpin,INPUT_PULLUP); //Signals received from outside (signals generated when an external button is pressed)

pinMode(Cpin,INPUT_PULLUP); //Signals received from outside (signals generated when an external button is pressed)

pinMode(Dpin,INPUT_PULLUP); //Signals received from outside (signals generated when an external button is pressed)

pinMode(Epin,INPUT_PULLUP); //Signals received from outside (signals generated when an external button is pressed)

pinMode(plus, OUTPUT); //Signals from the Arduino to the button (power supply)

Serial.begin(9600); //Arduino communication speed

}

void loop() {

if(digitalRead(Apin)==LOW){ //Apin(pin13)Read the signal.

if(A==0){Serial.println("A"); a=0; A=1; delay(chattering);}

}else if(a==0) {Serial.println("1"); a=1; A=0; delay(chattering);}

//To prevent the button from continuing to be pressed (= 1 signal keeps going) (when button 1 is pressed, 1a is displayed on the screen)

if(digitalRead(Bpin)==LOW){ //Bpin(pin12)Read the signal.

if(B==0){Serial.println("B"); b=0; B=1; delay(chattering);}

}else if(b==0) {Serial.println("2"); b=1; B=0; delay(chattering);}

//To prevent the button from continuing to be pressed (= 1 signal continues to flow) (Pressing button 2 will display 2b on the screen)

if(digitalRead(Cpin)==LOW){ //Cpin(pin11)Read the signal.

if(C==0){Serial.println("C"); c=0; C=1; delay(chattering);}

}else if(c==0) {Serial.println("3"); c=1; C=0; delay(chattering);}

//To prevent the button from continuing to be pressed (= 1 signal continues to flow) (Pressing button 3 will display 3c on the screen)

if(digitalRead(Dpin)==LOW){ //Dpin(pin10)Read the signal.

if(D==0){Serial.println("D"); d=0; D=1; ddelay(chattering);}

}else if(d==0) {Serial.println("4"); d=1; D=0; delay(chattering);

//To prevent the button from continuing to be pressed (= 1 signal continues to flow) (Pressing button 4 will display 4d on the screen)

Serial.flush(); //A function that waits until the transmission of the current serial data is completed.

}

===Processing=== import processing.video.*;

//Library to play video in processing int VideoPlaying; //Declare an integer. Decimal point can not receive signal

boolean Vid1 = false; //Declare videos (do not play or play) with only true or false boolean

boolean Vid2 = false;

boolean Vid3 = false;

boolean Vid4 = false;

Movie Video1; //Declare Video 1

Movie Video2; //Declare Video 2

Movie Video3; //Declare Video 3

Movie Video4; //Declare Video 4

void setup() {

fullScreen(); //The video will be recalled to full screen (fullscreen, not windowed).

Video1 = new Movie(this, “C:/Users/his_h_000/Desktop/sketch_180910a/video/video1.mp4");

//Source address of video 1

Video1.loop(); //Play again when video ends

Video2 = new Movie(this, “C:/Users/his_h_000/Desktop/sketch_180910a/video/video2.mp4");

//Source address of video 2

Video2.loop(); //Play again when video ends

Video3 = new Movie(this, “C:/Users/his_h_000/Desktop/sketch_180910a/video/video3.mp4");

//Source address of video 3

Video3.loop(); //Play again when video ends

Video4 = new Movie(this, “C:/Users/his_h_000/Desktop/sketch_180910a/video/video4.mp4");

//Source address of video 4

Video4.loop(); //Play again when video ends

}

void draw() {

toogle(); //Read the toogle expression (below) and do the following

if (Vid1) { //If vid1 is true, perform the following expression.

println(“video1”); //"Video1" is output.

Video2.stop(); //Video 2 does not play.

Video3.stop(); //Video 3 does not play.

Video4.stop(); //Video 4 does not play.

background(0); //background is black(0)

Video1.play(); //Play Video 4

image(Video1, 0, 0, width, height); //Video 1 is displayed and position 0,0 size is according to video size.

}

if (Vid2) { //If vid2 is true, perform the expression below.

println(“video2"); //“video2”is output

Video1.stop(); //Video 2 does not play.

Video3.stop(); //Video 3 does not play.

Video4.stop(); //Video 4 does not play.

background(0); //background is black(0)

Video2.play(); //Play Video 2

image(Video2, 0, 0, width, height); //Video 2 is displayed and position 0,0 size is according to video size.

}

if (Vid3) { //If vid3 is true, perform the expression below.

println(“video3"); //“video3”is output

Video1.stop(); //Video 1 does not play.

Video2.stop(); //Video 2 does not play.

Video4.stop(); //Video 4 does not play.

background(0); //background is black(0)

Video3.play(); //Play Video 3

image(Video3, 0, 0, width, height); //Video 3 is displayed and the position is 0,0 and the size is according to the video size.

}

if (Vid4) { //If vid4 is true, perform the formula below.

println(“video4"); //“video4”is output

Video1.stop(); //Video 1 does not play.

Video2.stop(); //Video 2 does not play.

Video3.stop(); //Video 3 does not play.

background(0); //background is black(0)

Video4.play(); //Play Video 4

image(Video4, 0, 0, width, height); //Video 4 is displayed, and position 0,0 size will follow video size.

}

}

void movieEvent(Movie m) {

m.read();

} //called every time a new frames is available to read

void keyPressed() {

if (key == '1') { //1 is pressed (if the button value from the Arduino is '1')

VideoPlaying = 1 ; //VideoPlaying = becomes 1

println(VideoPlaying); //When the above expression is performed, it outputs VideoPlaying.

}

if (key == '2') { //2 is pressed (if the button value from the Arduino is '2')

VideoPlaying = 2 ; //VideoPlaying = becomes 2

println(VideoPlaying); //When the above expression is performed, it outputs VideoPlaying.

}

if (key == '3') { //3 is pressed (if the button value from the Arduino is '3')

VideoPlaying = 3 ; //VideoPlaying = becomes 3

println(VideoPlaying); //When the above expression is performed, it outputs VideoPlaying.

}

if (key == '4') { //4 is pressed (if the button value from the Arduino is '4')

VideoPlaying = 4 ; //VideoPlaying = becomes 3

println(VideoPlaying); //When the above expression is performed, it outputs VideoPlaying.

}

}

void toogle() {

if (VideoPlaying == 1) { //If VideoPlaying is 1, the value is as follows.

Vid1 = true;

Vid2 = false;

Vid3 = false;

Vid4 = false;

}

if (VideoPlaying == 2) { //If VideoPlaying is 2, the value is as follows.

Vid1 = false;

Vid2 = true;

Vid3 = false;

Vid4 = false;

}

if (VideoPlaying == 3) { //If VideoPlaying is 3, the value is as follows.

Vid1 = false;

Vid2 = false;

Vid3 = true;

Vid4 = false;

}

if (VideoPlaying == 4) { //If VideoPlaying is 4, the value is as follows. Vid1 = false;

Vid2 = false;

Vid3 = false;

Vid4 = true;

}

}

Step 8: Finished (with Making Film)

illusion_wave@naver.com