第三週 グラフィックス幾何操作の完成と表示
  
  計算機序論2, 
  www.kameda-lab.org 
  2004/10/17(ver.B)
  
  
  実習にあたって
  
  
  3次元の立体を操作するには、 3次元の座標変換が必要である。
  また、 それを表示するには、 2次元平面上へ投影する必要がある。
  3次元グラフィックス変換と射影変換をマスターしよう。
  
  
  なお、今週から使用する関数がさらに増えるので、
  どの関数が何の役割を果たしていて、
  それがどのように呼び出されていくのかをよく調べること。
  
  
    - 
    図形のためのデータ構造は前回の演習で用いたものを使う。
    各線分はLINE構造体で,線分の集まりはFIGURE構造体で扱う。
    
    - 
    幾何変換を表現するためには,PARAMETER構造体を使う。
    平行移動(dx, dy, dz)、スケール(sx, sy, sz)、
    回転(thetax, thetay, thetaz)を順に書けば良い。
    これらは3次元グラフィックスでの幾何操作に対応したものになっている。
    3次元空間での回転は3つの軸(x, y, z軸)まわりの回転として表される。
    
    // 幾何変換のためのパラメータ
    // 9つのパラメータと補足データを保持
    struct PARAMETER {
      float dx;               // 平行移動(x方向)
      float dy;               // 平行移動(y方向)
      float dz;               // 平行移動(z方向)
      float sx;               // スケール(x軸)
      float sy;               // スケール(y軸)
      float sz;               // スケール(z軸)
      float thetax;           // 回転(x軸)
      float thetay;           // 回転(y軸)
      float thetaz;           // 回転(z軸)
      mat4x4 matrix;          // 変換行列
      struct PARAMETER *next; // 次の幾何変換パラメータ
    };
    
    
- 3次元幾何変換のための関数群を用意しよう。
 
 
	  - 
	  まず,変換行列のためのデータ型を定義しよう。
	  4x4行列となることに注意すること。
	    typedef double mat4x4[4][4]; 
- 
	  次に,変換行列の値を埋める関数を作ろう。
	  平行移動用の関数では、 (dx, dy, dz) は平行移動量、matrixが変換行列を表す。
	    
	    void simle_translation (double dx, double dy, double dz, mat4x4 matrix);
	     
回転用の関数は、X,Y,Z軸周りそれぞれ別の関数が用意されているが、
	  これは自分で完成させる必要がある。
	    void simle_rotation_x (double thetax, mat4x4 matrix);
	     
 
- 
	  変換行列とオリジナル図形(点列)から新しい図形(点列)を求める
	  関数を作ろう。
	  LINE構造体と transformから、 新しい点列 LINE 構造体を作る。
	  新しいLINE構造体(へのポインタ)を返す関数であることに注意すること.
	    
	    struct LINE *LINE_transform (struct LINE *line, struct PARAMETER *parameter);
	     これによって、移動・回転・スケーリング(PARAMETER構造体で表現できるもの)の
	  幾何操作を適用済みの位置に線分を描画できることになる。
	  - 
	  上の幾何操作済みの線分を視平面上に写像して描画するための関数を作ろう。
	  三次元データ(頂点や直線)を視平面に写像して、 実際のウィンドウ上に表示する。
	    
	    void normalized_draw_LINE(struct LINE *line)
	     
- 
    今回のサンプルプログラムでアニメーションを司っているのは
    animation_test()関数である。
 
 
	  - 
	    変換の行列を時刻(ループの回数)によって変えてみよう。
	    変換パラメータ(例えば移動量)を時刻によって
	    変えれば良い。
	  
 
 
- 
	    画面をクリアすれば、描かれていたものが全て消える。
	     glClear (GL_COLOR_BUFFER_BIT); 
- 
	  アニメーションの基本は、
	  一組(2つ)の変換パラメータを用意し、
	  その間を補間した変換パラメータを使いながら、
	  多数回に渡って図を書き換えていく方法である。
	  こうすることで、図形が滑らかに移動したアニメーションに見える。
	  
 
 
- 
	  適当に待ち時間を入れて, アニメーションのスピードを変えよう. 
	  それには, 以下の関数を用いると便利である. usleep(μsec)として
	  呼べば, μsec×(1/1,000,000)秒間, 動きが止まる. 詳しくは,
	  man usleepで調べること.
	  
 
 
 
- 
    3次元空間中に定義した多面体(何でも良い)のワイアフレームを、
    順次グラフィックス変換し、それを透視投影変換して画面上に表示する
    アニメーションを作成しよう。
    
  
  資料
  
先週と同様に、下のサンプルプログラムはそのままでは
コンパイルは通るものの、描画はされません。
適宜必要な部分を書き足して、描画できるようにしてください。
(ソース中にヒントがついています。)
  
以下は、参考までに色々なデータファイルから本授業向けに
フォーマット変換した3次元モデルスクリプトのファイル群です。
興味のある人は試してみましょう(応用課題)。
ここのファイルをもとに改良を加えても構いません。
これらのファイルは学外非公開です。
  
Yoshinari Kameda: 2004/09/17-, 2005/10/16-
Yuichi Nakamura: Tue Aug 12 00:41:10 JST 2003