25章:3Dサンプル(sketch_3D_Z_Bolt_E)アイボルト

    作成2015.12.09

     Processingの3D機能を利用して3D機械製図への応用を検討してみたいと思います。

  1. アイボルトの寸法図
     アイボルトの寸法図を以下に示します。



    *図25-1からわかるようにアイボルトの基本寸法はrとRとHとLとMとDの6個のパラメータで形状が決まります。 *rとRとHとLとMとDはfloat型でmm単位で入力とします。


  2. 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);
      }
    }
    


  3. 3Dサンプル(sketch_3D_Z_Bolt_E)アイボルトテキストファイル
     3Dサンプル(sketch_3D_Z_Bolt_E)アイボルトテキストファイルは以下から参照できます。
    「3Dサンプル(sketch_3D_Z_Bolt_E)アイボルトテキストファイル」にいく



  4. 3Dサンプル(sketch_3D_Z_Bolt_E)アイボルトスケッチの実行
    (1)3Dサンプル(sketch_3D_Z_Bolt_E)アイボルトを実行すると実行ウインドウに3D画像が表示されます。
    (2)マウスを動かすと表示角度が変化します。
    (3)表示画像例を以下に示します。





  5. 3Dサンプル(sketch_3D_Z_Bolt_E)アイボルトまとめ
    (1)表示は正投影のortho(-width/2, width/2, -height/2, height/2);としました。
    (2)線有りのstrokeWeight(0.1);としました。
    (3)Bolt_E(6.25 ,23.75 ,30 ,27 ,16 ,30);//アイボルト(M16)と指定すると指定寸法のアイボルトが表示できます。




26章:3Dサンプル(sketch_3D_Catalog_01)ケーブルグランドに行く。

トップページに戻る。