読者です 読者をやめる 読者になる 読者になる

解説

前回からの変更点はGLThread.drawFrame()内のglViewportの下の中括弧2組の部分ですと、ポリゴンの頂点座標です。


まず最初のglMatrixMode()ですが、OpenGLには内部で保持している行列の領域があり、
これからその中のどれを使うか、ということの設定をしています。
具体的に使えるものは以下の3つです。
・GL_PROJECTION --- 射影行列領域
・GL_MODELVIEW --- モデルビュー行列
・GL_TEXTURE --- テクスチャ行列
今回は射影行列とモデルビュー行列を使っています。
テクスチャ行列はたぶんあまり使わないので放っておいていいです。


ここではGL_PROJECTIONを使用しているので、これから設定する行列は射影行列になります。
射影行列とはオブジェクトの座標(今回のポリゴンの(-0.5f, -0.5f, 0.0f)などを
画面のどの辺に表示するかを変換するための行列です。
射影行列は画面サイズ変更などがない限り、変更しなくても問題ないですが、
今回は修正点を1箇所に集めるために毎回更新する場所で行っています。


glLoadIdentity()は、選択中の行列を単位行列化して初期化します。
行列については、数学の知識になるので、ここでは説明は省略します。
最後に書く参考サイトやその他のサイトで調べてください。


GLU.gluPerspective()は射影行列にパースペクティブ行列を設定します。
GLUというクラスを使って設定していますが、GLUはOpenGLユーティリティ(Utility)の頭文字です。
パースペクティブ行列は以下の図の値の設定を行います。
f:id:kambayashi:20081102033444p:image
gluPerspective()の引数は以下のようになっています。
gluPerspective(GL10 gl, float fovy, float aspect, float zNear, float zFar)
これを上記の図に当てはめると以下の様になります。
視野角=fovy
最も近くで見える地点=zNear
最も遠くで見える地点=zFar
残りのaspectはアスペクト比、画面の縦横比です。
特別なことがなければ、サンプルの値を使っておけば問題ありません。
ただしアスペクト比はViewオブジェクトを直接見ていますが、画面サイズ変更の割り込みで変わる可能性があるので、
処理中に値が変わらない方法にしたほうがいいです(synchronizedブロックで囲むとか)。
ここまでで射影行列の設定が完了しました。
同じブロック内でビューポートの設定がありますが、これは画面のどの領域に描画するかの設定になります。
これも射影行列と同じく、画面サイズが変更になった時のみの変更で問題ありません。

ここからはモデルビュー行列の設定です。
モデルビュー行列とは視点に関するビュー行列と、オブジェクトの座標変換に係るモデリング変換をあわせたものになります。
glMatrixMode()でGL_MODELVIEWを指定してこれから使う行列領域を設定します。
そして、glLoadIdentityで単位行列化します。


GLU.gluLookAt()はカメラの設定を行います。
カメラとは上の画像の視点にあたるものになります。
gluLookAt()の引数は以下のようになっています。
gluLookAt(GL10 gl,
float eyeX, float eyeY, float eyeZ,
float centerX, float centerY, float centerZ,
float upX, float upY, float upZ)
引数は視点座標、注視点座標、カメラのアップベクトルで、
それぞれXYZの3要素ずつで構成されています。
まず視点座標については、そのままカメラの位置です。サンプルではポリゴンの正面右上の座標になっています。
次に注視点はカメラが見つめている場所になります。サンプルではポリゴン描画位置と同じ(0,0,0)です。
そしてカメラのアップベクトルですが、これは人間でいうと頭頂部が向いている方向になります。
頭を傾けると視界も傾いて見えるように、カメラにも傾きがあります。
サンプルではy軸(縦方向)に1のベクトルとなっていて、
人間でいうと直立の状態になります。通常はこの値のまま使って問題ありません。


以上が今回のサンプルの解説になります。
ただ読み返してみてもOpenGLを知らない人が見て理解できるかというと、相当怪しいです。
まあ理解できなくてもサンプルは動くので、どんどん先に進んでいきましょう。

参考

ビューポートの設定について
http://wisdom.sakura.ne.jp/system/opengl/gl13.html
射影変換について
http://wisdom.sakura.ne.jp/system/opengl/gl12.html
モデルビュー変換について
http://wisdom.sakura.ne.jp/system/opengl/gl11.html
行列って結局なんなの?
http://shigihara.hp.infoseek.co.jp/mx_index.htm