home processing download documents tutorial python tutorial gallery source about
 チュートリアル (トピック一覧へ戻る)

幾何学オブジェクトへの画像値マッピング

     画像による線の長さの制御

IImageMapを用いると読み込んだ画像の情報から 幾何学オブジェクトの生成や変形を制御できます。 get(double,double)メソッドを用いると、 曲面上の点をサンプルするように、画像内のUV座標(0から1)を指定することによって あるUV位置における画像の値(明度による0から1の間の値)を取得できます。 IImageMapのコンストラクタにはファイル名を与えます。 画像ファイルはSketch>Add Fileメニューなどでスケッチ・フォルダの中に置かれているのが推奨されます。 読み込める画像フォーマットはJPEG, PNG, GIFです。

以下のコードでは、getメソッドで取得された値を用いて、曲面から点をサンプルするときのオフセット量を コントロールし、生成される線の長さを変えています。 コードでは右の画像と下のファイルが用いられます。

surface6.3dm


import processing.opengl.*;
import igeo.*;

size(480, 360, IG.GL);

IG.open("surface6.3dm");
ISurface[] surfaces = IG.surfaces();

IImageMap map = new IImageMap("map1.jpg");

for (ISurface surf : surfaces) {
  int unum = 50, vnum = 50;
  double uinc = 1.0/unum, vinc = 1.0/vnum;

  for (int i=0; i < unum; i++) {
    for (int j=0; j < vnum; j++) {
      double val = map.get( i*uinc, j*vinc );

      IVec pt1 = surf.pt( i*uinc, j*vinc );
      IVec pt2 = surf.pt( i*uinc, j*vinc, val*-10 );
      new ICurve(pt1, pt2).clr(0);
    }
  }
}


     画像によるパネルのオフセット量の制御

以下のコードでは、矩形のパネル化において、矩形の角の一点のオフセット量を画像からの値で コントロールしています。
右の画像と下ののファイルがコードで用いられます。

surface7.3dm


import processing.opengl.*;
import igeo.*;

size(480, 360, IG.GL);

IG.open("surface7.3dm");
ISurface[] surfaces = IG.surfaces();

IImageMap map = new IImageMap("map1.jpg");

for (ISurface surf : surfaces) {
  int unum = 20, vnum = 20;
  double uinc = 1.0/unum, vinc = 1.0/vnum;

  for (int i=0; i < unum; i++) {
    for (int j=0; j < vnum; j++) {
      double val = map.get( i*uinc, j*vinc );

      IVec pt11 = surf.pt( i*uinc, j*vinc );
      IVec pt21 = surf.pt( (i+1)*uinc, j*vinc );
      IVec pt12 = surf.pt( i*uinc, (j+1)*vinc, val*-4 );
      IVec pt22 = surf.pt( (i+1)*uinc, (j+1)*vinc );
      new ISurface(pt11, pt12, pt22, pt21).clr(.3);
    }
  }
  surf.del();
}


     画像によるパネルの幅の制御

この例では、パネルの幅が画像値によってコントロールされます。 幅は曲面上の点をサンプルするときの、V座標の位置を移動することで 制御しています。



import processing.opengl.*;
import igeo.*;

size(480, 360, IG.GL);

IG.open("surface7.3dm");
ISurface[] surfaces = IG.surfaces();

IImageMap map = new IImageMap("map1.jpg");

for (ISurface surf : surfaces) {
  int unum = 20, vnum = 20;
  double uinc = 1.0/unum, vinc = 1.0/vnum;

  for (int i=0; i < unum; i++) {
    for (int j=0; j < vnum; j++) {
      double val = map.get( i*uinc, j*vinc );

      IVec pt11 = surf.pt( i*uinc, j*vinc );
      IVec pt21 = surf.pt( (i+1)*uinc, j*vinc );
      IVec pt12 = surf.pt( i*uinc, (j + val)*vinc );
      IVec pt22 = surf.pt( (i+1)*uinc, (j + val)*vinc );
      new ISurface(pt11, pt12, pt22, pt21).clr(.3);
    }
  }
  surf.del();
}

以下ではU座標の位置を調整しています。

import processing.opengl.*;
import igeo.*;

size(480, 360, IG.GL);

IG.open("surface7.3dm");
ISurface[] surfaces = IG.surfaces();

IImageMap map = new IImageMap("map1.jpg");

