June 04, 2004

OpenGL一回目

とりあえずかなり初歩からいきます。
次にあげるのがテキストの最初に載っているプログラムです

/////////////////////////////////////////////
// 白い斜めの直線を一本引く
// line.c
/////////////////////////////////////////////

#include <stdio.h>
#include <opengl.ft>
void pict_line(void){ //描画部分
gclearbuffer(); //バッファをクリア
glcolor3d(1.0,1.0,1.0); //描画色指定 (r,g,b) 0.0<=r,g,b<=1.0
gline(0.0,0.0,200.0,150.0); //線を描画 バッファに
glflush(); //バッファに描画されたCGを表示
}
int main(void){ //基本部分
ginit(1); //画面を一枚用意して初期化
window_size(256.0); //サイズ指定大きさは−n〜nの大きさの正方形
reshapefunc(1); //サイズ変更の再定義の宣言
glutdisplayfunc(pict_line); //描画部分の呼び出し アドレスで
glutmainloop(); //描画する
return 0;
}

こんなのが最初に載っているわけですが、とりあえずのC言語はわかるので、問題はOpenGL特有の関数などです。
一応説明が載っていますが、とりあえずはHTMLのMETAなどと同じようにおまじないということにしておきましょう。

今回はゼミで最初に作ったプログラムのソースを載せることにします。
その前にとりあえずそれの元のプログラムのソースを乗せます。

//////////////////////////////////////////
// 半径rをキー入力し、円を描く
// ex_3.c
//////////////////////////////////////////

#include <stdio.h>
#include <opengl.ft>
static double r; //なぜかrをstaticで宣言 なしでいけない理由は不明
void pict_circle(void){ //描画部分
gclearbuffer();
glcolor3d(1.0,1.0,0.0);
gcircle(0.0,0.0,r); //中心座標(0,0)で半径rの円を描画
glflush();
}
int main(void){
printf("半径rの値を入力してください。\n"); //半径を入力させる
scanf("%lf",&r); //入力を読み取る
ginit(1);
window_size(256.0);
reshapefunc(1);
glutdisplayfunc(pict_circle);
glutmainloop();
return 0;
}

line.cのほうで説明した部分の説明は省いています。
そして次が私が作ったプログラム。

#include <stdio.h>
#include <opengl.ft>
#include <stdlib.h>
#include <time.h>
int i;
double r,x,y,red,green,blue; //座標と半径と色の変数を宣言
int waitloop(long t){
for(;t>;0;t--){ //空ループで時間差をつける
}
return 0;
}
void pict_circle(void){
gclearbuffer();
for(;i>;0;i--){
/* 色指定 背景が黒なので明度をあげるため0.3以上 */
red=0.3+(double) (0.7*rand()/(RAND_MAX+1.0));
green=0.3+(double) (0.7*rand()/(RAND_MAX+1.0));
blue=0.3+(double) (0.7*rand()/(RAND_MAX+1.0));
/* 座標と半径指定 座標は-200〜200 半径は10〜100 */
x=1+(double) (400.0*rand()/(RAND_MAX+1.0))-200.0;
y=1+(double) (400.0*rand()/(RAND_MAX+1.0))-200.0;
r=10+(double) (90.0*rand()/(RAND_MAX+1.0));
/* 描画 */
glcolor3d(red,green,blue);
gcircle(x,y,r);
waitloop(10000000);
}
glflush();
}
int main(void){
/* rand関数の初期化 */
srand((unsigned) time(NULL));
ginit(1);
window_size(256.0);
printf("円の表示数\n");
scanf("%d",&i);
reshapefunc(1);
/* 描画部分の呼び出し */
glutdisplayfunc(pict_circle);
glutmainloop();
return 0;
}

いろいろ無駄とバグがあります。
まず外に出した変数の宣言は関数(doubleをpict_circle)内に入れても問題はないです。
次にglflush関数をwaitのあとに呼び出さないとだんだんと出てくるという結果が出ない。
バッファに書き込むのに時間差をつけてもそのたびに表示させないと意味がないということです。
つまりglflushをforループの中に入れるとうまくいきます。

このように、いろいろと試行錯誤すると結構面白いです。
なんというか見た目が変わるというのがわかりやすく、自分が変えた部分がダイレクトにわかるのが面白みのひとつだと思います。
アニメーションさせたり3D画像を描いたりといろいろやれることがあり、アイディアがよく浮かぶのでとても楽しめます。
是非やってみることをお勧めします。

Posted by fallener at June 4, 2004 11:06 PM | TrackBack
Comments
Post a comment









Remember personal info?