11章:3Dサンプル(sketch_3D_Yacht)ヨット

    作成2015.12.04

     Processingの3D機能を利用して3Dサンプル(sketch_3D_Yacht)を作成してみました。

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


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



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





  4. 3Dサンプル(sketch_3D_Yacht)まとめ
    (1)Processingの3D機能を利用して3Dサンプル(sketch_3D_Yacht)を作成しました。
    (2)複雑な形状を一気に作成するのは難しいのでパーツに分解して作成し、合成しました。
    (3)特殊なライブラリーを使用することなく、Processingの3D機能のみでうまく製作できました。




12章:3Dサンプル(sketch_3D_U_Bolt)Uボルトに行く。

トップページに戻る。