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