千手観紋 - dominickchen/cmrd GitHub Wiki

千手観紋

Image from Gyazo

コンセプト

人の手からは強くagingを感じることができる。例えば同じ30歳の人でも、日々家事をこなす主婦の手とトラック運転手の手は、形や大きさだけでなくシワのつき方や傷、質感が大きく異なるだろう。本作は、単なる時間の経過という意味でのagingだけでなく、その人の日々の生活によって磨耗して形作られていく手の様相(ある種の紋様)をagingと捉え、人々がそれぞれ持つ「千」差万別な「手」の「紋」様を「観」る体験を提供する、インタラクションな映像作品である。


製作者

  • 石田祐暉(ドミニクゼミB3・wiki執筆者)
  • 竹田毬恵(ドミニクゼミB3)
  • 谷口恵一郎(橋田研M2)

体験の流れ

(クリックでyoutubeへ移動)

①体験者は仏壇の横にある怪しい箱に手を入れる。

②箱の上方に設置されたwebカメラが起動し、仏像の向かって右側から自分の手が生えてるように映る。

③カメラは同時に録画もしており、箱から手を抜くと録画が停止し、仏像の周囲にその録画の様子が映し出される。

④参加していただいた人の手は全て画像でアーカイブしており、それらを後日aging展のサイトの千手観紋のページ上に公開。


制作までの過程

1.「千手感温」発案

展示のテーマがagingと決まり、作品案を考える。漁ってみたら当時のメモが残ってたので晒す。

aging
即身仏

老いた側からの視点
老いたからこそ達した境地がある
底抜けに明るいおばあさんとかネテロ会長とか

村とかだと年長が1番偉い
知識や経験と、肉体的な衰えがトレードオフ関係にあったが今は情報テクノロジーなどが発達してその関係が崩れた故に老い=マイナスになった?
身体知や非言語的な感覚、直感はどうか?

snowの反対
シワとか増やす
ゲームの老い
どうぶつの森とか

connecting hands
千手感温

(最初に即身仏って書いてるあたり、やはり自分は仏教で攻めがちなのだなと改めて思う・・・)

確かこの少し前に、東京都写真美術館でやっていた「内藤正敏 異界出現」という展示で、即身仏の写真や<婆バクハツ!>という元気はつらつなイタコ達を写真に納めたシリーズ作品を見ていたことが作品案を考える時に強く影響していたと思う。


千手感温(千手観紋の当初の作品名)は、階段を上る祖父の補助をするために手を握った時に、自分の手とのあまりの違いに驚いたという経験から、「手のaging」という方向性で考え出した。

「手」から連想→千手観音→もじってなんかいい感じにできないかな?→千手感温

といった具合で、最初に授業で発表した時は「人それぞれが持つ手の質感や温みを感じてもらう」という方向性は決まっていたものの、具体的な作品の形はほとんど決まっていなかった。


・授業で発表した当時のスライド

2.「千手観紋」へ

3人のメンバーが決まり、ミーティングを行う。

ミーティングのメモ

当初想定していた、温みや質感を精巧に再現した手を数十本用意するというのは技術的もコスト的にも不可能だという結論になり、来場者の手の視覚的な違いを見せるという作品にしようという流れに。そこで作品名の変更も余儀なくされ、人それぞれの手の視覚的な違いを改めて考えた時に、以前拝読したドミニク先生の『インターネットを生命化する プロクロニズムの思想と実践』という本で取りあげられていた「プロクロニズム」という言葉が浮かび、そこから「紋様」という言葉が連想され、最終的に「千手観紋」となった。

具体的な展示内容だが、この時の予定では

  1. 人大の像を用意する(grayscale展で用いたトルソーなどを使用予定だった)
  2. 体験者の腕を撮影し、それをテクスチャとしてあらかじめ用意した3Dモデルに貼り付け
  3. 観音像と腕をプロジェクションマッピングで投影、腕を動かす

という予定だった。(詳しくは中間発表のスライドを参照)

3.展示内容の見直し

