June 27, 2004

ブロック崩し作成中

んーOpenGLでブロック崩しを作成中です。
まぁまだブロックのアルゴリズムを考えてるので未完成ですが、板と球のほうはプログラムができたので、
あとはブロックを配置してボールのプログラム部分にブロックに当たったらブロックを壊すというところを付け加えるぐらいかな。

コレが面倒なのですがねw

とりあえず次回がゼミの最終回らしいので集大成っぽいプログラムにしたいですよ。
時間ないけど。

Posted by fallener at 11:14 PM | Comments (0) | TrackBack

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 11:06 PM | Comments (0) | TrackBack

OpenGLはじめました。

ゼミでOpenGLやってます。
3Dにも到達していない進みぶりですが、これで単位がもらえるなら儲けですね。
とりあえず適当に私が作ったソースコードなどを垂れ流そうかと。

とはいえテキストみたいなのに書いてあるヤツの改造でしかないんですがね。
テキストに書いてあるほうもソースコード書いておこうかな。

アイディアとかあったら是非コメントに書いてくれるとうれしい。
まだまだ作らないといけないみたいだし。

ソースコードは次回からってことで。

Posted by fallener at 09:51 AM | Comments (0) | TrackBack