最近話題の片目3DをProcessingで試してみた

  • 8
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

概要

最近話題の「片目3D」「GIFに2本線で浮き出て見える」と言った技術を自分でジェネレートするとどう見えるのかシミュレーションしてみました。

参考リンク

なにこれすごい「アニメGIFに縦線2本を入れるだけで裸眼で3D化」
試してみて!!裸眼で3D?! GIF画像に縦線2本を入れるだけで3D化できることが判明!!
ルパン三世のOPに隠された技術!片目で見るとなんと立体映像に!

実行方法

OpenProcessingで実行
または お手元のProcessing環境で
- 1. Processingの作業ディレクトリを作成
- 2.下記ソースコードをディレクトリ名と同じファイル名.pdeとして保存
- 3.Processing上で実行

ソースコード

line3d.pde
float d = 0;
int SPEED=4;
int BAR_WIDTH = 25;
int MARGIN = 200;

void setup() {
  size(600, 600);
  rectMode(CENTER); 
  smooth();
}

//  影用
float saveX, saveY;

void draw() {
  background(128); 
  drawBackgroundBorder();

  //  オブジェクト描画
  float z = (d % 180) / int(90 /SPEED);

  if (z < 1) {
    drawDia();
    drawLeftBar();
    drawFrame();
    drawRightBar();
  } else if (z < 3) {
    drawLeftBar();
    drawFrame();
    drawDia();
    drawRightBar();
  } else if (z < 5) {
    drawLeftBar();
    drawFrame();
    drawRightBar();
    drawDia();
  } else if (z < 7) {
    drawLeftBar();
    drawFrame();
    drawDia();
    drawRightBar();
  } else if (z < 9) {
    drawDia();
    drawLeftBar();
    drawFrame();
    drawRightBar();
  }
  d += 0.5;
}

void drawDia() {
  float x = width / 2 + sin(radians(d)) * 30;
  float y = height / 2 + cos(radians(d * 2)) * 50;
  float s = abs(sin(radians(d))) * 500;

  //  着地した際の座標を記録
  if (d % 180 < 1) {
    saveX = x;
    saveY = y;
  }

  float rotation = radians(d * SPEED);

  //  影の描画
  fill(0, 128);
  noStroke();
  pushMatrix();
  translate(saveX, saveY);
  rotate(rotation); 
  rect(0, 0, s * 0.6, s / 10);
  popMatrix();

  //  オブジェクトの描画
  fill(255);
  stroke(0);
  strokeWeight(1);
  pushMatrix();
  translate(x, y);
  rotate(rotation); 
  rect(0, 0, s * 1.2, s / 5);
  ellipse(0, 0, s / 10, s / 10);

  //  焦点のずれ
  stroke(128);
  float w = abs(sin(radians(d)));

  noFill();
  strokeWeight(w * w * w * 5);
  stroke(0, 64);
  rect(0, 0, s * 1.2, s / 5);
  ellipse(0, 0, s / 10, s / 10);

  noFill();
  strokeWeight(w * w * w * 10);
  stroke(0, 32);
  rect(0, 0, s * 1.2, s / 5);
  ellipse(0, 0, s /10, s / 10);
  popMatrix();
}

void drawBackgroundBorder() {
  //  背景(地面)
  int slopeWeight = 5;
  strokeWeight(slopeWeight);
  stroke(192);
  float offset = d * SPEED % 10;
  int slopelength  = height / slopeWeight/2;
  for (int i = 0; i <slopelength; i++) {
    line(0, i*2*slopeWeight + offset, width, i*2*slopeWeight + offset);
  }
}

void drawFrame() {
  noFill();
  strokeWeight(50);
  rect(width / 2, height / 2, width, height);
}

void drawLeftBar() {
  drawBar(MARGIN);
}
void drawRightBar() {
  drawBar(width - MARGIN);
}
void drawBar(int position) {
  fill(0);
  stroke(0);
  strokeWeight(1);
  rect(position, height / 2, BAR_WIDTH, height);
}