10月後半あたりまでほとんど作業が進まず。今から考えると、unityで3dモデルを作って、撮影した手から一瞬でテクスチャを生成するシステムを作って、それをプロジェクションマッピングするというのが技術的にかなり無理があった。 半ば出展を諦めかけていたところ、竹田さんが「手の写真を加工して仏像の画像に手を生やす」という案を出してくれる。一先ずその案を授業で発表したところ、様々なフィードバックをいただき、最終的な展示の方向性が定まる。具体的な仕様は次の章を参照。


千手観紋の作り方

・仏像

自分が文学部美術史コースからのモグリだったという背景があり、事情を説明して美術史コースが所有している仏像レプリカをお借りした。

・仏壇

木で自作する予定だったが、時間やコストの関係で断念。木材は以外と高い。 調べると、ニトリでいい感じのサイズ(幅42cm 奥行30cm 高さ88cm)の棚が売っていたのでそれを組み立てた。 お値段なんと1500円(税込)。ニトリまじ有能。

仏壇っぽくするために、観音開きの蓋だけ自分たちで自作して取り付けた。

・手を入れる箱

木で作る予定だったが、時間やコストの関係で発泡スチロールとダンボールで制作。 木目調の見た目の発泡スチロールが売っており、これが思いの外リアルで、言われるまで誰も気づかないほど。ダイソーまじ有能。 これは今後の制作でも色々使えるかも。

手を入れる穴には排水溝に取り付けるゴム蓋をつけた。この蓋の裏に曲げセンサーを取り付け、そこが曲がるとマウスのボタン押しこみ(=録画開始)、真っ直ぐに戻るとボタンを離す(=録画停止)という設定にarduinoでしてある(後述)。

・映像

processingで出力。プログラミング関連の基本的な部分は全て橋田研の谷口さんが書いてくださったので、それを元に調整・拡張した。 コード自体はかなり長くなってしまったが、腕を40本生やすために同じ処理を位置を変えて繰り返してるだけなので、そこまで複雑ではない。 ソースコードは以下の通り。

ソースコードはこちら
import processing.video.*;

Capture cam;

int camWidth;
int camHeight;

PImage arm;
PImage kannon;

int armNumber = 39;

int nowImageIndex = 0;
int[] imageIndex = new int[armNumber];

int num = 0;
int[] count = new int[armNumber];

int R = 550; //しずくの大きさ調整用
int A = 5; //しずくの丸み調整用
 
