3Dサンプル(sketch_3D_Z_Bolt_E)アイボルトスケッチ
 3Dサンプル(sketch_3D_Z_Bolt_E)アイボルトスケッチは以下となります。
//sketch_3D_Z_Bolt_E アイボルト
void setup()
{
  size(400, 400, P3D);
}
void draw()
{
  background(255, 255, 255);
  lights();
  ortho(-width/2, width/2, -height/2, height/2); // Same as ortho()
  translate(width / 2, height / 2);
  rotateY(map(mouseX, 0, width, -PI/1, PI/1));
  rotateX(map(mouseY, 0, height, PI/1, -PI/1));
  //noStroke();
  strokeWeight(0.1);
    
  fill(255, 255, 255);
  scale(2,2,2);
  Bolt_E(6.25 ,23.75 ,30 ,27 ,16 ,30);//アイボルト(M16)
  //Bolt_E(8 ,28 ,35 ,30 ,20 ,35);//アイボルト(M20)
}
void Bolt_E(float r,float R,float H,float L,float M,float D)//アイボルト
{
  Bolt_D(M/2,D/2,H-(R-r),L);//台形頭ボルト(アイボルト合成用)
  pushMatrix();
  rotateY(90*PI/180);
  translate(-H,0,0);
  Z_Ring(r,R);//リング
  popMatrix();
}
void Bolt_D(float r,float R,float H,float L)//台形頭ボルト(アイボルト合成用)
{
  int Sn=4;//面数
  int Pn=17;//ポイント数
  float[][] X=new float[Sn][Pn];
  float[][] Y=new float[Sn][Pn];
  float[] Z=new float[Sn];
  int i;
  float R0=R-H*tan(PI*(90-82)/180);
  
  Z[0]=H;
  Z[1]=0;
  Z[2]=0;
  Z[3]=-L;
  for(i=0;i<Pn;i++)
  {
    float angle = i*TWO_PI/(Pn-1);
    X[0][i]=R0*cos(angle);Y[0][i]=R0*sin(angle);
    X[1][i]=R*cos(angle);Y[1][i]=R*sin(angle);
    X[2][i]=r*cos(angle);Y[2][i]=r*sin(angle);
    X[3][i]=r*cos(angle);Y[3][i]=r*sin(angle);
  }
  pushMatrix();
  Z_Side_M(Sn,Pn,X,Y,Z);//多段側面
  translate(0,0,Z[0]);
  beginShape();
  Z_Polyon_P(Pn,X[0],Y[0]);//多角形反時計回り
  endShape(CLOSE);
  popMatrix();
  pushMatrix();
  translate(0,0,Z[3]);
  beginShape();
  Z_Polyon_P(Pn,X[3],Y[3]);//多角形反時計回り
  endShape(CLOSE);
  popMatrix();
}
void Z_Side_M(int Sn,int Pn,float X[][],float Y[][],float Z[])//多段側面
{
  int i,j;
  
  for(j=0;j<Sn-1;j++)
  {
    beginShape(QUAD_STRIP);
    for (i = 0; i < Pn; i++)
    {
      vertex(X[j][i],Y[j][i], Z[j]);
      vertex(X[j+1][i],Y[j+1][i], Z[j+1]);
    }
    endShape(CLOSE);
  }
}
void Z_Polyon_P(int Pn,float X[],float Y[])//多角形反時計回り
{
  int i;
  for (i = 0; i < Pn; i++)
  {
    vertex(X[i],Y[i]);
  }
}
void Z_Ring(float r,float R)//リング
{
  int sides=16;//分割数
  int SnR=32;//面数
  
  float[][] X=new float[SnR+1][sides+1];
  float[][] Y=new float[SnR+1][sides+1];
  float[][] Z=new float[SnR+1][sides+1];
  
  int i,j;
  for(j=0;j<=SnR;j++)
  {
    float Aj=j*2*PI/SnR;
    for(i=0;i<=sides;i++)
    {
      float Ai=i*2*PI/sides;
      X[j][i]=(R+r*cos(Ai))*cos(Aj);
      Y[j][i]=(R+r*cos(Ai))*sin(Aj);
      Z[j][i]=r*sin(Ai);
    }
  }
  
  for(j=0;j<SnR;j++)
  {
    beginShape(QUAD_STRIP);
    for (i = 0; i <= sides; ++i)
    {
      vertex(X[j][i],Y[j][i],Z[j][i]);
      vertex(X[j+1][i],Y[j+1][i],Z[j+1][i]);
    }
    endShape(CLOSE);
  }
}