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

パネル化アルゴリズム例

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

この例では入力曲面上に、菱型の曲面パネルとパイプによってダイアグリッド構造(斜めの格子構造)を生成します。 このコードは斜め格子上の菱型パネル化を元にしています。 入力曲面には以下のファイルを用います。

surface10.3dm

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();
}

次に、菱型曲面の角にある制御点も法線方向に移動します。 角の点の移動量と中央の点の移動量は変数 centerDepthfrontDepthで指定されています。

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();
}

最後にパイプを生成してダイアグリッド構造を生成します。 また、変数centerDepthfrontDepthは 右の入力画像値で値が制御されることによって、菱型パネルの膨らみ具合と角の開き具合が 調整されます。


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();
}


(トピック一覧へ戻る)

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