<同次座標に関して> ・同次座標が説明されたが、参考書を読んでいると、これは実は2DCGでも適 応できたこと発見 ↓ 教科書の同次座標の導入では,一般のn次元を表す方法として書いてあったはずで,もちろん2次元の同次座標表現もある. <透視投影について> ・教科書の透視投影行列について、投影先の最終的なz座標がd-(1/z)となっている ↓ 授業で話したはずだが,投影後も奥行きの前後関係を保存する必要があるために,このような行列を用いる. <同次座標のwと透視投影> ・CubeMatrix.javaにおけるtranslate行列の(4,4)成分を少し大きくしても描画図形が変わ らず、7.0以上になると手前から図形が欠けていくようになったが、これがなぜなの か分からなかった ↓ translate行列の(4,4)成分を大きくすることは,同次座標のw成分を大きくすることに相当する. これが透視投影に与える影響を考えると,教科書の透視投影の式で [x y z 1]^T とあるところが [x y z w]^T となり w の値を大きくしたことに相当する. 結果として変換後の x,y成分は変化せず,z成分が d - w/z となることがわかる. つまり奥行きの z 成分が小さくなり前方クリッピング面と干渉する.w を小さくすれば, 後方クリッピング面と干渉するので試してみるとよいだろう. <広角レンズの効果> ・広角レンズによって写していることになるので、ゆがみが大きく出てもおかしくないと思う ・魚眼レンズのような効果を得ようと試 みた ↓ 広角レンズに伴う歪みは周辺部に現れる.具体的には,第15章の章末課題で扱う. <JOGLのAPI仕様> JOGLのAPI仕様は http://worldwind.arc.nasa.gov/java/jogl/docs/ http://jogamp.org/deployment/jogamp-next/javadoc/jogl/javadoc/ などで調べることができる. <gluLookAtとの関連について> ・gluLookAt メソッドが実際にはこれと同じ書き方がされているのか、それとも何か違う風に書かれているのかが気になった。 ↓ gluLookAtはup vectorの指定が可能であり,より複雑になります. 時間があれば,gluLookAt を自分で実装してみましょう. ・今回の例題1の意義は、結局いったい何だったのでしょうか?なんだかこのプログラムだけ本筋から離れているようにも見えたのですが。 ↓ 同次座標系に対する4×4行列の効果について勉強して欲しかったのだが…. この授業はグラフィクス(JOGL)のプログラミングができるようになることを目的としているのではなく, 3次元グラフィクスプログラムの基本となる考え方を身につけたいと考えています. <glRotatefの仕様> ・glRotatef の引数について、 1つめが角度の大きさ、2つめが x 軸を指定、3 つめが y 軸を指定、4 つめが z 軸を指定するものだと解釈した ・glRotatef関数で、成分ごとに比率を決めることができる ↓ glRotatefの第1引数は回転角だが,第2引数以降は回転軸の方向ベクトルを表している. <glMultMatrixdの引数> ・glMultMatrixd(rotate, 0) の引数の0は何ですか? ↓ JOGLでは配列データのあとに大抵offset(配列の先頭を示す値)が与えられます. <右手座標系と左手座標系> ・視点のZ軸の 取り方が視点座標系とモデル座標系で異なるので計算が複雑になるが、なぜZ軸の方向を統一できないのだろうか ↓ 一般的な用法として,視点座標系では左手座標系,モデル座標系では右手座標系を用いるため. 視点座標系では,画面に対してz軸を奥行きに正の向きにしようとすると,左手座標系になります. また,一般的に3次元の座標系は右手座標系を利用するため,違いが生じています. <画角に関して> ・画角が0°になっても見えるというのがよくわからなかった。 ↓ 画角が0度の場合には,平行投影(直投影)になり,普通に描画されます. ・画角のfieldOfViewをとして大きめの数を与えてみた。すると180では表示されず、300では画像が反転して表示された。 ↓ 180度では半空間全体を表示しようとするので,投影した形状の面積はゼロになってしまう, 画角が負の値や180度以上になると,投影像は反転します. ただし,仕様上では,0 < fieldOfView < 180,0 < near < far であり, それ以外の値を入れた場合の挙動は保証されているものではないことは,注意してください. ・ウィンドウのサイズ変更を行う とき、縦に大きさが変化すると中の立体もあわせて拡大、縮小するのに、横の変化 に対しては何の反応もなかった ↓ gluPerspective で指定する fieldOfView は教科書の説明にもあるように,縦(y)方向の角度だからである. <クリッピング面について> ・near=10, far=1という指定を行ってしまった ・前後のクリッピング面の位置を一致させてみた. ・前方クリッピング面の位置を 0や負の値にしてみた. ↓ クリッピング面の位置について仕様では 0 < 前方クリッピング面 < 後方クリッピング面 となることを前提としているので, その振舞は保証されていない(環境やライブラリ依存である) <JOGL/OpenGLにおける行列の指定> ・displayメソッド中でrotateする前にgl.glMatrixMode(GL.GL_MODELVIEW); と 書かなくても良いのだろうかと思った ↓ その前に実行された reshape での設定が有効となっている <JOGL/OpenGLの行列の扱い> ・列優先や右から行列演算をする理由やメリットなどについて教えていただきたいです ↓ 右からの行列演算については,行列スタックを用いて,全体と部品の関係を表すのに適しているためで, 教科書の説明や第13章のプログラムの複数円錐のプログラムなどを試すと効果がわかるだろう. 列優先については歴史的なものが大きいと思う. ただ本来は,サイズ16の1次元配列であり,プログラムにおいて4行4列で書いてしまうと転置しているように見えるだけであり, 1次元配列の中では平行移動の成分が最後にまとまっているのは自然と言えば自然だろう. <行列スタックの使い方> ・行列をスタックに記録しておくことで行列を合理的に扱える。l59 にあるよ うにスタックに保存しているわけだが、ポップした後にスタックからは消えている。 ポップしてもコピーするだけでスタック内に保持したままにして おいたりはできないのだろうか。 それとも、スタック内にとっておくべき行列がか わったときのためにはこの方がプログラムがシンプルにすむからなのだろうか。 ↓ ポップして取り出すときにコピーとすると行列が溜まり続けてしまいます.必要なものは改めてプッシュすれば良いでしょう. <画像ファイルの変換> ・前回と同様、グラブの TIFF を PNG に変換するのが面倒だった。TIFF を PNG に変換するコマンドは ないのでしょうか。 ↓ ECCSでは convert コマンドがあります. $ convert hoge.tiff hoge.png とすれば,pngファイルを作ってくれる.また,(bashで)一気に変換するには,以下のようにすれば良いでしょう. $ for i in *.tif > do > convert $i ${i%tiff}png > done