3Dサンプル(sketch_3D_sabani)スケッチ
3Dサンプル(sketch_3D_sabani)スケッチは以下となります。
//sketch_3D_Yacht
void setup()
{
size(640, 560, P3D);
}
void draw()
{
background(0, 256, 256);
lights();
translate(width / 2, height / 2);
rotateY(map(mouseX, 0, width, -PI/1, PI/1));
rotateX(map(mouseY, 0, height, PI/1, -PI/1));
noStroke();
fill(240, 240, 230);
translate(0,50,50);
scale(2, 2, 2);
Sabani();//サバニ船型
OB_Y1();//Y軸回転体(ポール)
OB_H1();//メインセール
OB_H2();//ジブセール
OB_H3();//舵
OB_Z1();//バラスト
}
void OB_Z1()//バラスト
{
int sides=16;//分割数
int Sn=6;//面数
float Pz[]={-29.8,-29.8,-13.3,13.3,29.8,29.8};//z座標
float R[]={0.1,1.4,4.2,4.2,1.4,0.1};//回転物半径
int i,j;
float angleIncrement = TWO_PI/sides;
pushMatrix();
translate(0, 44,-65);
for(j=0;j< Sn-1;j++)
{
float angle = 0;
beginShape(QUAD_STRIP);
for (i = 0; i < sides + 1; ++i)
{
vertex(R[j]*cos(angle), R[j]*sin(angle), Pz[j]);
vertex(R[j+1]*cos(angle), R[j+1]*sin(angle), Pz[j+1]);
angle += angleIncrement;
}
endShape(CLOSE);
}
beginShape();
vertex(0,0,-10);vertex(0,0,10);vertex(0,-22,10);vertex(0,-22,-10);
endShape(CLOSE);
popMatrix();
}
void OB_H3()//舵
{
//pushMatrix();
beginShape();
vertex(0,0,-133);vertex(0,22.7,-133);vertex(0,22.7,-142.2);vertex(0,17,-142.2);vertex(0,0,-138);
endShape(CLOSE);
//popMatrix();
}
void OB_H2()//ジブセール
{
//pushMatrix();
beginShape();
vertex(0,-6.7,-3.7);vertex(-21.6,-6.7,-55);vertex(0,-99.9,-55);
endShape(CLOSE);
//popMatrix();
}
void OB_H1()//メインセール
{
int sides=8;//分割数
int Sn=3;//面数
float Pz[]={0,-65,-65};//z座標
float R[]={0.7,0.7,0.1};//回転物半径
int i,j;
float angleIncrement = TWO_PI/sides;
pushMatrix();
translate(0, -11.6,-55);
rotateY(-27*PI/180);
for(j=0;j< Sn-1;j++)
{
float angle = 0;
beginShape(QUAD_STRIP);
for (i = 0; i < sides + 1; ++i)
{
vertex(R[j]*cos(angle), R[j]*sin(angle), Pz[j]);
vertex(R[j+1]*cos(angle), R[j+1]*sin(angle), Pz[j+1]);
angle += angleIncrement;
}
endShape(CLOSE);
}
beginShape();
vertex(0,0,0);vertex(0,0,-63.1);vertex(0,-88.6,0);
endShape(CLOSE);
popMatrix();
}
void OB_Y1()//Y軸回転体(ポール)
{
int sides=8;//分割数
int Sn=3;//面数
float Py[]={0,-102,-102};//z座標
float R[]={1.1,1.1,0.1};//回転物半径
int i,j;
float angleIncrement = TWO_PI/sides;
pushMatrix();
translate(0,0,-55);
for(j=0;j< Sn-1;j++)
{
float angle = 0;
beginShape(QUAD_STRIP);
for (i = 0; i < sides + 1; ++i)
{
vertex(R[j]*cos(angle),Py[j],R[j]*sin(angle));
vertex(R[j+1]*cos(angle),Py[j+1],R[j+1]*sin(angle));
angle += angleIncrement;
}
endShape(CLOSE);
}
popMatrix();
}
void Sabani()//サバニ船型
{
int sides=5;//分割数
int Sn=28;//面数
int Nz=26;//Z分割数
float Pz=5.1;//Zピッチ
float Tan20=tan(20*PI/180);
float Kx[]={0.0201681,0.8286317,-0.0081566,0.0000220};
float Ky[]={16.307692,0.225165,-0.001703};
float[][] X=new float[5][Sn];
float[][] Y=new float[5][Sn];
float[] Z=new float[Sn];
float Zj;
int i,j;
for(i=0;i< 5;i++){X[i][0]=0;Y[i][0]=0;Z[0]=0;}
for(j=1;j< Sn;j++)
{
Zj=Pz*j;Z[j]=-Zj;
X[0][j]=abs(Kx[0]+Kx[1]*Zj+Kx[2]*Zj*Zj+Kx[3]*Zj*Zj*Zj);
Y[0][j]=0;
X[1][j]=-X[0][j];
Y[1][j]=0;
X[2][j]=X[1][j];
if(j==1){X[2][j]=0;}
Y[2][j]=abs(Ky[0]+Ky[1]*Zj+Ky[2]*Zj*Zj)-X[0][j]*Tan20;
X[3][j]=0;
Y[3][j]=abs(Ky[0]+Ky[1]*Zj+Ky[2]*Zj*Zj);
X[4][j]=-X[2][j];
Y[4][j]=Y[2][j];
Z[Sn-1]=Z[Sn-2];
}
Z[Sn-1]=Z[Sn-2];X[0][Sn-1]=0;Y[0][Sn-1]=0;X[1][Sn-1]=0;Y[1][Sn-1]=0;
X[2][Sn-1]=0;Y[2][Sn-1]=0;X[3][Sn-1]=0;Y[3][Sn-1]=0;X[4][Sn-1]=0;Y[4][Sn-1]=0;
pushMatrix();
for(j=0;j< Sn-1;j++)
{
beginShape(QUAD_STRIP);
for (i = 0; i < 5; ++i)
{
vertex(X[i][j],Y[i][j], Z[j]);
vertex(X[i][j+1], Y[i][j+1], Z[j+1]);
}
vertex(X[0][j],Y[0][j], Z[j]);
vertex(X[0][j+1], Y[0][j+1],Z[j+1]);
endShape(CLOSE);
}
popMatrix();
}