yoppa.org


immediate bitwave

前橋工科大学 – デザイン演習 II 2021

第2課題演習 – The Last Clockをp5.jsで作ってみる

「時間を表現する」という第2課題の練習として、The Last Clockをp5.jsで実現してみましょう!

カメラ入力基本

画面中央にカメラ映像(640 x 480)を表示するサンプル

let capture;

function setup() {
  createCanvas(windowWidth, windowHeight);
  //Webcamキャプチャー設定
  capture = createCapture(VIDEO);
  capture.size(640, 480);
  capture.hide();
}

function draw() {
  background(0);
  //キャプチャーした映像を画面中央に描画
  imageMode(CENTER);
  image(capture, width / 2, height / 2, 640, 480);
}

スリット画像抽出

中心の縦1ピクセル分だけ抽出する (スリット)

let capture;
let slitX = 0;

function setup() {
  createCanvas(windowWidth, windowHeight);
  //Webcamキャプチャー設定
  capture = createCapture(VIDEO);
  capture.size(640, 480);
  capture.hide();
  background(0);
}

function draw() {  
  imageMode(CENTER);
  //カメラ映像の左右の中心1pixelを抽出
  let scan = capture.get(capture.width/2, 0, 1, 480);
  //抽出した画像を描画
  image(scan, width/2, height/2);
}

スリットスキャン

スリットで抽出した画像を横に並べていく(スリットスキャン)

let capture;
let slitX = 0;

function setup() {
  createCanvas(windowWidth, windowHeight);
  //Webcamキャプチャー設定
  capture = createCapture(VIDEO);
  capture.size(640, 480);
  capture.hide();
  background(0);
}

function draw() {  
  imageMode(CENTER);
  //カメラ映像の左右の中心1pixelを抽出
  let scan = capture.get(capture.width/2, 0, 1, 480);
  //スキャンした画像の軌跡を残しながら横に移動
  image(scan, slitX, height/2);
  slitX = (slitX + 1) % width;
}

スキャンした画像を回転 (1分で1周)

let capture;
let slitX = 0;

function setup() {
  createCanvas(windowWidth, windowHeight);
  //Webcamキャプチャー設定
  capture = createCapture(VIDEO);
  capture.size(640, 480);
  capture.hide();
  background(0);
}

function draw() {  
  imageMode(CENTER);
  //カメラ映像の左右の中心1pixelを抽出
  let scan = capture.get(capture.width/2, 0, 1, 480);
  //ミリ秒を換算した秒を計算
  let ms = millis() / 1000.0;
  let s = second();
  s = (s/1000.0) + ms;
  //円形にスキャンした画像の軌跡を描く
  translate(width/2, height/2);
  push();
  rotate(radians(s * 6.0));
  image(scan, 0, -height/3, 4, height/6);
  pop();
}

The Last Clockへ!

分針と時針を追加して、The Last Clockのカバーへ!

let capture;
let slitX = 0;

function setup() {
  createCanvas(windowWidth, windowHeight);
  //Webcamキャプチャー設定
  capture = createCapture(VIDEO);
  capture.size(640, 480);
  capture.hide();
  background(0);
}

function draw() {
  imageMode(CENTER);
  //カメラ映像の左右の中心1pixelを抽出
  let scan = capture.get(capture.width / 2, 0, 1, 480);
  //ミリ秒を換算した秒を計算
  let ms = millis() / 1000.0;
  let s = second();
  s = (s / 1000.0) + ms;
  let m = minute() + (second() / 60.0);
  let h = hour() + (minute() / 60.0);
  //円形にスキャンした画像の軌跡を描く
  translate(width / 2, height / 2);
  //秒針
  push();
  rotate(radians(s * 6.0));
  image(scan, 0, -height / 12 * 5, 2, height / 6);
  pop();
  //分針
  push();
  rotate(radians(m * 6.0));
  image(scan, 0, -height / 12 * 3, 1, height / 6);
  pop();
  //時針
  push();
  rotate(radians(h * 30.0));
  image(scan, 0, -height / 12, 1, height / 6);
  pop();
  //枠線
  noFill();
  stroke(127);
  strokeWeight(0.5);
  circle(0, 0, height);
  circle(0, 0, height/3*2);
  circle(0, 0, height/3);
}