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

パネル化アルゴリズム例

     パネル化アルゴリズム例その6

この例では曲面上に多くの点からなる曲線を生成し、それを押し出して曲面パネルを生成します。 例で用いられる入力ファイルは以下です。

surface8.3dm

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

size(480, 360, IG.GL);

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

int unum = 10, vnum = 30;
double uinc = 1.0/unum, vinc = 1.0/vnum;

for (ISurface surf : surfaces) {
  for (int i=0; i < unum; i++) {
    IVec[] pts = new IVec[vnum+1];

    for (int j=0; j <= vnum; j++) {
      if (j%2==0) {
        pts[j] = surf.pt(i*uinc, j*vinc);
      }
      else {
        pts[j] = surf.pt((i+1)*uinc, j*vinc);
      }
    }
    new ICurve(pts).clr(0);
  }
  surf.del();
}

次のコードでは波状に上下する制御点の振れ幅が右の画像のグレー値によって調整されます。 NURBS曲線の次数も2に変更され、滑らかな曲線となるようにします。


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

size(480, 360, IG.GL);

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

int unum = 20, vnum = 60;
double uinc = 1.0/unum, vinc = 1.0/vnum;

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

for (ISurface surf : surfaces) {
  for (int i=0; i < unum; i++) {
    IVec[] pts = new IVec[vnum+1];

    for (int j=0; j <= vnum; j++) {
      if (j%2==0) {
        pts[j] = surf.pt(i*uinc, j*vinc);
      }
      else {
        // bitmap value is sampled. note that u and v is swapped to match with u-v of the input surface.
        double val = map.get( j*vinc, i*uinc );

        pts[j] = surf.pt((i+val)*uinc, j*vinc);
      }
    }
    new ICurve(pts, 2).clr(0);
  }
  surf.del();
}

次に、曲線がY軸方向に押し出され、曲面が生成されます。

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

size(480, 360, IG.GL);

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

int unum = 20, vnum = 60;
double uinc = 1.0/unum, vinc = 1.0/vnum;

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

for (ISurface surf : surfaces) {
  for (int i=0; i < unum; i++) {
    IVec[] pts = new IVec[vnum+1];

    for (int j=0; j <= vnum; j++) {
      if (j%2==0) {
        pts[j] = surf.pt(i*uinc, j*vinc);
      }
      else {
        // bitmap value is sampled. note that u and v is swapped to match with u-v of the input surface.
        double val = map.get( j*vinc, i*uinc );

        pts[j] = surf.pt((i+val)*uinc, j*vinc);
      }
    }
    ICurve crv = new ICurve(pts, 2).clr(0);
    IVec extrudeDir = new IVec(0, -2, 0);
    IG.extrude(crv, extrudeDir).clr(0,0,i*uinc,0.5);
  }
  surf.del();
}

最後に、押し出す幅が乱数でランダム化され、押し出した縁に沿った曲線を用いて パイプ曲面を生成します。

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

size(480, 360, IG.GL);

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

int unum = 20, vnum = 60;
double uinc = 1.0/unum, vinc = 1.0/vnum;

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

for (ISurface surf : surfaces) {
  for (int i=0; i < unum; i++) {
    IVec[] pts = new IVec[vnum+1];

    for (int j=0; j <= vnum; j++) {
      if (j%2==0) {
        pts[j] = surf.pt(i*uinc, j*vinc);
      }
      else {
        // bitmap value is sampled. note that u and v is swapped to match with u-v of the input surface.
        double val = map.get( j*vinc, i*uinc );
        pts[j] = surf.pt((i+val)*uinc, j*vinc);
      }
    }
    ICurve crv = new ICurve(pts, 2).clr(0);
    IVec extrudeDir = new IVec(0, IRandom.get(-3, -1), 0);
    IG.extrude(crv, extrudeDir).clr(0,0,i*uinc,0.5);

    ICurve crv2 = crv.cp(extrudeDir);
    IG.pipe(crv2, 0.1).clr(0.2);
  }
  surf.del();
}


(トピック一覧へ戻る)

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