モデル変換
■ 課題
今回の課題は以下の通り。
  • 立方体を描いてください。この際、"depth-buffer" とは何かについて質問します。

  • 立方体を拡大縮小し、直方体を作ってみる。

  • 直方体を任意の軸で回転させ、傾けてみる。

  • 直方体を連結し、「指」を作ってみる。逆関節などは考慮しなくて良いが、関節は全部で3つ(以上)準備すること。参考の通り、指を描く部分は関数にしておくと便利です。

  • 上を発展させ、立方体を組み合わせて「手」を作れ。手の平から出る、親指、人差指、中指、薬指、小指それぞれが関節として機能する事を示すように。なお、この課題ができれば、上4つの項目は全て満たされる。

  • ■ 参考とヒント
    まずは、テンプレートを利用して下さい。
  • glRotate*() glTranslate*() glScale*() 関数を調べ、また、それらをプログラムの中で使う順番を変えて、変化を理解するとよいでしょう。

  • glPushMatrix(); glPopMatrix(); 関数を調べ、説明できるようにしておいてください。

  • 立方体を描く関数を別に準備すると良いでしょう。 参考までに、分かりやすいように、x, y, z 共に -1.0 または 0.0 を最小値、1.0 を最大値に使うと後々楽になります。

  • 引数を渡して、任意の指1本を描く関数を準備すると良いでしょう。

  • 最終的に、上の関数を用いて、手を描くと楽になります。
  • ■ Tips
    それでは一つの例として、下記のプログラムを示します。ファイル別にコンパイルして置いておくことで、後々に再利用できるコードを生成することができ、大変便利です。
    /* Filename: cube.c */
    
    #include <GL/gl.h>
    #include "cube.h"
    
    void
    putCube( void )
    {
      /* ここに立方体を描くコードを記述 */
    }
    
    
     
    /* Filename: cube.h */
    
    #ifndef _CUBE_H
    #define _CUBE_H
    
    void putCube( void );
    
    #endif
    

    また、指を表示するプログラムは、この立方体を描くコードを利用して下記のようにできるでしょう。
    /* Filename: finger.c */
    
    #include <GL/gl.h>
    #include "cube.h" /* ここで立方体のヘッダファイルを参照 */
    #include "finger.h"
    
    void
    putFinger( const float length, const float *rotation, const int howmany )
    {
      /* ここに指を描くコードを記述 例えば… */
    
      putCube(); /* 立方体の描画 */
    
      /* もちろんこのままでは箱しか描画されません。 */
    }
    
    
     
    /* Filename: finger.h */
    
    #ifndef _FINGER_H
    #define _FINGER_H
    
    void putFinger( const flost, const float *, const int );
    
    #endif
    

    Makefile の SRCSに、全ての *.c を書いておいて,今まで通りにコンパイルします。
    今回のテンプレートにはその Makefile が入っていますので、実行ファイルを生成したい場合は、下記のコマンドを実行するだけで全ての処理が自動で行われます。

    % make

    もしも、ソースファイルを書き換えたのに実行結果が変わってないような気がする時は

    % make clean

    のあとで、もう一回 "make" してみてください。これを試してもやっぱり変わってなかった場合は 単なる気のせいです。

    Sample Hand
    全てがうまく行った人はジャンケンゲームでも作ってて下さい…。

    [ 戻る ]

    Written by Yasuhiro Yamazaki, 2001.