毛のはえたようなもの

インターネット的なものをつらつらとかきつらねる。

OpenGLで遊ぼう6 -まとめ!-

OpenGLで遊ぼう1〜5は試行錯誤エントリであり、間違いが含まれているところがあります。また長くなったため、今後使う人のために端的にまとめておきます。したがって前述のOpenGLで遊ぼう1〜5は特別見る必要がありません。

作成するもの

Blenderで製作した3Dモデルをもとに、OpenGLを使ってアニメーションを作るのが目的です。

具体例として今回はひよこがわそわそ動く動画を作ります。Flash版ひよこわそわそをイメージしています。

完成動画はこちら(画質悪くてごめんなさい)

Blenderモデリング

Blenderを導入して3Dモデリングを。使い方は以下を参照してください。
チュートリアル(本当に初めての方のために作成したBlenderチュートリアル) - WBS+(Web/Blender Studio+)

こんな感じに作りました。

製作したら「File→Export→Wavefront(.obj)」でモデルをエクスポートします。
エクスポート時はエディットモードをぬけて、すべてのオブジェクトを選択(aキー)しておく必要があります。もちろん選択したオブジェクトだけ出力することも出来るみたいです。
今回エクスポートしたものを「hiyoko.obj」とします

OpenGLを導入する

GLUTによる「手抜き」OpenGL入門
導入法、基本的なことは上記サイトをご覧ください。

サンプルコードでモデルを動かす

OpenGL FAQ 24. その他
上記サイトによるとGLUTに.objファイルを読み込み表示するデモが含まれているようです。
GLUTのサイト中「GLUT 3.7 Source Code Download for Win32」からZipファイルをいただいてきて、「progs/demos/smooth」内のソースコードを拝借します。
インクルードファイル・Makefileのパスなどを自分の環境にあわせて適宜修正します。Makefile等がWindows用になっているので、Linuxではそのまま使えません。Windowsの場合はVC++などで動かすことが出来るようです。

適当な場所にソースを置きmakeしたら早速表示させます。

$ make
$ ./a.out hiyoko.obj

すると、こんな感じになります。

色が変なのはモデルモードがあっていないからです。mキーを何度か押してみてください。正しい色表示やモノクロになったりすると思います。

Blenderで出力されるのはマテリアルモードの.objです。このモードをデフォルトにするにはサンプルコード「smooth.c」中のグローバル変数を設定している部分の一番最後のマテリアルモードを0から1に変更してください。

GLuint     material_mode = 0;  

    ↓

GLuint     material_mode = 1;

サンプルコードにはほかにもいろいろな機能があります。ワイヤー表示や3Dを回転する処理もマウスイベントも。結構面白いです。

OpenGLでアニメを作成する

↓のようにひよこを並べて左右に動かします。

ひよこ一つ分を動かすというアニメーションを繰り返すという手法をとりました。ひよこ1つ分動かすに対して30フレーム使うとします。

smooth.cにグローバル変数を追加

int     counter = 0;     // 現在のフレーム
int     maxcounter = 30; // フレーム数

smooth.c中のdisplay関数の「glPushMatrix();からglPopMatrix(); 」を以下に書き換えます

  for(i=0; i<10 ; i++){
      for(j=0; j< 16 ; j++){
          glPushMatrix();
          glTranslatef(pan_x, pan_y, 0.0);
          glTranslated(-9.7+j*1.2,-2+i*1.1,-2+-i*1.1);
          if(i%2){
              glTranslated((0.5+(double)counter/maxcounter)*1.2,0,0);
          }else{
              glTranslated(-(double)counter/maxcounter*1.2,0,0);
          }
          glRotated(-90, 0.0, 1.0, 0.0);

          tbMatrix();
          
          glEnable(GL_LIGHTING);
          glEnable(GL_COLOR_MATERIAL);
          glColor3f(0.5, 0.5, 0.5);
          glCallList(model_list);

          if (bounding_box) {
              glEnable(GL_BLEND);
              glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
              glEnable(GL_CULL_FACE);
              glColor4f(1.0, 0.0, 0.0, 0.25);
              glutSolidCube(2.0);
          }
          glPopMatrix();          

      }
  }

パラメータは見た目がいいところにあわせてあります。いわゆる適当というやつです。

そして最後に以下の関数を追加

void idle(int value) {
    if(counter < maxcounter - 1){
        counter++;
    }else{
        counter = 0;
    }
    glutPostRedisplay();
    glutTimerFunc(15,idle,0);
}

main関数中に上の関数を追加します。「glutMainLoop();」の前に追加しました。

glutTimerFunc(15,idle,0);

はじめはglutIdleFunc(idle);を使っていましたが,id:monaeから「これだとマシンパワーによってひよこわそわそが超高速描画されてしまう」とコメントもらいました.というわけで再描画を呼び出す最低の間隔を指定できる関数に変更!


これでひよこがわそわそするんだぜ!

ただし、このままではマウス操作が有効になっています。実用するためにはマウスイベントの関数を削除されるとよいと思います。
…ひよこわそわその実用ってなんだろう。

OpenGLアニメをMpeg化する

(当方はあまり動画に詳しくないため下記の方法が正しいとは限りません。あくまでも一例です。)

OpenGLで描画するたびにBMP保存→AVI変換→Mpeg変換」という方法をとりました。

描画のたびにBMP保存

再描画関数の前に画面をキャプチャし、BMP保存します。BMP保存のコードは以下から拝借しました。
sonson@Picture&Software | Make something.
連番保存しておくと楽です。

AVI変換

AVIMakerを使用しました。読み込んで保存。
AVIMakerの詳細情報 : Vector ソフトを探す!

Mpeg変換

TMPGEncを使用しました。
TMPGEnc Net

初ようつべ

Youtube初めてUPした!!!

はじめてがこれか!

まとめ

別に視点に変化がないので、2Dを3Dにしたからといって特に意味がないことに気がつきました!
ヾ(・∀・)ノシ あっははー


せっかくモデルを読み込めるようになったので、もうちょっと何か作りたいと思います。