for (ISurface surf : surfaces) {
  int unum = 20, vnum = 20;
  double uinc = 1.0/unum, vinc = 1.0/vnum;

  for (int i=0; i < unum; i++) {
    for (int j=0; j < vnum; j++) {
      double val = map.get( i*uinc, j*vinc );

      IVec pt11 = surf.pt( i*uinc, j*vinc );
      IVec pt21 = surf.pt( (i + val)*uinc, j*vinc );
      IVec pt12 = surf.pt( i*uinc, (j + 1)*vinc );
      IVec pt22 = surf.pt( (i + val )*uinc, (j + 1)*vinc );
      new ISurface(pt11, pt12, pt22, pt21).clr(.3);
    }
  }
  surf.del();
}


     画像によるパネルの回転角の制御

ここでは画像値に応じてパネルの回転角を制御しています。 パネルは中心から、法線方向を軸に回転させています。



import processing.opengl.*;
import igeo.*;

size(480, 360, IG.GL);

IG.open("surface7.3dm");
ISurface[] surfaces = IG.surfaces();

IImageMap map = new IImageMap("map1.jpg");

for (ISurface surf : surfaces) {
  int unum = 20, vnum = 20;
  double uinc = 1.0/unum, vinc = 1.0/vnum;

  for (int i=0; i < unum; i++) {
    for (int j=0; j < vnum; j++) {
      double val = map.get( i*uinc, j*vinc );

      IVec pt11 = surf.pt( i*uinc, j*vinc );
      IVec pt21 = surf.pt( (i + 1)*uinc, j*vinc );
      IVec pt12 = surf.pt( i*uinc, (j + (1-val) )*vinc );
      IVec pt22 = surf.pt( (i + 1)*uinc, (j + (1-val) )*vinc );
      ISurface panel = new ISurface(pt11, pt12, pt22, pt21).clr(.2);
      
      IVec center = surf.pt( (i+0.5)*uinc, (j+0.5)*vinc );
      IVec normal = surf.nml( (i+0.5)*uinc, (j+0.5)*vinc );
      panel.rot(center, normal, val*PI/4 );
    }
  }
  surf.del();
}


     画像によるパネルの拡大・縮小

この例では、画像値に応じてパネルを拡大・縮小しています。




import processing.opengl.*;
import igeo.*;

size(480, 360, IG.GL);

IG.open("surface7.3dm");
ISurface[] surfaces = IG.surfaces();

IImageMap map = new IImageMap("map1.jpg");

for (ISurface surf : surfaces) {
  int unum = 40, vnum = 40;
  double uinc = 1.0/unum, vinc = 1.0/vnum;

  for (int i=0; i < unum; i++) {
    for (int j=0; j < vnum; j++) {
      double val = map.get( i*uinc, j*vinc );

      IVec pt11 = surf.pt( i*uinc, j*vinc );
      IVec pt21 = surf.pt( (i + 1)*uinc, j*vinc );
      IVec pt12 = surf.pt( i*uinc, (j + 1)*vinc );
      IVec pt22 = surf.pt( (i + 1)*uinc, (j + 1)*vinc );
      ISurface panel = new ISurface(pt11, pt12, pt22, pt21).clr(.2);
      
      IVec center = surf.pt( (i+0.5)*uinc, (j+0.5)*vinc );
      // val is inverted by subtraction
      panel.scale(center, 1 - val );
    }
  }
  surf.del();
}


     画像のピクセルからのパネルの色指定

この例では、IImageMapクラスのgetメソッドでパネルを変形するだけでなく、 clr()メソッドも用いることによって、画像の色をサンプルして、 それをパネルの色に設定しています。


import processing.opengl.*;
import igeo.*;

size(480, 360, IG.GL);

IG.open("surface7.3dm");
ISurface[] surfaces = IG.surfaces();

IImageMap map = new IImageMap("map2.jpg");

for (ISurface surf : surfaces) {
  int unum = 40, vnum = 40;
  double uinc = 1.0/unum, vinc = 1.0/vnum;

  for (int i=0; i < unum; i++) {
    for (int j=0; j < vnum; j++) {
      double val = map.get( i*uinc, j*vinc );

      IVec pt11 = surf.pt( i*uinc, j*vinc );
      IVec pt21 = surf.pt( (i + 1)*uinc, j*vinc );
      IVec pt12 = surf.pt( i*uinc, (j + 1)*vinc, val*-4 );
      IVec pt22 = surf.pt( (i + 1)*uinc, (j + 1)*vinc );
      ISurface panel = new ISurface(pt11, pt12, pt22, pt21);

      panel.clr(map.clr( i*uinc, j*vinc ));
    }
  }
  surf.del();
}


(トピック一覧へ戻る)

HOME
FOR PROCESSING
DOWNLOAD
DOCUMENTS
TUTORIALS (Java / Python)
GALLERY
SOURCE CODE(GitHub)
PRIVACY POLICY
ABOUT/CONTACT