チュートリアル | (トピック一覧へ戻る) |
パネル化アルゴリズム例その9![]()
![]()
![]()
![]()
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();
}
HOME
FOR PROCESSING
DOWNLOAD
DOCUMENTS
TUTORIALS (Java /
Python)
GALLERY
SOURCE CODE(GitHub)
PRIVACY POLICY
ABOUT/CONTACT