2005年6月27日月曜日

第四回タイトル 「形状の空間移動設定」

やっと3次元で表現できるようになりました。
しかし、止まっていてはつまらないですよね。

で、今回は動きを取り入れてみようかと思います。



動きには2パターンあります。
自分が動くか、相手が動くかです。



自分が動くとは視点を移動させると言うことです。
相手が動くとは物体の位置座標を変えると言うことです。


自分が動く方は以前説明した視点の設定で変更することが可能です。
今回は相手が動く方の説明を行います。


視点の設定と形状を作成するプログラムの間に以下のプログラムを入れて下さい。

 static double z = 0;
 z += 0.001;
 glTranslated( 0.0, 0.0, z );  //平行移動関数


これを実行すると形状がZ方向に移動すると思います。


これはZ方向に変数zだけ移動しますよと言うものです。
実際にはstaticで宣言せずメンバ変数などで指定したほうが便利です。(^^;


続いて回転です。先ほどの部分を次に置き換えてみてください。

 static double RotZ;
 Z++;
 glRotated( RotZ, 0, 0, 1 );   //回転移動関数

これでZ軸周りに回転すると思います。
第1引数は回転量、単位はラジアンです。
第2引数~第4引数まではどの軸で回すかという指定です。単位ベクトルで指定します。


この2個組み合わせて形状の空間移動を行います。
しかし、組み合わせていくうちに使いにくいことが分かるかと思います。
それは、すべて移動関数が足し算を行っていくと言うことです。
絶対座標で表したいのに相対座標で設定しなければならないのは不便です。
そこで次の関数があります。

 glPushMatrix();   //マトリクスの挿入
 glPopMatrix();    //1個前のマトリクスの解除

移動関数の最初にglPushMatrix関数を入れ形状を作成し、glPopMatrix関数で閉じれば間にある形状に対してのみ移動関数は作用されます。


多数の形状を操作するときはこの関数を使用すると絶対座標で指定出来るので管理が楽になります。


平行移動関数と回転移動関数を紹介しましたがこれとは別にマトリクスの指定による移動も可能です。マトリクスで指定するほうが簡単で演算も少なくて済むので速く処理が行います。


しかし、マトリクスとは4行4列の行列で表され数学の知識が必要となります。数学は苦手だ~と言う人もご安心下さい、別に数学出来なくても大丈夫です。次回はマトリクスについてご説明いたします。


 glTranslated 関数説明:
 第1引数:X座標並行移動量
 第2引数:Y座標並行移動量
 第3引数:Z座標並行移動量

 glRotated関数説明:
 第1引数:回転移動量(単位ラジアン)
 第2引数:X軸回転指定
 第3引数:Y軸回転指定
 第4引数:Z軸回転指定
 第2引数~第4引数は単位ベクトルで指定