41章:3Dサンプル(sketch_3D_Bird_box) 巣箱

    作成2015.12.20

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

  1. 巣箱の寸法図
     巣箱の寸法図を以下に示します。



    *図41-1から巣箱の基本寸法はA、R、L0〜L6の9個のパラメータで形状が決まります。
    *パラメータは全てfloat型でmm単位で入力とします。


  2. 3Dサンプル(sketch_3D_Bird_box) 巣箱スケッチ
     3Dサンプル(sketch_3D_Bird_box) 巣箱スケッチは以下となります。
    //sketch_3D_Bird_box 巣箱
    Part P;//使用クラスの定義
    void setup()
    {
      size(600, 600, P3D);
      P=new Part();//My_OBクラスのオブジェクトを生成
    }
    
    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.5);
      scale(2,2,2);
    
      float[] L={13,150,180,180,90,130,150};
      translate(0,L[2]/2,0);
      P.Bird_Box(45*PI/180,20,L);
     
    }
    
    //部品
    class Part
    {
      void Bird_Box(float A,float R,float L[])
      {
        fill(206, 173,52);
        Part1(A,R,L);
        Part2(A,R,L);
        Part3(A,R,L);
        fill(0, 150, 0);
        Part4(A,R,L);
      }
      
      void Part4(float A,float R,float L[])
      {
        int Pn=7;//ポイント数
        float[] X=new float[Pn];
        float[] Y=new float[Pn];
        X[0]=0;Y[0]=-L[2];
        X[1]=-L[3]/2;Y[1]=Y[0]+L[3]*tan(A)/2;
        X[2]=X[1]+L[0]*sin(A);Y[2]=Y[1]+L[0]*cos(A);
        X[3]=0;Y[3]=Y[0]+L[0]/cos(A);
        X[4]=-X[2];Y[4]=Y[2];
        X[5]=-X[1];Y[5]=Y[1];
        X[6]=X[0];Y[6]=Y[0];
        pushMatrix();
        Z_Side(Pn,X,Y,L[6]);//側面
         translate(0,0,-L[6]/2);
        Z_Polyon(Pn,X,Y);//多角形
        translate(0,0,L[6]);
        Z_Polyon(Pn,X,Y);//多角形
        popMatrix();
        float LH=sqrt((X[1]-X[0])*(X[1]-X[0])+ (Y[1]-Y[0])*(Y[1]-Y[0]));
        println("Part4 W=\t" + (L[6]) + "\tH=\t" + nf(LH,0,1));
      }
      
      void Part3(float A,float R,float L[])
      {
        int Pn=5;//ポイント数
        float[] X=new float[Pn];
        float[] Y=new float[Pn];
        X[0]=L[1]/2;Y[0]=0;
        X[1]=X[0];Y[1]=-(L[2]-L[0]/cos(A)-L[1]*tan(A)/2);
        X[2]=L[1]/2-L[0];Y[2]=-(L[2]-L[0]/cos(A)-L[1]*tan(A)/2+L[0]*tan(A));
        X[3]=X[2];Y[3]=0;
        X[4]=X[0];Y[4]=Y[0];
        
        pushMatrix();
        Z_Side(Pn,X,Y,L[5]-2*L[0]);//側面
        rotateY(PI);
        Z_Side(Pn,X,Y,L[5]-2*L[0]);//側面
        popMatrix();
        println("Part3 W=\t" + (L[5]-2*L[0]) + "\tH=\t" + nf(abs(Y[2]),0,1));
      }
      
      void Part2(float A,float R,float L[])
      {
        pushMatrix();
        translate(0,-L[0]/2,0);
        box(L[1]-2*L[0],L[0],L[5]-2*L[0]);
        popMatrix();
        
        println("Part2 W=\t" + (L[1]-2*L[0]) + "\tH=\t" + nf((L[5]-2*L[0]),0,1));
      }
      
      void Part1(float A,float R,float L[])
      {
        int Pn=6;//ポイント数
        float[] X=new float[Pn];
        float[] Y=new float[Pn];
        X[0]=-L[1]/2;Y[0]=0;
        X[1]=X[0];Y[1]=-(L[2]-L[0]/cos(A)-L[1]*tan(A)/2);
        X[2]=0;Y[2]=-(L[2]-L[0]/cos(A));
        X[3]=-X[1];Y[3]=Y[1];
        X[4]=-X[0];Y[4]=Y[0];
        X[5]=X[0];Y[5]=Y[0];
        
        int i;
        int Pn2=17;//ポイント数
        float[] X2=new float[Pn2];
        float[] Y2=new float[Pn2];
        for(i=0;i<Pn2;i++)
        {
          float angle = i*TWO_PI/(Pn2-1);
          X2[i]=R*cos(angle);Y2[i]=R*sin(angle)-L[4];
        }
        
        pushMatrix();
        translate(0,0,-L[5]/2+L[0]/2);
        Z_Side(Pn,X,Y,L[0]);//側面
        translate(0,0,-L[0]/2);
        Z_Polyon(Pn,X,Y);//多角形
        translate(0,0,L[0]);
        Z_Polyon(Pn,X,Y);//多角形
        popMatrix();
        
        
        pushMatrix();
        translate(0,0,L[5]/2-L[0]/2);
        Z_Side(Pn,X,Y,L[0]);//側面
        Z_Side(Pn2,X2,Y2,L[0]);//側面
        translate(0,0,-L[0]/2);
        beginShape();
        Z_Polyon_P(Pn,X,Y);//多角形
        beginContour();
        Z_Polyon_M(Pn2,X2,Y2);//多角形
        endContour();
        endShape(CLOSE);
        translate(0,0,L[0]);
        beginShape();
        Z_Polyon_P(Pn,X,Y);//多角形
        beginContour();
        Z_Polyon_M(Pn2,X2,Y2);//多角形
        endContour();
        endShape(CLOSE);
        popMatrix();
        
         println("Part1 W=\t" + L[1] + "\tH=\t" + nf(abs(Y[2]),0,1));
      }
      
      void Z_Side(int Pn,float X[],float Y[],float L)//側面
      {
        int i;
        beginShape(QUAD_STRIP);
        for (i = 0; i < Pn; ++i)
        {
          vertex(X[i],Y[i], -L/2);
          vertex(X[i],Y[i], L/2);
        }
        endShape(CLOSE);
      }
      
      void Z_Polyon(int Pn,float X[],float Y[])//多角形
      {
        int i;
        beginShape();
        for (i = 0; i < Pn; ++i)
        {
          vertex(X[i],Y[i]);
        }
        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_Polyon_M(int Pn,float X[],float Y[])//多角形時計回り
      {
        int i;
        for (i = Pn-1; i >= 0; i--)
        {
          vertex(X[i],Y[i]);
        }
      }
    }
    


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



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



    (4)コンソールには基本パーツ素材寸法が表示されます。
    Part1 W= 150.0 H= 161.6
    Part2 W= 124.0 H= 104.0
    Part3 W= 104.0 H= 99.6
    Part4 W= 150.0 H= 127.3
    *上記数値から素材の必要量が推定できます。


  5. 3Dサンプル(sketch_3D_Bird_box) 巣箱まとめ
    (1)3Dサンプル(sketch_3D_Bird_box) 巣箱は子供向けの工作検討用です。
    (2)以下のコードで3D画像を生成します。
    float[] L={13,150,180,180,90,130,150};
    P.Bird_Box(45*PI/180,20,L);




42章:ライブラリー(ControlP5_Button)に行く。

トップページに戻る。