チュートリアル | (トピック一覧へ戻る) |
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); //IG.open("surface1.3dm"); //input geometry from 3dm file IG.open("surface1.obj"); ///input geometry from OBJ file ISurface[] surfs = IG.surfaces(); for( ISurface surf : surfs ){ int unum = 8, vnum = 8; double uinc = 1.0/unum, vinc = 1.0/vnum; for(int i=0; i < unum; i++){ for(int j=0; j < vnum; j++){ IVec pt11 = surf.pt( i*uinc, j*vinc ); IVec pt21 = surf.pt( (i+1)*uinc, j*vinc ); IVec pt12 = surf.pt( i*uinc, (j+1)*vinc ); IVec pt22 = surf.pt( (i+1)*uinc, (j+1)*vinc ); new ISurface(pt11, pt21, pt22, pt12).clr(i*uinc,j*vinc,0); } } surf.del(); }
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); //IG.open("surface1.3dm"); //input geometry from 3dm file IG.open("surface1.obj"); ///input geometry from OBJ file ISurface[] surfs = IG.surfaces(); for( ISurface surf : surfs ){ int unum = 8, vnum = 8; double uinc = 1.0/unum, vinc = 1.0/vnum; for(int i=0; i < unum; i++){ for(int j=0; j < vnum; j++){ IVec pt11 = surf.pt( i*uinc, j*vinc ); IVec pt21 = surf.pt( (i+1)*uinc, j*vinc ); IVec pt12 = surf.pt( i*uinc, (j+1)*vinc ); IVec pt22 = surf.pt( (i+1)*uinc, (j+1)*vinc ); new ISurface(pt11, pt21, pt22).clr(i*uinc,0,j*vinc); new ISurface(pt22, pt12, pt11).clr(1-i*uinc); } } surf.del(); }
3つの点の選択方法を変えることで、斜めの辺の向きを逆にすることができます。
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); //IG.open("surface1.3dm"); //input geometry from 3dm file IG.open("surface1.obj"); ///input geometry from OBJ file ISurface[] surfs = IG.surfaces(); for( ISurface surf : surfs ){ int unum = 8, vnum = 8; double uinc = 1.0/unum, vinc = 1.0/vnum; for(int i=0; i < unum; i++){ for(int j=0; j < vnum; j++){ IVec pt11 = surf.pt( i*uinc, j*vinc ); IVec pt21 = surf.pt( (i+1)*uinc, j*vinc ); IVec pt12 = surf.pt( i*uinc, (j+1)*vinc ); IVec pt22 = surf.pt( (i+1)*uinc, (j+1)*vinc ); new ISurface(pt11, pt21, pt12).clr(0,i*uinc,j*vinc); new ISurface(pt12, pt21, pt22).clr(1-i*uinc); } } surf.del(); }
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); //IG.open("surface1.3dm"); //input geometry from 3dm file IG.open("surface1.obj"); ///input geometry from OBJ file ISurface[] surfs = IG.surfaces(); for( ISurface surf : surfs ){ int unum = 8, vnum = 8; 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*uinc, j*vinc ); IVec pt2 = surf.pt( (i+1)*uinc, (j-1)*vinc ); IVec pt3 = surf.pt( (i+1)*uinc, (j+1)*vinc ); new ISurface(pt1, pt2, pt3).clr(0,i*uinc,j*vinc); } else{ IVec pt1 = surf.pt( (i+1)*uinc, j*vinc ); IVec pt2 = surf.pt( i*uinc, (j+1)*vinc ); IVec pt3 = surf.pt( i*uinc, (j-1)*vinc ); new ISurface(pt1, pt2, pt3).clr(1-i*uinc); } } } surf.del(); }
上記の方法では、横端のパネルの縁がもとの曲面に合わずにギザギザしてしまいます。 縁を合わせたい場合は、半分の三角形を端の位置にだけ生成します。 その場合、端の位置を判定するのにIF条件分岐を用います。
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); //IG.open("surface1.3dm"); //input geometry from 3dm file IG.open("surface1.obj"); ///input geometry from OBJ file ISurface[] surfs = IG.surfaces(); for( ISurface surf : surfs ){ int unum = 8, vnum = 8; double uinc = 1.0/unum, vinc = 1.0/vnum; IVec pt1, pt2, pt3; for(int i=0; i < unum; i++){ for(int j=0; j < vnum; j++){ if( (i+j)%2 == 0 ){ pt1 = surf.pt( i*uinc, j*vinc ); if( j > 0 ){ pt2 = surf.pt( (i+1)*uinc, (j-1)*vinc ); } else{ pt2 = surf.pt( (i+1)*uinc, j*vinc ); } if( j < vnum-1 ){ pt3 = surf.pt( (i+1)*uinc, (j+1)*vinc ); } else{ pt3 = surf.pt( (i+1)*uinc, j*vinc ); } new ISurface(pt1, pt2, pt3).clr(1,i*uinc,j*vinc); } else{ pt1 = surf.pt( (i+1)*uinc, j*vinc ); if( j < vnum-1 ){ pt2 = surf.pt( i*uinc, (j+1)*vinc ); } else{ pt2 = surf.pt( i*uinc, j*vinc ); } if( j > 0 ){ pt3 = surf.pt( i*uinc, (j-1)*vinc ); } else{ pt3 = surf.pt( i*uinc, j*vinc ); } new ISurface(pt1, pt2, pt3).clr(1-i*uinc); } } } surf.del(); }
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); //IG.open("surface1.3dm"); //input geometry from 3dm file IG.open("surface1.obj"); ///input geometry from OBJ file ISurface[] surfs = IG.surfaces(); for( ISurface surf : surfs ){ int unum = 10, vnum = 10; 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(.5,i*uinc,j*vinc); } } } surf.del(); }
また角や縁がギザギザしてしまうのを避けたい場合は、 If条件分岐を用いて、 角や縁の位置で菱型を半分や四分の一にした三角形を配置します。
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); //IG.open("surface1.3dm"); //input geometry from 3dm file IG.open("surface1.obj"); ///input geometry from OBJ file ISurface[] surfs = IG.surfaces(); for( ISurface surf : surfs ){ int unum = 10, vnum = 10; double uinc = 1.0/unum, vinc = 1.0/vnum; IVec pt1, pt2, pt3, pt4; for(int i=0; i <= unum; i++){ for(int j=0; j < vnum; j++){ if( (i+j)%2 == 0 ){ if(i > 0){ pt1 = surf.pt( (i-1)*uinc, j*vinc ); } else{ pt1 = surf.pt( i*uinc, j*vinc ); } if(i < unum){ pt3 = surf.pt( (i+1)*uinc, j*vinc ); } else{ pt3 = surf.pt( i*uinc, j*vinc ); } if(j > 0){ pt2 = surf.pt( i*uinc, (j-1)*vinc ); } else{ pt2 = surf.pt( i*uinc, j*vinc ); } if(j< vnum-1){ pt4 = surf.pt( i*uinc, (j+1)*vinc ); } else{ pt4 = surf.pt( i*uinc, j*vinc ); } new ISurface(pt1, pt2, pt3, pt4).clr(i*uinc,j*vinc,.5); } } } surf.del(); }