40章:3Dサンプル(sketch_3D_Engin)エンジン

    作成2015.12.20

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

  1. 3Dサンプル(sketch_3D_Engin)エンジン完成図
     3Dサンプル(sketch_3D_Engin)エンジン完成図を以下に示します。






    *ピストン運動を繰り返します。


  2. 3Dサンプル(sketch_3D_Engin)エンジンスケッチ
     3Dサンプル(sketch_3D_Engin)エンジンスケッチは以下となります。
    //sketch_3D_Engin エンジン
    Part P;//使用クラスの定義
    int gCT=0;
    void setup()
    {
      size(600, 600, P3D);
      P=new Part();//My_OBクラスのオブジェクトを生成
    }
    
    void draw()
    {
      colorMode(HSB,100,100,100,100); 
      background(0,0,100);
      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);
      int N=64;//角度分割数
      float Ai=4*PI*gCT/N;
      float R=20;
      float L=85;
      float Aj=asin(R*sin(Ai)/L);
      float Yg=R*sin(Ai)/2;
      float Xg=R*cos(Ai)+L*cos(Aj)/2;
      float Xs=R*cos(Ai)+L*cos(Aj);
      gCT++;if(gCT>N){gCT=0;}
    
      scale(1.5,1.5,1.5);
      
      rotateX(-90*PI/180);
      
      pushMatrix();
      translate(0,0,-Xs);
      fill(60,100, 100,100);
      P.Part2();//ピストン
      popMatrix();
      
      pushMatrix();
      //translate(0,0,-62.5);
      
      fill(40,50, 100,100);
      translate(-Yg,0,-Xg);
      rotateY(-Aj);
      
      P.Part3();//リンク
      popMatrix();
      
      pushMatrix();
      fill(70,20, 70,100);
      rotateY(Ai);
      P.Part4();//クランク
      popMatrix();
      
      pushMatrix();
      fill(gCT/2,100,100,50);
      translate(0,0,-(145+30+Xs)/2);
      P.Z_Half_Circle(30,145-30-Xs);//燃焼ガス
      popMatrix();
      
      fill(50,80,40,70);
      P.Part1();//シリンダ 
    }
    
    //部品
    class Part
    {
      void Part4()//クランク
      {
        pushMatrix();
        rotateX(-90*PI/180);
        pushMatrix();
        translate(0,0,15);
        Z_Bar(30,10);
        translate(0,0,37.5);
        Z_Bar(5,65);
        popMatrix();
        translate(0,20,0);
        Z_Bar(5,20);
        popMatrix();
      }
      void Part3()//リンク
      {
        int Pn=9;//ポイント数
        float[] X={5,10,10,5,-5,-10,-10,-5,5,5.5};
        float[] Y={52.5,47.5,-47.5,-52.5,-52.5,-47.5,47.5,52.5,52.5};
        float L=10;
        pushMatrix();
        rotateX(90*PI/180);
        Z_Side(Pn,X,Y,L);//側面
        translate(0,0,-L/2);
        Z_Polyon(Pn,X,Y);//多角形
        translate(0,0,L);
        Z_Polyon(Pn,X,Y);//多角形
        popMatrix();
      }
      
      void Part2()//ピストン
      {
        pushMatrix();
        rotateX(90*PI/180);
        Z_Bar(5,60);
        popMatrix();
        pushMatrix();
        translate(0,0,5);
        Z_Half_Pipe(30,20,50);//Half_Pipe 半パイプ
        translate(0,0,-30);
        Z_Half_Circle(30,10);//Half_Circle 半円板
        popMatrix();
      }
      void Part1()//シリンダ
      {
        pushMatrix();
        translate(0,0,-2.5);
        Z_Half_Pipe(50,40,75);//Half_Pipe 半パイプ
        translate(0,0,-90);
        Z_Half_Pipe(40,30,125);//Half_Pipe 半パイプ
        translate(0,0,-57.5);
        Z_Half_Circle(40,10);//Half_Circle 半円板
        popMatrix();
        pushMatrix();
        //void Z_Pipe(float Ro,float Ri,float L)//パイプ
        rotateX(90*PI/180);
        translate(0,0,-40);
        Z_Pipe(15,5,40);
        popMatrix();
        
      }
      
      void Z_Half_Pipe(float R1,float R2,float L)//Half_Pipe 半パイプ
      {
        int Pn1=8;//R1,R2分割数
        int Pn=2*Pn1+3;//全ポイント数
        float[] X=new float[Pn];
        float[] Y=new float[Pn];
        
        int i;
        float Ai;
        for(i=0;i<=Pn1;i++)
        {
          Ai=i*PI/Pn1;
          X[i]=R1*cos(Ai);
          Y[i]=R1*sin(Ai);
        }
        for(i=0;i<=Pn1;i++)
        {
          Ai=PI-i*PI/Pn1;
          X[i+Pn1+1]=R2*cos(Ai);
          Y[i+Pn1+1]=R2*sin(Ai);
        }
        X[2*Pn1+2]=R1;Y[2*Pn1+2]=0;
      
        pushMatrix();
        Z_Side(Pn,X,Y,L);//側面
        translate(0,0,-L/2);
        Z_Polyon(Pn,X,Y);//多角形
        translate(0,0,L);
        Z_Polyon(Pn,X,Y);//多角形
        popMatrix();
      }
      
      void Z_Half_Circle(float R1,float L)//Half_Circle 半円板
      {
        int Pn1=8;//R1分割数
        int Pn=Pn1+2;//全ポイント数
        float[] X=new float[Pn];
        float[] Y=new float[Pn];
        
        int i;
        float Ai;
        for(i=0;i<=Pn1;i++)
        {
          Ai=i*PI/Pn1;
          X[i]=R1*cos(Ai);
          Y[i]=R1*sin(Ai);
        }
        X[Pn1+1]=R1;Y[Pn1+1]=0;
      
        pushMatrix();
        Z_Side(Pn,X,Y,L);//側面
        translate(0,0,-L/2);
        Z_Polyon(Pn,X,Y);//多角形
        translate(0,0,L);
        Z_Polyon(Pn,X,Y);//多角形
        popMatrix();
      }
      
      void Z_Bar(float R1,float L)//Bar 丸棒
      {
        int Pn1=16;//R1分割数
        int Pn=Pn1+2;//全ポイント数
        float[] X=new float[Pn];
        float[] Y=new float[Pn];
        
        int i;
        float Ai;
        for(i=0;i<=Pn1;i++)
        {
          Ai=i*2*PI/Pn1;
          X[i]=R1*cos(Ai);
          Y[i]=R1*sin(Ai);
        }
        X[Pn1+1]=R1;Y[Pn1+1]=0;
      
        pushMatrix();
        Z_Side(Pn,X,Y,L);//側面
        translate(0,0,-L/2);
        Z_Polyon(Pn,X,Y);//多角形
        translate(0,0,L);
        Z_Polyon(Pn,X,Y);//多角形
        popMatrix();
      }
      
      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_Pipe(float Ro,float Ri,float L)//パイプ
      {
        pushMatrix();
        Z_Cylinder(Ro,L);
        Z_Cylinder(Ri,L);
        translate(0,0,-L/2);
        Z_Ring_2D(Ro,Ri);
        translate(0,0,L);
        Z_Ring_2D(Ro,Ri);
        popMatrix();
      }
      
      void Z_Cylinder(float r,float L)//円筒
      {
        int sides=16;//分割数
        int i;
        beginShape(QUAD_STRIP);
        for (i = 0; i < sides + 1; ++i)
        {
          float angle = i*TWO_PI/sides;
          vertex(r*cos(angle), r*sin(angle), -L/2);
          vertex(r*cos(angle), r*sin(angle), L/2);
        }
        endShape(CLOSE);
      }
      
      void Z_Ring_2D(float Ro,float Ri)
      {
        int sides=16;//分割数
        int i;
        beginShape();
        for (i = 0; i < sides + 1; ++i)
        {
          float angle = i*TWO_PI/sides;
          vertex(Ro*cos(angle), Ro*sin(angle),0);
        }
        beginContour();
        for (i = 0; i < sides + 1; ++i)
        {
          float angle = -i*TWO_PI/sides;
          vertex(Ri*cos(angle), Ri*sin(angle),0);
        }
        endContour();
        endShape(CLOSE);
      }
    }
    


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





  4. 3Dサンプル(sketch_3D_Engin)エンジンまとめ
    (1)class Partで部品形状を定義しています。
    (2)void draw()で画像を表示します。
    (3)以下の計算式で部品の位置と角度を計算しています。
    int N=64;//角度分割数
    float Ai=4*PI*gCT/N;//クランクの回転角度
    float R=20;//クランクの回転半径
    float L=85;//リンクの回転軸間隔
    float Aj=asin(R*sin(Ai)/L);//リンクの回転角
    float Yg=R*sin(Ai)/2;//ンクの重心位置Y
    float Xg=R*cos(Ai)+L*cos(Aj)/2;//ンクの重心位置X
    float Xs=R*cos(Ai)+L*cos(Aj);//ピストンの位置
    gCT++;if(gCT>N){gCT=0;}//クランクの回転角度変化用カウンタ
    (4)各部品の動きを3D画像の変化で確認できます。




41章:3Dサンプル(sketch_3D_Bird_box) 巣箱に行く。

トップページに戻る。