チュートリアル | (back to the list of tutorials) |
まず曲面上に少しの間隔をあけて矩形のパネルを生成します。
import processing.opengl.*; import igeo.*; size(480,360,IG.GL); IG.open("surface3.3dm"); ISurface[] surfs = IG.surfaces(); ISurface surf = surfs[0]; int unum = 10; int vnum = 20; double uinc = 1./unum; double vinc = 1./vnum; // gap ratio between rectangular panel double gap = 0.25; for(int i=0; i < unum; i++){ for(int j=0; j < vnum; j++){ IVec pt1 = surf.pt(i*uinc, j*vinc); IVec pt2 = surf.pt((i+1-gap)*uinc, j*vinc); IVec pt3 = surf.pt((i+1-gap)*uinc, (j+1-gap)*vinc); IVec pt4 = surf.pt(i*uinc, (j+1-gap)*vinc); new ISurface(pt1,pt2,pt3,pt4); } } surf.del();
次に、矩形のパネルの代わりにIBoxクラスを用いて 直方体を生成します。IBoxは8つの点を入力にとります。
import processing.opengl.*; import igeo.*; size(480,360,IG.GL); IG.open("surface3.3dm"); ISurface[] surfs = IG.surfaces(); ISurface surf = surfs[0]; int unum = 20; int vnum = 40; double uinc = 1./unum; double vinc = 1./vnum; double gap = 0.25; for(int i=0; i < unum; i++){ for(int j=0; j < vnum; j++){ IVec pt1 = surf.pt(i*uinc, j*vinc); IVec pt2 = surf.pt((i+1-gap)*uinc, j*vinc); IVec pt3 = surf.pt((i+1-gap)*uinc, (j+1-gap)*vinc); IVec pt4 = surf.pt(i*uinc, (j+1-gap)*vinc); // bottom points IVec bpt1 = pt1.dup(); IVec bpt2 = pt2.dup(); IVec bpt3 = pt3.dup(); IVec bpt4 = pt4.dup(); // move bottom points to xy-plane bpt1.z=0; bpt2.z=0; bpt3.z=0; bpt4.z=0; // create a box randomly if(IRandom.percent(80)){ new IBox(pt1,pt2,pt3,pt4,bpt1,bpt2,bpt3,bpt4).clr(1-j*vinc); } } } surf.del();
最後に、パネル化アルゴリズムの2次元ループの内側にさらに2次元ループをおいて、 再分割します。再分割の数は乱数で決定されます。
import processing.opengl.*; import igeo.*; size(480,360,IG.GL); IG.open("surface3.3dm"); ISurface[] surfs = IG.surfaces(); ISurface surf = surfs[0]; int unum = 20; int vnum = 40; double uinc = 1./unum; double vinc = 1./vnum; double gap = 0.15; for(int i=0; i < unum; i++){ for(int j=0; j < vnum; j++){ // random subdivision int udiv=IRandom.getInt(1,2); int vdiv=IRandom.getInt(1,4); double uinc2 = 1./udiv; double vinc2 = 1./vdiv; for(int k=0; k < udiv; k++){ for(int l=0; l < vdiv; l++){ IVec pt1 = surf.pt((i + k*uinc2)*uinc, (j + l*vinc2)*vinc); IVec pt2 = surf.pt((i+(k+1)*uinc2-gap )*uinc, (j + l*vinc2)*vinc); IVec pt3 = surf.pt((i+(k+1)*uinc2-gap)*uinc, (j+(l+1)*vinc2-gap)*vinc); IVec pt4 = surf.pt((i+k*uinc2)*uinc, (j+(l+1)*vinc2-gap)*vinc); // bottom points IVec bpt1 = pt1.dup(); IVec bpt2 = pt2.dup(); IVec bpt3 = pt3.dup(); IVec bpt4 = pt4.dup(); // move bottom points to xy-plane bpt1.z=0; bpt2.z=0; bpt3.z=0; bpt4.z=0; // lower the top randomly if(IRandom.percent(20)){ pt1.z -= 3; pt2.z -= 3; pt3.z -= 3; pt4.z -= 3; } // create a box randomly if(IRandom.percent(80)){ new IBox(pt1,pt2,pt3,pt4,bpt1,bpt2,bpt3,bpt4).clr(IRandom.gray()); } } } } } surf.del();