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

  • 'Akinori Goto' 작품을 모방하여 인터렉티브 요소(사람이 버튼을 누르면 각 버튼에 따라 빔에서 다른 빛 애니메이션이 나온다.각각 다른 4개의 모델링과 4개의 빛 애니메이션으로 다양한 모습을 연출한다.)를 더했다.
  • [모델링] 어떤 애니메이션을 어떤식으로 보여줄 것인지 스케치한다. 총 4가지 (새, 발레, 싱글레이디, 사람) 모델링 구성.

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 (버튼에 따라 비디오를 플레이 하기 위함 )
  • [window] Arduino ( 프로세싱 코드의 버튼을 눌러주는 역할 )
  • [window.exe program] SPARROW ( 프로세싱과 아두이노를 연결해주는 프로그램 )
  • [mac OS, window] Rhino 5.0 ( 모델링을 위해 사용했던 프로그램 )
  • [mac OS] Adobe after effect CC ( 빛 영상을 위함 )

Step 4: Modeling by Rhino, Illustrator

  • 아래와 같은 방식으로 총 네가지 모델링을 제작하였다. ( 새, 발레, 굴러가는 사람, 싱글레이디 )

1.먼저 원하는 이미지시퀀스(이미지 연속동작)를 찾는다.

2.일러스트레이터로 하나하나 펜툴로 작업을 한다.

3.라이노 위에 원형을 그린다.

4.일러스트레이터로 딴 선을 그대로 정확하게 원 위에 배치한다.

(주의사항 : 가져올때는 위치를 명확히 봐야한다. 위치가 틀어지면 연속적인 동작이 되지 않거나, 높이가 들쑥날쑥해진다.)

5. 선을 하나하나 잇는다.

6.모든 선에 두께를 준다. (대략: 가로선 : 0.3mm / 세로선: 0.4mm)

7.stl파일로 변환하여 3D 프린터로 옮긴다. (프린터가 좋으면 상관없지만 작은프린터로 할 시에는 우리처럼 잘라 붙이도록한다.

우리는 작은 프린터로 작업하였기 때문에 총 4파트, 8파트로 분할하여 뽑았다.)

8. 접착시키고 원형 회전판에 올려놓으면 끝이다.

Step 5: External

레코드 플레이어의 형상을 닮도록 디자인하였다. 포맥스와 아크릴을 사용해 쉽게 제작하였다.

자세한 수치와 만드는 구성은 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; //버튼1
const int Bpin = 12; //버튼2

const int Cpin = 11; //버튼3

const int Dpin = 10; //버튼4

const int plus = 8; //전원 공급 핀

const int chattering = 0; //ms단위로 채터링을 걸러냄. (chattering은 한번 버튼을 눌렀지만 버튼이 여러번 눌러진 것처럼 인식되는 현상)

int a,b,c,d,e = 0; //1을 한번만 입력하기 위한 변수

int A,B,C,D,E = 0; //1을 한번만 입력하기 위한 변수

void setup() {

pinMode(Apin,INPUT_PULLUP); //밖에서 받는 신호 (외부 버튼을 눌렀을때 발생하는 신호)

pinMode(Bpin,INPUT_PULLUP); //밖에서 받는 신호 (외부 버튼을 눌렀을때 발생하는 신호)

pinMode(Cpin,INPUT_PULLUP); //밖에서 받는 신호 (외부 버튼을 눌렀을때 발생하는 신호)

pinMode(Dpin,INPUT_PULLUP); //밖에서 받는 신호 (외부 버튼을 눌렀을때 발생하는 신호)

pinMode(Epin,INPUT_PULLUP); //밖에서 받는 신호 (외부 버튼을 눌렀을때 발생하는 신호)

pinMode(plus, OUTPUT); //아두이노에서 버튼으로 보내는 신호(전원 공급)

Serial.begin(9600); //아두이노 통신속도

}

void loop() {

if(digitalRead(Apin)==LOW){ //Apin(pin13)신호를 읽어라.

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);}

//버튼이 계속 눌리는것을 방지하기 위한 식(=1신호가 계속 가는것을) (버튼1을 누르면 화면에 1a라고 뜨게됨)

if(digitalRead(Bpin)==LOW){ //Bpin(pin12)신호를 읽어라.

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);}

//버튼이 계속 눌리는것을 방지하기 위한 식(=1신호가 계속 가는것을) (버튼2을 누르면 화면에 2b라고 뜨게됨)

if(digitalRead(Cpin)==LOW){ //Cpin(pin11)신호를 읽어라.

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);}

//버튼이 계속 눌리는것을 방지하기 위한 식(=1신호가 계속 가는것을) (버튼3을 누르면 화면에 3c라고 뜨게됨)

if(digitalRead(Dpin)==LOW){ //Dpin(pin10)신호를 읽어라.

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);

//버튼이 계속 눌리는것을 방지하기 위한 식(=1신호가 계속 가는것을) (버튼4을 누르면 화면에 4d라고 뜨게됨)

Serial.flush(); //현재 전송하고 있는 시리얼 데이터가 전송완료 될때까지 기다리는 함수.

}

===Processing===

import processing.video.*;
//프로세싱에서 비디오를 재생하는 라이브러리

int VideoPlaying; //정수선언을 해줍니다. 소수점을쓰면 신호를 받을수 없기때문

boolean Vid1 = false; //ture 또는 false밖에 모르는 boolean으로 비디오들을 선언 (재생또는 재생하지 않음)

