Pages

OpenGL

2012年5月15日火曜日

最近バイト先でOpenGLについて勉強してます。
学校の課題でOpenGLを使って3Dアニメーション(?)を作成したことはあるのですが、
あまり知識がないままプログラムを書いていたので、初めて知ることばっかりです(´ω`)
そこで、学んだことを忘れないようにここに書いておこうかな、と。

1.glPushMatrix()とglPopMatrix()

①マトリクス変換(拡大・縮小、回転、平行移動など)
glPushMatrix();
{
②マトリクス変換
図形の描画(①、②が適用される。)
}
glPopMatrix();
図形の描画(①のみが適用される)

というもの!
これを知った時、すごい感動しましたw
これを知らなかったために、学校の課題では、ものすごーく苦労しました(´・ω・`)
ちなみに、学校の課題ではこんなのを作りました。
↑は画像ファイルなので動きませんが、本物は馬と苺が動くんです(´ω`)
ただ、pushとpopを知らなかったので、馬の前脚と後脚が全く同じ動きをしてしまうという…(´・ω・`)
本当は全部別々に動かしたかったんですけどね(´・ω・`)
もっと早くpushとpopを知っていれば…(´・ω・`)
ちなみに、pushとpopは、入れ子構造も可能!
とっても便利!

2.マトリクス変換が実行される順番
プログラム上でマトリクス変換を呼び出す順番とマトリクス変換が実際に実行される順番は逆転するらしい!
具体的には、

GL10 gl;
gl.glTranslatef(0.5f, 0.0f, 0.0f);
gl.glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
図形の描画

というプログラムの場合、
原点を中心に反時計回りに45度回転させたうえで右に0.5だけ移動させる
という処理が行われるそうです!

これも初めて知りました(・ω・;)(;・ω・)
なぜこれを知らずにプログラムが書けていたのか不思議で仕方がないですw

3.Javaの乱数
OpenGLとは全く関係ないのですが、Javaで乱数を発生させられるRandomクラスについて。
Randomはよく使っていたのですが、シードというものを初めて知りました!

Random rand1 = new Random(9);
Random rand2 = new Random(9);
として、rand1.nextInt()とrand2.nextInt()などを実行すると、
rand1とrand2は同じ値を同じ順番で返すそうです。
この場合、9がシード値。
今までシード値を設定したことなんてないのに、問題なく乱数を発生させられたのは何故なのか疑問に思ったのですが、
Random()の場合、シード値は現在時刻を元に設定されるんですねー。
シード値を使う場面が思い浮かばないけど、勉強になったので良かったです。
シード値については、こちらのページの説明がわかりやすいので、気になる人は参考にどうぞ。↓
http://d.hatena.ne.jp/fumokmm/20090116/1232120896

この前、初めて知ったことはこんな感じかな。

ちなみに、バイト先で使っている本はこれ↓
OpenGLで作る Android SDKゲームプログラミング
悪い評価もあるみたいですが、私的にはとってもわかりやすくて、読んでて楽しいです(´ω`)♪

明日は久々のサークル(´∀`人)☆
たのしみだー☆

0 コメント:

コメントを投稿