チュートリアル | (トピック一覧へ戻る) |
import processing.opengl.*; import igeo.*; size(480, 360, IG.GL); IG.open("surface10.3dm"); ISurface[] surfaces = IG.surfaces(); for (ISurface surf : surfaces) { int unum = 36, vnum = 24; double uinc = 1.0/unum, vinc = 1.0/vnum; for (int i=0; i < unum; i++) { for (int j=0; j < vnum; j++) { if( (i+j)%2==0 ){ IVec pt1 = surf.pt( (i-1)*uinc, j*vinc ); IVec pt2 = surf.pt( i*uinc, (j+1)*vinc ); IVec pt3 = surf.pt( (i+1)*uinc, j*vinc ); IVec pt4 = surf.pt( i*uinc, (j-1)*vinc ); new ISurface(pt1,pt2,pt3,pt4).clr(0.3,0.4*j*vinc,i*uinc*0.8); } } } surf.del(); }
菱型パネルの曲面に変形するために、4つの頂点を指定して菱型を生成するのではなく、 3×3の9点の制御点を用意して、曲面のU方向、V方向の次数をともに2にします。 そして中央の制御点を入力曲面の法線方向に移動して、生成パネルを曲面状にします。
import processing.opengl.*; import igeo.*; size(480, 360, IG.GL); IG.open("surface10.3dm"); ISurface[] surfaces = IG.surfaces(); for (ISurface surf : surfaces) { int unum = 36, vnum = 24; double uinc = 1.0/unum, vinc = 1.0/vnum; for (int i=0; i < unum; i++) { for (int j=0; j < vnum; j++) { if ( (i+j)%2==0 ) { IVec[][]cpts = new IVec[3][3]; // corner 1 cpts[0][0] = surf.pt( (i-1)*uinc, j*vinc ); cpts[1][0] = surf.pt( (i-0.5)*uinc, (j+0.5)*vinc ); // corner 2 cpts[2][0] = surf.pt( i*uinc, (j+1)*vinc ); cpts[2][1] = surf.pt( (i+0.5)*uinc, (j+0.5)*vinc ); // corner 3 cpts[2][2] = surf.pt( (i+1)*uinc, j*vinc ); cpts[1][2] = surf.pt( (i+0.5)*uinc, (j-0.5)*vinc ); // corner 4 cpts[0][2] = surf.pt( i*uinc, (j-1)*vinc ); cpts[0][1] = surf.pt( (i-0.5)*uinc, (j-0.5)*vinc ); // center cpts[1][1] = surf.pt( i*uinc, j*vinc, -1 ); new ISurface( cpts, 2, 2 ).clr(0.3, 0.4*j*vinc, i*uinc*0.8); } } } surf.del(); }
次に、菱型曲面の角にある制御点も法線方向に移動します。 角の点の移動量と中央の点の移動量は変数 centerDepthとfrontDepthで指定されています。
import processing.opengl.*; import igeo.*; size(480, 360, IG.GL); IG.open("surface10.3dm"); ISurface[] surfaces = IG.surfaces(); for (ISurface surf : surfaces) { int unum = 36, vnum = 24; double uinc = 1.0/unum, vinc = 1.0/vnum; for (int i=0; i < unum; i++) { for (int j=0; j < vnum; j++) { if ( (i+j)%2==0 ) { double centerDepth = -1.5; double frontDepth = -1; IVec[][]cpts = new IVec[3][3]; // corner 1 cpts[0][0] = surf.pt( (i-1)*uinc, j*vinc ); cpts[1][0] = surf.pt( (i-0.5)*uinc, (j+0.5)*vinc ); // corner 2 cpts[2][0] = surf.pt( i*uinc, (j+1)*vinc ); cpts[2][1] = surf.pt( (i+0.5)*uinc, (j+0.5)*vinc, frontDepth/2 ); // corner 3 cpts[2][2] = surf.pt( (i+1)*uinc, j*vinc, frontDepth ); cpts[1][2] = surf.pt( (i+0.5)*uinc, (j-0.5)*vinc, frontDepth/2 ); // corner 4 cpts[0][2] = surf.pt( i*uinc, (j-1)*vinc ); cpts[0][1] = surf.pt( (i-0.5)*uinc, (j-0.5)*vinc ); // center cpts[1][1] = surf.pt( i*uinc, j*vinc, centerDepth ); new ISurface( cpts, 2, 2 ).clr(0.3, 0.4*j*vinc, i*uinc*0.8); } } } surf.del(); }
最後にパイプを生成してダイアグリッド構造を生成します。
また、変数centerDepthとfrontDepthは
右の入力画像値で値が制御されることによって、菱型パネルの膨らみ具合と角の開き具合が
調整されます。
import processing.opengl.*; import igeo.*; size(480, 360, IG.GL); IG.open("surface10.3dm"); ISurface[] surfaces = IG.surfaces(); IImageMap map = new IImageMap("map4.jpg"); for (ISurface surf : surfaces) { int unum = 36, vnum = 24; double uinc = 1.0/unum, vinc = 1.0/vnum; for (int i=0; i < unum; i++) { for (int j=0; j < vnum; j++) { if ( (i+j)%2==0 ) { double val = map.get(i*uinc, j*vinc); double centerDepth = -2*val; double frontDepth = -1.5*val; IVec[][]cpts = new IVec[3][3]; // corner 1 cpts[0][0] = surf.pt( (i-1)*uinc, j*vinc ); cpts[1][0] = surf.pt( (i-0.5)*uinc, (j+0.5)*vinc ); // corner 2 cpts[2][0] = surf.pt( i*uinc, (j+1)*vinc ); cpts[2][1] = surf.pt( (i+0.5)*uinc, (j+0.5)*vinc, frontDepth/2 ); // corner 3 cpts[2][2] = surf.pt( (i+1)*uinc, j*vinc, frontDepth ); cpts[1][2] = surf.pt( (i+0.5)*uinc, (j-0.5)*vinc, frontDepth/2 ); // corner 4 cpts[0][2] = surf.pt( i*uinc, (j-1)*vinc ); cpts[0][1] = surf.pt( (i-0.5)*uinc, (j-0.5)*vinc ); // center cpts[1][1] = surf.pt( i*uinc, j*vinc, centerDepth ); new ISurface(cpts, 2, 2).clr(0.3, 0.4*j*vinc, i*uinc*0.8); double structureDepth = 0.1; double structureRadius = 0.05; IVec pt1 = surf.pt( (i-1)*uinc, j*vinc, structureDepth); IVec pt2 = surf.pt( i*uinc, (j+1)*vinc, structureDepth); IVec pt3 = surf.pt( (i+1)*uinc, j*vinc, structureDepth); IVec pt4 = surf.pt( i*uinc, (j-1)*vinc, structureDepth); new ICylinder(pt1,pt2,structureRadius).clr(0.2); new ICylinder(pt1,pt4,structureRadius).clr(0.2); if(j == 0 && i < unum-1){ new ICylinder(pt3,pt4,structureRadius).clr(0.2); } if(j == vnum-1 && i < unum-1){ new ICylinder(pt2,pt3,structureRadius).clr(0.2); } } } } surf.del(); }