boolean Vid2 = false;

boolean Vid3 = false;

boolean Vid4 = false;

Movie Video1; //비디오1을 선언

Movie Video2; //비디오2를 선언

Movie Video3; //비디오3을 선언

Movie Video4; //비디오4를 선언

void setup() {

fullScreen(); //비디오를 전체화면으로 불러낼것이다.(창모드말고 전체화면)

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

//비디오1의 소스파일 주소

Video1.loop(); //동영상이 끝나면 다시 재생하라

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

//비디오2의 소스파일 주소

Video2.loop(); //동영상이 끝나면 다시 재생하라

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

//비디오3의 소스파일 주소

Video3.loop(); //동영상이 끝나면 다시 재생하라

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

//비디오4의 소스파일 주소

Video4.loop(); //동영상이 끝나면 다시 재생하라

}

void draw() {

toogle(); //toogle식(하단에 있음)을 읽고 아래대로 수행해라

if (Vid1) { //vid1이 ture면 아래의 식을 수행한다.

println(“video1”); //“video1”을 출력한다.

Video2.stop(); //비디오2는 플레이하지 않는다.

Video3.stop(); //비디오3은 플레이하지 않는다.

Video4.stop(); //비디오4는 플레이하지 않는다.

background(0); //배경색은 검정색(0)이다.

Video1.play(); //비디오1을 플레이한다.

image(Video1, 0, 0, width, height); //비디오1을 띄우고 위치는 0,0 사이즈는 비디오 사이즈를 따른다.

}

if (Vid2) { //vid2가 ture면 아래의 식을 수행한다.

println(“video2"); //“video2”를 출력한다.

Video1.stop(); //비디오2는 플레이하지 않는다.

Video3.stop(); //비디오3은 플레이하지 않는다.

Video4.stop(); //비디오4는 플레이하지 않는다.

background(0); //배경색은 검정색(0)이다.

Video2.play(); //비디오2를 플레이한다.

image(Video2, 0, 0, width, height); //비디오2을 띄우고 위치는 0,0 사이즈는 비디오 사이즈를 따른다.

}

if (Vid3) { //vid3이 ture면 아래의 식을 수행한다.

println(“video3"); //“video3”을 출력한다.

Video1.stop(); //비디오1은 플레이하지 않는다.

Video2.stop(); //비디오2는 플레이하지 않는다.

Video4.stop(); //비디오4는 플레이하지 않는다.

background(0); //배경색은 검정색(0)이다.

Video3.play(); //비디오3을 플레이한다.

image(Video3, 0, 0, width, height); //비디오3을 띄우고 위치는 0,0 사이즈는 비디오 사이즈를 따른다.

}

if (Vid4) { //vid4가 ture면 아래의 식을 수행한다.

println(“video4"); //“video4”를 출력한다.

Video1.stop(); //비디오1은 플레이하지 않는다.

Video2.stop(); //비디오2는 플레이하지 않는다.

Video3.stop(); //비디오3은 플레이하지 않는다.

background(0); //배경색은 검정색(0)이다.

Video4.play(); //비디오4를 플레이한다.

image(Video4, 0, 0, width, height); //비디오4을 띄우고 위치는 0,0 사이즈는 비디오 사이즈를 따른다.

}

}

void movieEvent(Movie m) {

m.read();

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

void keyPressed() {

if (key == '1') { //1이 눌리면(아두이노에서 온 버튼값이 ‘1’이면)

VideoPlaying = 1 ; //VideoPlaying = 1이된다.

println(VideoPlaying); //위의 식이 수행되면 VideoPlaying을 출력한다.

}

if (key == '2') { //2가 눌리면(아두이노에서 온 버튼값이 ‘2’이면)

VideoPlaying = 2 ; //VideoPlaying = 2이된다.

println(VideoPlaying); //위의 식이 수행되면 VideoPlaying을 출력한다.

}

if (key == '3') { //3이 눌리면(아두이노에서 온 버튼값이 ‘3’이면)

VideoPlaying = 3 ; //VideoPlaying = 3이된다.

println(VideoPlaying); //위의 식이 수행되면 VideoPlaying을 출력한다.

}

if (key == '4') { //4가 눌리면(아두이노에서 온 버튼값이 ‘4’이면)

VideoPlaying = 4 ; //VideoPlaying = 4이된다.

println(VideoPlaying); //위의 식이 수행되면 VideoPlaying을 출력한다.

}

}

void toogle() {

if (VideoPlaying == 1) { //VideoPlaying가 1이면 아래의 값이 된다.

Vid1 = true;

Vid2 = false;

Vid3 = false;

Vid4 = false;

}

if (VideoPlaying == 2) { //VideoPlaying가 2이면 아래의 값이 된다.

Vid1 = false;

Vid2 = true;

Vid3 = false;

Vid4 = false;

}

if (VideoPlaying == 3) { //VideoPlaying가 3이면 아래의 값이 된다.

Vid1 = false;

Vid2 = false;

Vid3 = true;

Vid4 = false;

}

if (VideoPlaying == 4) { //VideoPlaying가 4이면 아래의 값이 된다.

Vid1 = false;

Vid2 = false;

Vid3 = false;

Vid4 = true;

}

}

Step 8: Finished (with Making Film)

illusion_wave@naver.com

Share

    Recommendations

    • First Time Author

      First Time Author
    • Make it Glow Contest 2018

      Make it Glow Contest 2018
    • Toys Contest

      Toys Contest

    Discussions