チュートリアル | (トピック一覧へ戻る) |
パネル化アルゴリズム例その6![]()
![]()
![]()
![]()
import processing.opengl.*;
import igeo.*;
size(480, 360, IG.GL);
IG.open("surface8.3dm");
ISurface[] surfaces = IG.surfaces();
int unum = 10, vnum = 30;
double uinc = 1.0/unum, vinc = 1.0/vnum;
for (ISurface surf : surfaces) {
for (int i=0; i < unum; i++) {
IVec[] pts = new IVec[vnum+1];
for (int j=0; j <= vnum; j++) {
if (j%2==0) {
pts[j] = surf.pt(i*uinc, j*vinc);
}
else {
pts[j] = surf.pt((i+1)*uinc, j*vinc);
}
}
new ICurve(pts).clr(0);
}
surf.del();
}
次のコードでは波状に上下する制御点の振れ幅が右の画像のグレー値によって調整されます。
NURBS曲線の次数も2に変更され、滑らかな曲線となるようにします。
![]()
![]()
![]()
![]()
import processing.opengl.*;
import igeo.*;
size(480, 360, IG.GL);
IG.open("surface8.3dm");
ISurface[] surfaces = IG.surfaces();
int unum = 20, vnum = 60;
double uinc = 1.0/unum, vinc = 1.0/vnum;
IImageMap map = new IImageMap("map3.jpg");
for (ISurface surf : surfaces) {
for (int i=0; i < unum; i++) {
IVec[] pts = new IVec[vnum+1];
for (int j=0; j <= vnum; j++) {
if (j%2==0) {
pts[j] = surf.pt(i*uinc, j*vinc);
}
else {
// bitmap value is sampled. note that u and v is swapped to match with u-v of the input surface.
double val = map.get( j*vinc, i*uinc );
pts[j] = surf.pt((i+val)*uinc, j*vinc);
}
}
new ICurve(pts, 2).clr(0);
}
surf.del();
}
次に、曲線がY軸方向に押し出され、曲面が生成されます。
![]()
![]()
![]()
![]()
import processing.opengl.*;
import igeo.*;
size(480, 360, IG.GL);
IG.open("surface8.3dm");
ISurface[] surfaces = IG.surfaces();
int unum = 20, vnum = 60;
double uinc = 1.0/unum, vinc = 1.0/vnum;
IImageMap map = new IImageMap("map3.jpg");
for (ISurface surf : surfaces) {
for (int i=0; i < unum; i++) {
IVec[] pts = new IVec[vnum+1];
for (int j=0; j <= vnum; j++) {
if (j%2==0) {
pts[j] = surf.pt(i*uinc, j*vinc);
}
else {
// bitmap value is sampled. note that u and v is swapped to match with u-v of the input surface.
double val = map.get( j*vinc, i*uinc );
pts[j] = surf.pt((i+val)*uinc, j*vinc);
}
}
ICurve crv = new ICurve(pts, 2).clr(0);
IVec extrudeDir = new IVec(0, -2, 0);
IG.extrude(crv, extrudeDir).clr(0,0,i*uinc,0.5);
}
surf.del();
}
最後に、押し出す幅が乱数でランダム化され、押し出した縁に沿った曲線を用いて パイプ曲面を生成します。
![]()
![]()
![]()
![]()
import processing.opengl.*;
import igeo.*;
size(480, 360, IG.GL);
IG.open("surface8.3dm");
ISurface[] surfaces = IG.surfaces();
int unum = 20, vnum = 60;
double uinc = 1.0/unum, vinc = 1.0/vnum;
IImageMap map = new IImageMap("map3.jpg");
for (ISurface surf : surfaces) {
for (int i=0; i < unum; i++) {
IVec[] pts = new IVec[vnum+1];
for (int j=0; j <= vnum; j++) {
if (j%2==0) {
pts[j] = surf.pt(i*uinc, j*vinc);
}
else {
// bitmap value is sampled. note that u and v is swapped to match with u-v of the input surface.
double val = map.get( j*vinc, i*uinc );
pts[j] = surf.pt((i+val)*uinc, j*vinc);
}
}
ICurve crv = new ICurve(pts, 2).clr(0);
IVec extrudeDir = new IVec(0, IRandom.get(-3, -1), 0);
IG.extrude(crv, extrudeDir).clr(0,0,i*uinc,0.5);
ICurve crv2 = crv.cp(extrudeDir);
IG.pipe(crv2, 0.1).clr(0.2);
}
surf.del();
}
HOME
FOR PROCESSING
DOWNLOAD
DOCUMENTS
TUTORIALS (Java /
Python)
GALLERY
SOURCE CODE(GitHub)
PRIVACY POLICY
ABOUT/CONTACT