void setup() {
  
  //change framerate and width, height by camera
  frameRate(30);
  camWidth = 300;
  camHeight = 150;
  //size(1080, 1920);
  fullScreen();
  kannon = loadImage("kannon/"+"kannon.png");
  
  String[] cams = Capture.list();
  for (int i = 0; i < cams.length; i++) {
    println(i);
    println(cams[i]);
  }
  cam = new Capture(this, cams[21]);//320*180の30fpsを選択
  cam.start();
    
  for(int i = 0; i < armNumber; i++){
    imageIndex[i] = 0;
    count[i] = 0;
  }
  
}
 
 void draw() {
  
      translate(width/2, height/2);
  
      background(0);
      imageMode(CENTER);
      /*image(kannon, 0, 100);*/
  
      if (cam.available()){
         cam.read();
     }
     
     /*tint(255, 100);*/ //image透過
     set(250 - camWidth/2, 1050 - camHeight/2, cam);
     fill(0);
     stroke(0);
     rectMode(CENTER);
     rect(-280, 170 - camHeight, camWidth*1.08,camHeight/2.5);
     rect(-280, 240 - camHeight/2, camWidth*1.08,camHeight/2.2);
     
          
     //save the video
     if (mousePressed == true){
       
       //getのところで画面を直接キャプチャしてる
       PImage saveImage = get(250 - camWidth/2, 1050 - camHeight/4, camWidth, camHeight/2);
       String imageName = "images/" + num + "_" + nowImageIndex++ + ".jpg";
       saveImage.save(imageName);
       
       //add below 3 lines for saving images
       PImage saveImage2 = get(250 - camWidth/2, 1050 - camHeight/4, camWidth, camHeight/2);
       String imageName2 = "archive/" + year() + "/" + month() + "/" + day() + "/" + hour() + "_" + minute() + "_" + second() + ".jpg";
       saveImage.save(imageName2);
     
     }
     
     
     //光背
     //中心線
     strokeWeight(1);
     stroke(200);
     line(width/2, 0, width/2, height);
     line(0, height/2, width, height/2);
    
     //しずく
     fill(136, 111, 67);
     strokeWeight(2);
     stroke(136, 111, 67);
     
      pushMatrix();
      translate(0, 225);
      rotate(radians(-90));
      beginShape();
      for (int theta = 0; theta < 360; theta++) {
      float r = 1 / (A * sin(radians(theta)/2)+1);
      vertex(R * r * cos(radians(theta)), R * r * sin(radians(theta)));
  }
      endShape(CLOSE);
      popMatrix();     
      
      
    
       
     //number0
     if(count[0] < imageIndex[0] - 1){
       arm = loadImage("images/" + "0_" + count[0] + ".jpg");
       pushMatrix();
       translate(0, 25);
       rotate(PI/40);
       imageMode(CENTER);
       image(arm, -270, -10);
       popMatrix();
       count[0]++;
     }else if(count[0] != 0){
       arm = loadImage("images/" + "0_" + count[0] + ".jpg");
       pushMatrix();
       translate(0, 25);
       rotate(PI/40);
       imageMode(CENTER);
       image(arm, -270, -10);
       popMatrix();
       count[0] = 0;
     }
     
     //number1
     if(count[1] < imageIndex[1] - 1){
       arm = loadImage("images/" + "1_" + count[1] + ".jpg");
       pushMatrix();
       translate(-100, -65);
       rotate(PI/12);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[1]++;
     }else if(count[1] != 0){
       arm = loadImage("images/" + "1_" + count[1] + ".jpg");
       pushMatrix();
       translate(-100, -65);
       rotate(PI/12);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[1] = 0;
     }
     
     //number2
     if(count[2] < imageIndex[2] - 1){
       arm = loadImage("images/" + "2_" + count[2] + ".jpg");
       pushMatrix();
       translate(-70, -145);
       rotate(PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[2]++;
     }else if(count[2] != 0){
       arm = loadImage("images/" + "2_" + count[2] + ".jpg");
       pushMatrix();
       translate(-70, -145);
       rotate(PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[2] = 0;
     }
     
     //number3
     if(count[3] < imageIndex[3] - 1){
       arm = loadImage("images/" + "3_" + count[3] + ".jpg");
       pushMatrix();
       translate(-50, -200);
       rotate(2*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[3]++;
     }else if(count[3] != 0){
       arm = loadImage("images/" + "3_" + count[3] + ".jpg");
       pushMatrix();
       translate(-50, -200);
       rotate(2*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[3] = 0;
     }
     
     //number4
     if(count[4] < imageIndex[4] - 1){
       arm = loadImage("images/" + "4_" + count[4] + ".jpg");
       pushMatrix();
       translate(-10, -230);
       rotate(3.2*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[4]++;
     }else if(count[4] != 0){
       arm = loadImage("images/" + "4_" + count[4] + ".jpg");
       pushMatrix();
       translate(-10, -230);
       rotate(3.2*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[4] = 0;
     }
     
     //number5
     if(count[5] < imageIndex[5] - 1){
       arm = loadImage("images/" + "5_" + count[5] + ".jpg");
       pushMatrix();
       translate(40, -230);
       rotate(4.8*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[5]++;
     }else if(count[5] != 0){
       arm = loadImage("images/" + "5_" + count[5] + ".jpg");
       pushMatrix();
       translate(40, -230);
       rotate(4.8*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[5] = 0;
     }
     
     //number6
     if(count[6] < imageIndex[6] - 1){
       arm = loadImage("images/" + "6_" + count[6] + ".jpg");
       pushMatrix();
       translate(60, -180);
       rotate(6.2*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[6]++;
     }else if(count[6] != 0){
       arm = loadImage("images/" + "6_" + count[6] + ".jpg");
       pushMatrix();
       translate(60, -180);
       rotate(6.2*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[6] = 0;
     }
     
     //number7
     if(count[7] < imageIndex[7] - 1){
       arm = loadImage("images/" + "7_" + count[7] + ".jpg");
       pushMatrix();
       translate(75, -130);
       rotate(7.5*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[7]++;
     }else if(count[7] != 0){
       arm = loadImage("images/" + "7_" + count[7] + ".jpg");
       pushMatrix();
       translate(75, -130);
       rotate(7.5*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[7] = 0;
     }
     
     //number8
     if(count[8] < imageIndex[8] - 1){
       arm = loadImage("images/" + "8_" + count[8] + ".jpg");
       pushMatrix();
       translate(75, -60);
       rotate(8*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[8]++;
     }else if(count[8] != 0){
       arm = loadImage("images/" + "8_" + count[8] + ".jpg");
       pushMatrix();
       translate(75, -60);
       rotate(8*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[8] = 0;
     }
     
     //number9
     if(count[9] < imageIndex[9] - 1){
       arm = loadImage("images/" + "9_" + count[9] + ".jpg");
       pushMatrix();
       translate(75, 20);
       rotate(8*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[9]++;
     }else if(count[9] != 0){
       arm = loadImage("images/" + "9_" + count[9] + ".jpg");
       pushMatrix();
       translate(75, 20);
       rotate(8*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[9] = 0;
     }
     
     //number10
     if(count[10] < imageIndex[10] - 1){
       arm = loadImage("images/" + "10_" + count[10] + ".jpg");
       pushMatrix();
       translate(75, 100);
       rotate(8*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[10]++;
     }else if(count[10] != 0){
       arm = loadImage("images/" + "10_" + count[10] + ".jpg");
       pushMatrix();
       translate(75, 100);
       rotate(8*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[10] = 0;
     }
     
     //number11
     if(count[11] < imageIndex[11] - 1){
       arm = loadImage("images/" + "11_" + count[11] + ".jpg");
       pushMatrix();
       translate(95, 180);
       rotate(8*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[11]++;
     }else if(count[11] != 0){
       arm = loadImage("images/" + "11_" + count[11] + ".jpg");
       pushMatrix();
       translate(95, 180);
       rotate(8*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[11] = 0;
     }
     
     //number12
     if(count[12] < imageIndex[12] - 1){
       arm = loadImage("images/" + "12_" + count[12] + ".jpg");
       pushMatrix();
       translate(95, 260);
       rotate(8*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[12]++;
     }else if(count[12] != 0){
       arm = loadImage("images/" + "12_" + count[12] + ".jpg");
       pushMatrix();
       translate(95, 260);
       rotate(8*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[12] = 0;
     }

     //number13
     if(count[13] < imageIndex[13] - 1){
       arm = loadImage("images/" + "13_" + count[13] + ".jpg");
       pushMatrix();
       translate(95, 340);
       rotate(8.2*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[13]++;
     }else if(count[13] != 0){
       arm = loadImage("images/" + "13_" + count[13] + ".jpg");
       pushMatrix();
       translate(95, 340);
       rotate(8.2*PI/8);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[13] = 0;
     }
     
     //number14
     if(count[14] < imageIndex[14] - 1){
       arm = loadImage("images/" + "14_" + count[14] + ".jpg");
       pushMatrix();
       translate(95, 400);
       rotate(PI+PI/15);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[14]++;
     }else if(count[14] != 0){
       arm = loadImage("images/" + "14_" + count[14] + ".jpg");
       pushMatrix();
       translate(95, 400);
       rotate(PI+PI/15);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[14] = 0;
     }
     
     //number15
     if(count[15] < imageIndex[15] - 1){
       arm = loadImage("images/" + "15_" + count[15] + ".jpg");
       pushMatrix();
       translate(95, 490);
       rotate(PI+PI/15);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[15]++;
     }else if(count[15] != 0){
       arm = loadImage("images/" + "15_" + count[15] + ".jpg");
       pushMatrix();
       translate(95, 490);
       rotate(PI+PI/15);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[15] = 0;
     }
     
     //number16
     if(count[16] < imageIndex[16] - 1){
       arm = loadImage("images/" + "16_" + count[16] + ".jpg");
       pushMatrix();
       translate(95, 580);
       rotate(PI+PI/15);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[16]++;
     }else if(count[16] != 0){
       arm = loadImage("images/" + "16_" + count[16] + ".jpg");
       pushMatrix();
       translate(95, 580);
       rotate(PI+PI/15);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[16] = 0;
     }
     
     //number17
     if(count[17] < imageIndex[17] - 1){
       arm = loadImage("images/" + "17_" + count[17] + ".jpg");
       pushMatrix();
       translate(95, 670);
       rotate(PI+PI/15);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[17]++;
     }else if(count[17] != 0){
       arm = loadImage("images/" + "17_" + count[17] + ".jpg");
       pushMatrix();
       translate(95, 670);
       rotate(PI+PI/15);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[17] = 0;
     }
     
     //number18
     if(count[18] < imageIndex[18] - 1){
       arm = loadImage("images/" + "18_" + count[18] + ".jpg");
       pushMatrix();
       translate(95, 760);
       rotate(PI+PI/15);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[18]++;
     }else if(count[18] != 0){
       arm = loadImage("images/" + "18_" + count[18] + ".jpg");
       pushMatrix();
       translate(95, 760);
       rotate(PI+PI/15);
       imageMode(CENTER);
       image(arm, -150, 0);
       popMatrix();
       count[18] = 0;
     }
     
//最後のコーナー
     
     //number19
     if(count[19] < imageIndex[19] - 1){
       arm = loadImage("images/" + "19_" + count[19] + ".jpg");
       pushMatrix();
       translate(-95, 810);
       rotate(PI+7.5*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[19]++;
     }else if(count[19] != 0){
       arm = loadImage("images/" + "19_" + count[19] + ".jpg");
       pushMatrix();
         translate(-95, 810);
       rotate(PI+7.5*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[19] = 0;
     }

     //number20
     if(count[20] < imageIndex[20] - 1){
       arm = loadImage("images/" + "20_" + count[20] + ".jpg");
       pushMatrix();
       translate(-95, 720);
       rotate(PI+7.5*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[20]++;
     }else if(count[20] != 0){
       arm = loadImage("images/" + "20_" + count[20] + ".jpg");
       pushMatrix();
         translate(-95, 720);
       rotate(PI+7.5*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[20] = 0;
     }

     //number21
     if(count[21] < imageIndex[21] - 1){
       arm = loadImage("images/" + "21_" + count[21] + ".jpg");
       pushMatrix();
       translate(-95, 630);
       rotate(PI+7.5*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[21]++;
     }else if(count[21] != 0){
       arm = loadImage("images/" + "21_" + count[21] + ".jpg");
       pushMatrix();
       translate(-95, 630);
       rotate(PI+7.5*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[21] = 0;
     }
     
     //number22
     if(count[22] < imageIndex[22] - 1){
       arm = loadImage("images/" + "22_" + count[22] + ".jpg");
       pushMatrix();
       translate(-95, 540);
       rotate(PI+7.5*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[22]++;
     }else if(count[22] != 0){
       arm = loadImage("images/" + "22_" + count[22] + ".jpg");
       pushMatrix();
       translate(-95, 540);
       rotate(PI+7.5*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[22] = 0;
     }
     
      //number23
     if(count[23] < imageIndex[23] - 1){
       arm = loadImage("images/" + "23_" + count[23] + ".jpg");
       pushMatrix();
       translate(-95, 450);
       rotate(PI+7.5*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[23]++;
     }else if(count[23] != 0){
       arm = loadImage("images/" + "23_" + count[23] + ".jpg");
       pushMatrix();
       translate(-95, 450);
       rotate(PI+7.5*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[23] = 0;
     }
     
     //number24
     if(count[24] < imageIndex[24] - 1){
       arm = loadImage("images/" + "24_" + count[24] + ".jpg");
       pushMatrix();
       translate(-130, 390);
       rotate(PI+7.85*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[24]++;
     }else if(count[24] != 0){
       arm = loadImage("images/" + "24_" + count[24] + ".jpg");
       pushMatrix();
       translate(-130, 390);
       rotate(PI+7.85*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[24] = 0;
     }
     
     //number25
     if(count[25] < imageIndex[25] - 1){
       arm = loadImage("images/" + "25_" + count[25] + ".jpg");
       pushMatrix();
       translate(-130, 310);
       rotate(PI+8*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[25]++;
     }else if(count[25] != 0){
       arm = loadImage("images/" + "25_" + count[25] + ".jpg");
       pushMatrix();
       translate(-130, 310);
       rotate(PI+8*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[25] = 0;
     }
     
     //number26
     if(count[26] < imageIndex[26] - 1){
       arm = loadImage("images/" + "26_" + count[26] + ".jpg");
       pushMatrix();
       translate(-130, 230);
       rotate(PI+8*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[26]++;
     }else if(count[26] != 0){
       arm = loadImage("images/" + "26_" + count[26] + ".jpg");
       pushMatrix();
       translate(-130, 230);
       rotate(PI+8*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[26] = 0;
     }

 // 2週目(外周)

     //number27
     if(count[27] < imageIndex[27] - 1){
       arm = loadImage("images/" + "27_" + count[27] + ".jpg");
       pushMatrix();
       translate(-240, -220);
       rotate(1.65*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[27]++;
     }else if(count[27] != 0){
       arm = loadImage("images/" + "27_" + count[27] + ".jpg");
       pushMatrix();
       translate(-240, -220);
       rotate(1.65*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[27] = 0;
     }     
     
     //number28
     if(count[28] < imageIndex[28] - 1){
       arm = loadImage("images/" + "28_" + count[28] + ".jpg");
       pushMatrix();
       translate(-190, -360);
       rotate(2.4*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[28]++;
     }else if(count[28] != 0){
       arm = loadImage("images/" + "28_" + count[28] + ".jpg");
       pushMatrix();
       translate(-190, -360);
       rotate(2.4*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[28] = 0;
     }
     
   
     //number29
     if(count[29] < imageIndex[29] - 1){
       arm = loadImage("images/" + "29_" + count[29] + ".jpg");
       pushMatrix();
       translate(110, -390);
       rotate(5.6*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[29]++;
     }else if(count[29] != 0){
       arm = loadImage("images/" + "29_" + count[29] + ".jpg");
       pushMatrix();
       translate(110, -390);
       rotate(5.6*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[29] = 0;
     }
     
     //number30
     if(count[30] < imageIndex[30] - 1){
       arm = loadImage("images/" + "30_" + count[30] + ".jpg");
       pushMatrix();
       translate(220, -280);
       rotate(6.35*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[30]++;
     }else if(count[30] != 0){
       arm = loadImage("images/" + "30_" + count[30] + ".jpg");
       pushMatrix();
       translate(220, -280);
       rotate(6.35*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[30] = 0;
     }
       
 
 
 //3週目
    
    
       //number31
     if(count[31] < imageIndex[31] - 1){
       arm = loadImage("images/" + "31_" + count[31] + ".jpg");
       pushMatrix();
       translate(-297, -370);
       rotate(2*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[31]++;
     }else if(count[31] != 0){
       arm = loadImage("images/" + "31_" + count[31] + ".jpg");
       pushMatrix();
       translate(-297, -370);
       rotate(2*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[31] = 0;
     }
     
     //number32
     if(count[32] < imageIndex[32] - 1){
       arm = loadImage("images/" + "32_" + count[32] + ".jpg");
       pushMatrix();
       translate(-180, -485);
       rotate(3*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[32]++;
     }else if(count[32] != 0){
       arm = loadImage("images/" + "32_" + count[32] + ".jpg");
       pushMatrix();
       translate(-180, -485);
       rotate(3*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[32] = 0;
     }
     
       //number33
     if(count[33] < imageIndex[33] - 1){
       arm = loadImage("images/" + "33_" + count[33] + ".jpg");
       pushMatrix();
       translate(-145, -520);
       rotate(4.5*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[33]++;
     }else if(count[33] != 0){
       arm = loadImage("images/" + "33_" + count[33] + ".jpg");
       pushMatrix();
       translate(-145, -520);
       rotate(4.5*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[33] = 0;
     }
     
     //number34
     if(count[34] < imageIndex[34] - 1){
       arm = loadImage("images/" + "34_" + count[34] + ".jpg");
       pushMatrix();
       translate(55, -500);
       rotate(3.5*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[34]++;
     }else if(count[34] != 0){
       arm = loadImage("images/" + "34_" + count[34] + ".jpg");
       pushMatrix();
       translate(55, -500);
       rotate(3.5*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[34] = 0;
     }
     
     
     //number35
     if(count[35] < imageIndex[35] - 1){
       arm = loadImage("images/" + "35_" + count[35] + ".jpg");
       pushMatrix();
       translate(105, -525);
       rotate(5*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[35]++;
     }else if(count[35] != 0){
       arm = loadImage("images/" + "35_" + count[35] + ".jpg");
       pushMatrix();
       translate(105, -525);
       rotate(5*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[35] = 0;
     }
     
     //number36
     if(count[36] < imageIndex[36] - 1){
       arm = loadImage("images/" + "36_" + count[36] + ".jpg");
       pushMatrix();
       translate(250, -418);
       rotate(6.2*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[36]++;
     }else if(count[36] != 0){
       arm = loadImage("images/" + "36_" + count[36] + ".jpg");
       pushMatrix();
       translate(250, -418);
       rotate(6.2*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[36] = 0;
     }
     
     //number37
     if(count[37] < imageIndex[37] - 1){
       arm = loadImage("images/" + "37_" + count[37] + ".jpg");
       pushMatrix();
       translate(-380, -130);
       rotate(2.2*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[37]++;
     }else if(count[37] != 0){
       arm = loadImage("images/" + "37_" + count[37] + ".jpg");
       pushMatrix();
       translate(-380, -130);
       rotate(2.2*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[37] = 0;
     }
     
     //number38
     if(count[38] < imageIndex[38] - 1){
       arm = loadImage("images/" + "38_" + count[38] + ".jpg");
       pushMatrix();
       translate(298, -130);
       rotate(5.6*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[38]++;
     }else if(count[38] != 0){
       arm = loadImage("images/" + "38_" + count[38] + ".jpg");
       pushMatrix();
       translate(298, -130);
       rotate(5.6*PI/8);
       imageMode(CENTER);
       image(arm, -150, -55);
       popMatrix();
       count[38] = 0;
     }
          
     //しずくの下の長方形(光背)
     rotate(4*PI/8);
     fill(136, 111, 67);
     rect(510, 0, 900, 267);       
   
}

void mouseReleased(){
  
  imageIndex[num] = nowImageIndex;
  num++;
  nowImageIndex = 0;
  
  //reset num
  if(num == armNumber){
    num = 0;
  }
  
}

・その他

arduinoのソースコードは下記の通り。 単純に曲げセンサーを用いて曲がったら(抵抗値が一定の値を越えたら)マウスのボタン押しこみ、真っ直ぐに戻ったらマウスのボタンを離す、と設定しているだけで、processingとarduinoを直接連携させている訳ではないのでめんどくさくなかった。

ソースコードはこちら
#include "Mouse.h"
#define ANALOG_PIN 0

int val;

void setup(){
 Mouse.begin();

}

void loop(){

 val = analogRead(ANALOG_PIN);

 if(val > 820){

   Mouse.press(MOUSE_LEFT);

 }

 else if(val <= 820){

   Mouse.release(MOUSE_LEFT);

 }

 delay(500);
}

当日いただいたフィードバック

  • 自分の手が動くのをを画面越しに見ると普段とは違う動きをしてしまう
  • ユークリッドの<<指紋の池>>を想起させる
  • 不思議な不気味さがある(スプツニ子さん)
  • 手の形だけではなく、動きからも年齢や性格が垣間見える
  • 箱の中に手を入れるのが怖い
  • 画面切れてるのがもったいない
  • 画質悪くて手の違いがわかりにくい
  • 見せ方はいい
  • 配線とかをうまく隠して、これだけで1つの世界として完結してるのがいい
  • 自分の手がどれか(どこから出てきてるのか)わかりにくい
  • もう一個手をよく見せるインターフェースがあってもいい
  • 子どもも一緒に参加できたのが嬉しかった(子連れの方)

展示をやってみて。雑記

  • フィードバックのところに書いた、

配線とかをうまく隠して、これだけで1つの世界として完結してるのがいい

という意見を数多くもらえて、それが嬉しかったし、橋田研と比較してみて、その 展示作品の見せ方(魅せ方) という部分がドミニクゼミの強みであり、今後もこだわるべきところかなと思った。

  • 「気持ち悪い」とか「罰当たり」などといったコメントが来ないか当日不安だったが、以外にもそのようなコメントはほとんどなく、体感として特にご年配の方ほど作品を真面目に受け取っている傾向が感じられたのが興味深かった。

  • 大きいものや、ハードを作ると展示後の置き場所や処理に困る。仏壇と腕入れる箱どうしよう・・・

⚠️ **GitHub.com Fallback** ⚠️