HOME > natural science Laboratory > コンピュータ・シミュレーション講座 > OpenGL入門

【OpenGL入門】
直方体を回転させよう!

文責:遠藤 理平 (2011年3月13日) カテゴリ:OpenGL入門(27)

コンピュータシミュレーション講座では、 コンピュータ上での物理シミュレーションが目的ですが、 その手前としてOpenGLを用いた描画の練習を沢山行います。 本稿では、直方体を自由に描画するための練習を行ないます。

直方体を回転させよう!

直方体を描画する際の自由度は、

各辺の長さ(3つ)、
重心の位置(3つ)、 回転軸ベクトル(3つ)、
回転角度(1つ)

です。OpenGLで描画する際にはそれに色を指定します。
座標軸は上がz座標, 右がx座標、奥がy座標の右手系です。

回転軸ベクトル=(0,0,1)

回転軸ベクトル=(1,0,0)

回転軸ベクトル=(0,1,0)

回転軸ベクトル=(1,0,1)

回転軸ベクトル=(1,1,0)

回転軸ベクトル=(0,1,1)

回転軸ベクトル=(1,1,1)

OpenGLのプログラム

直方体描画関数のプロトタイプ

直方体を描画する際に、回転なしと回転ありとの2つの関数をオーバーロードで表現しています。

 
drowCuboid(double a, double b, double c,     // x軸方向の幅, y軸方向の幅, z軸方向の幅,
           double x, double y, double z,     // 中心のx座標, 中心のy座標, 中心のz座標, 
           MaterialStruct color);            // 色
drowCuboid(double a, double b, double c,     // x軸方向の幅, y軸方向の幅, z軸方向の幅,
           double x, double y, double z,     // 中心のx座標, 中心のy座標, 中心のz座標, 
           MaterialStruct color,             // 色,
           double theta,                     // 回転角度, 
           double nx, double ny, double nz); // 回転軸x座標, 回転軸y座標, 回転軸z標

直方体描画関数

 
/////////////////////////////////////////////
// 直方体の描画
void drowCuboid(double a, double b, double c, 
                double x, double y, double z, 
                MaterialStruct color){
  GLdouble vertex[][3] = {
      { -a/2.0, -b/2.0, -c/2.0 },
      {  a/2.0, -b/2.0, -c/2.0 },
      {  a/2.0,  b/2.0, -c/2.0 },
      { -a/2.0,  b/2.0, -c/2.0 },
      { -a/2.0, -b/2.0,  c/2.0 },
      {  a/2.0, -b/2.0,  c/2.0 },
      {  a/2.0,  b/2.0,  c/2.0 },
      { -a/2.0,  b/2.0,  c/2.0 }
    };
  int face[][4] = {//面の定義
      { 3, 2, 1, 0 },
      { 1, 2, 6, 5 },
      { 4, 5, 6, 7 },
      { 0, 4, 7, 3 },
      { 0, 1, 5, 4 },
      { 2, 3, 7, 6 }
    };
  GLdouble normal[][3] = {//面の法線ベクトル
    { 0.0, 0.0, -1.0 },
    { 1.0, 0.0, 0.0 },
    { 0.0, 0.0, 1.0 },
    {-1.0, 0.0, 0.0 },
    { 0.0,-1.0, 0.0 },
    { 0.0, 1.0, 0.0 }
  };
    glPushMatrix();
      glMaterialfv(GL_FRONT, GL_AMBIENT, color.ambient);
      glMaterialfv(GL_FRONT, GL_DIFFUSE, color.diffuse);
      glMaterialfv(GL_FRONT, GL_SPECULAR, color.specular);
      glMaterialfv(GL_FRONT, GL_SHININESS, &color.shininess);
      glTranslated( x, y, z);//平行移動値の設定
      glBegin(GL_QUADS);
      for (int j = 0; j < 6; ++j) {
        glNormal3dv(normal[j]); //法線ベクトルの指定
        for (int i = 0; i < 4; ++i) {
          glVertex3dv(vertex[face[j][i]]);
        }
      }
      glEnd();
    glPopMatrix();
}
//回転を考慮した立方体の描画
void drowCuboid(double a, double b, double c, 
                double x, double y, double z, 
                MaterialStruct color, 
                double theta, 
                double nx, double ny, double nz){
  double nn =sqrt(pow(nx,2)+pow(ny,2)+pow(nz,2));
  if(nn>0.0){
    nx = nx/nn;
    ny = ny/nn;
    nz = nz/nn;
  }
  glPushMatrix();
    glTranslated( x, y, z);//平行移動値の設定
    glPushMatrix();
      if(theta!=0 && nn>0.0) glRotated( theta , nx , ny, nz);
      drowCuboid(a, b, c, 0, 0, 0, color);
    glPopMatrix();
  glPopMatrix();
}

上記プログラムの例

 
  th++; //角度を描画ごとに1づつ増加させる
  drowCuboid(20.0, 10.0, 20.0, //x軸方向の幅, y軸方向の幅, z軸方向の幅,
             0.0, 0.0, 20.0,   //中心のx座標, 中心のy座標, 中心のz座標,
             ms_ruby,          //色,
             th,               //回転角度,
             0.0, 0.0, 1.0);   //回転軸x座標, 回転軸y座標, 回転軸z標
}


タグ: ,

▲このページのトップNPO法人 natural science トップ

コメント(1)

ailaiti (2012年8月 3日 16:58)

わたしは外国人です、シミュレーション好きです、勉強をできますかな?

▲このページのトップNPO法人 natural science トップ

関連記事

OpenGL入門







▲このページのトップNPO法人 natural science トップ




Warning: mysqli_connect(): (28000/1045): Access denied for user 'xsvx1015071_ri'@'sv102.xserver.jp' (using password: YES) in /home/xsvx1015071/include/natural-science/include_counter-d.php on line 8
MySQL DBとの接続に失敗しました