<Animatorクラスとスレッド>
・「Animator クラスを使わないとインタラクティブなプログラムは難しい」という が、実はできるのではないかと思って作ってみた。 見ての通り、 display メソッドの中身を mouseDragged の中にも書いただけである。 これで上手くいくなら Animator など使う必要もないわけだが...当然ながら失敗。 実行結果を見るに、マウスをドラッグしても描画を行っていないようだ。一方で計 算用の座標値変更はきちんとなされていることも分かる。 2次元ではできたのに、どうして今回はうまくいかないのか...。 おそらく教科書の「別のスレッド~」というあたりの理解が足りないのだろうが。 とりあえず Animator なしでの実装に関して、今はこれ以上深入りしないことにし た。
↓
JOGLによって OpenGL の関数(プログラム)を実行できるのだが,実装の都合上,別のスレッド(実行単位でプロセスよりも小さいもの)が用いられていることがある(どうも別スレッドになっていないこともあるらしい).スレッドとは実行の単位であり,描画命令だけを扱うプログラムが,マウスなどのイベント処理のプログラムとは別に走っていると想像してもらうと良いだろう.このためマウスイベントのプログラムから OpenGLの関数を呼ぼうとしてもうまくいかないことがある.
(以下のような考察があったが,比較的良い書き方をしていると思う)
・第4章でもマウスイベントに対応して 描画を行うプログラムを作成した が、それとこちらとの最も大きな違いは、第4章では描画命令が各イベントのコールバックメソッド内に 記述され、イベントが発生するごとに描画が行われていたのに対し、こちらではanimatorによって一定時 間ごとに呼び出されるdisplayメソッドに おいて描画が行われることである。第4章のようなマウスイベ ント発生→数値の書き換え→描画の流れを、JOGLを用いて再現することは 難しい。なぜならJOGLでは マルチスレッドが採用され、マウスイベント処理と描画が別スレッドに置かれているからである。 別ス レッドであるとはその2つの処理の間に上流、下流の関係がなく、必要なときやCPUの手が空いたときに 自由な順番で処理されるということである、と理解した。 ここではmouseDraggedメソッドは マウスが ドラッグされたときだけ、displayメソッドは描画が要求されたときだけ呼び出され、しかもdisplayメ ソッドの外に描画命令を書くことも、 displayメソッドを明示的に呼び出すことはできないから、 mouseDraggedメソッドの処理の一部として描画を行うことはできないのである。これは 言語とライブ ラリの仕様によるもので、抵抗の余地はないようだ。

<多角形の表示 - 三角形への分割>
・第7回のレポートで形をイメージできなかったねじれ面(を想定して 作ったもの)を回して、形を観察することにした。リベンジである。 ここで作ろうとしたねじれ面とは、立方体の向かい合う2辺のそれぞれの対角線(ただし平行でない組)を結んだ面のことを指す。(…途中省略…)やはりねじれ面とは似ても似つかない形をしている。 しかし今回はかなり手軽に回せるので、描かれている図形が何なのかしっかり把握 できた。作ろうとしたのは各色1つずつのねじれた四角形で 青は { 2, 5, 0, 7 } 赤は { 7, 0, 5, 2 } だったのだが、描かれたのは各色2つずつの三角形で 青は { 5, 0, 7 }, { 7, 2, 5 }赤は { 0, 5, 2 }, { 2, 7, 0 } であった。 また、引数ありとなしを見比べれば分かる通り、表裏を描けておらず、別の面を描 いている。 どうやら指定した4つの頂点のうち 2,3,4 番目と 4,1,2 番目を使った三角形を描くようだ。
(いろいろ省略)
プログラムで指定した頂点と実際に描かれる三角形の頂点の関係は先ほどのプログ ラムと同じであり、やはり一定の規則に従っているようだ。 ところでこの規則、見方を変えると、指定した4つの頂点のうち 2, 4 番目を折り目と した折れ面を描いているとも言える。頂点の指定順は異なるが GL_TRIANGLE_STRIP を使った図形と同じではないか。 期待した曲面に似た折れ面を描くようにこういう規則になっているのか、特に意味 はないのか...。
(いろいろ省略)
あとから第7回レポートへのコメントを読んだ。 ねじれ四角形を描こうとしたとき三角形が2つになるというのは考察通りだったが、 つまり今まで四角形だと思っていたものも三角形を2つ同一平面上に描いていただけということか。
↓
考察にある「三角形を2つ同一平面上に」という部分がやや微妙だが,概ね正しい推測をしている.3次元の頂点を4つ以上与えると,同一平面上に存在する保証がなくなる.というよりも,数値誤差が含まれたりするために,同一平面上に乗っていることが稀になる.そこで,OpenGLというよりも3Dグラフィクス一般では,もっとも基本となる三角形の集合として描画している.与えられた頂点から,どのような三角形群を生成するかは実装依存であるが,TRIANGLE_STRIPやTRIANGLE_FANと同様な分割法が一般的である.

<ObjectRotateの改良>
・例題1と例題2で立方体が上下逆になったときにマウスの動く方向と逆に動いてい るように感じられる理由は分かったのですが、それを改善しようと試行錯誤したの ですが、できませんでした。
・教科書でも説明されていたようにy軸の傾きのよって回転の仕方が変化してし まった。立方体が常にマウスのドラッグ方向を向くようにするには、 motionInit関数の中でthetaX, thetaYを決定する際に単に移動した距離に比 例させるだけでなくその上でrotx,rotyの値に応じて変化させるべきなのだろ うと思ったが、どのように変化させればいいのかが分からなかった。
・逆さのときマウスと逆に動くのをなんとか直せないかとか右ドラッグで拡大縮小とか考えたがさっぱり分からなかった。時間のあるときにじっ
くり考えてみたいと思う。
・ if文を用いて、立体が逆方向を向いていたら(角度 で範囲を決めたりすればいいのでは)、逆回転をする、というプログラムを作れ ば、これは解消されるかもしれない。
・例2で、立体の上下がひっくり返ると左右の動きがマウスの動きと反対にな ってしまう。 上下をひっくり返しても左右の動きがマウスと対応するようなプログラムを組 めないか試してみた。(…途中省略…)「上下が逆転したとき」という条件さ え数式で書くことができれば左右の動きとマウスの動きを対応させることは if 文を使えば容易に できるはずである。そこで今度は、-3/2*pi <= (x 軸周りの回転角) <= -1/2*pi、1/2*pi <= (x 軸 周りの回転角) <= 3/2*pi となる場合にのみ左右の回転角を-1 倍するプログラム ObjectRotate2.java を 継承して CubeRotate2.javaを書いてみた。
(いろいろ省略)
しかしこのプログラムでも思ったような成果は得られず、上下が逆転した場合 は左右の動きと マウスの動きが逆転してしまっていた。なぜうまくいかなかったのかについて は原因を特定することはできなかった。
↓
考え方は良さそうに見えるが,プログラムにうまくつながらなかったようだ.x軸周りの回転角が rotx で表現されていることを考えると,ObjectRotate.java の motionInit の一部を以下のように変えてみるとどうだろうか?
        //roty += thetaY; 
        if ((int)((rotx+90.0f)/180.0f)%2 == 0)
            roty += thetaY;
        else
            roty -= thetaY;

<マウスイベントの処理>
・CubeRotateを実行した時、ウインドウの外でマウスをドラッグしていた時 も立方体は回転していたが、ウインドウの外でのマウスの移動を Objectrotateが完治しないようにはできるのだろうか?
↓
「完治」は「感知」だろう.mouseExitedやmouseEnteredを使えば,切り替えられるであろう.

<ObjectRotateでの z軸の回転>
・(ObjectRotate.javaで)他の問題点としては、 マウスの動きが二次元なので、Z 軸を中心に回転が出来ないので、常にマゼンダの 面の法線ベクトルが画面で見て横方向に傾かない点が挙げられると思う。 しかし、こ れはマウスから得られる入力が二次元である以上仕方ない点である。マウスホイー ルの回転を Z 軸の回転量に対応させると良いかも知れないと思う。
↓
考えついたら試してみよう.

<ObjectSpinの改良 - 1>
・(ObjectSpin.javaで) mouseReleasedを
	public void mouseReleased(MouseEvent e) {
	 int x = e.getX();
	 int y = e.getY();
	 if ((x == prevX) && (y == prevY)) angle = 0.0; 
	}
と書き換えると、ドラッグ時にもmouseReleasedが適用されるようになり、マウスを 離すと回転をやめるプログラムになる。
↓
確かにそうではある.

<ObjectSpinの改良 - 2>
・しばらくドラッグしてからマ ウスを完全に静止させそのあとにリリースすればdeltaX = deltaY = 0 によって回転を 静止させる効果が 得られると予想していたが、実際はそのようにならず、ゆっくりと回転し続けるという結果になった。
・(ObjectSpin.javaの SetMatrixメソッドに) 追加で、l68 の部分に
	if (angle > 0.0) {
	 angle -= 0.0001;
	 if (angle < 0.0) angle =0.0;
	}
などと入れてみた上でドラッグで回転させた後放っておくと、抵抗があったりブレーキがかけられていたりするように次第に回転が弱まっていく。ただし、二つ目 の if 文を else ですまそうとすると一瞬逆回転する恐れがある。
・まわしてみた感じがスマートフォンのアプリのようだったので、摩擦で回転が止ま るようにしてみた。
	angle = angle - 0.001;
	if (angle < 0.0001) angle = 0;
↓
同じことを考える人はいるものですねぇ.2名とも減算を用いているが,減算にせずに乗算にする方が自然な気がする.つまり,
	angle *= 0.9995;
という行を入れることでも,ブレーキがかかるはず.

<CubeRotateとクリッピング面>
・(CubeRotateで)ちなみにカメラのnear,farの区間を狭くして断面を写すようにして実行するとスクリーンセー バーみたいな挙動をしておもしろい。
↓
プログラムや実行結果の画像をレポートにまとめて提出してもらうと良い.

<回転と平行移動>
・(ObjectRotateで)右クリックしている間は回転ではなく立方体が平行移動するよう改変したかったので
・(CubeRotateで)CubePositionのときと同じように、右クリックのドラッグでこちらに近づくようにし たかったが、画面に向かう軸が作れずに断念した。 軸をもう一つ最初から持っておいて、回転すると一緒に回るようにすればできそう だが、なんとか変数を増やさずにやりたかった。
↓
たぶん第14章に,その答えがある.

<奥行き値の意味>
・(CubeRotateで)gluProject によって、本当は存在しないウィンドウ上の Z 座標を取得できるが、この 値を表示させたところ、0.9473683953285217 であった。ウィンドウサイズの 500px と 比較すると非常に近く感じる。この値の実質的な意味はよく分からなかった。
↓
奥行きの差を表現するための数値であり,あまり意味はない.実装依存(のはず)であり,環境によっても値が変わる可能性がある.

<回転行列 - 1>
・(ObjectRotate.javaで)あと、glRotatefが世界座標を回しているんでしょうけれども、glRotatefメソッドで回 転角を毎回いれているというのは、これは回転行列をかけているのではなく毎回リ セットしているということなのでしょうか? また、リセットではなくかけ合わせるようなメソッドはあるのでしょうか?
↓
おそらくプログラムが理解できていないものと思われる.ObjectSpin.java との違いを良く考えてもらいたい.

<回転行列 - 2>
・modelMatrix と projMatrix はよくわかりません。実際何の値を持っていますか。どうし て 16 の array ですか。
↓
同次座標表現を用いる場合に,行列は 4×4 = 16 の要素を持つため.このような疑問が出るのは,第11章の理解が不完全なためのように思われる.

<回転行列 - 3>
・『OpenGLではあとから適用される変換行列を先に乗じる』というのは,1つのメソッド内ではGLインタフェースは全て後ろに書いてあるほうから適用されるということで間違いないでしょうか?
↓
質問の意味がとらえられていないが,たぶん間違っていると思われる.JOGLの行列計算は,教科書のp.80〜81に書いてあるように,点に対して左から行列を適用するものとして,一番左から行列計算をするためである.この方が何かと便利が良い.たとえば,第13章の円錐群の描画などでスタックを利用すると,その有用性が解ると思う.

<Windows上でのJOGL環境>
・いえでのwindows環境でjavaのjavaxが使えなかったので、学校のmacでコツコツやり ました。家でもできるように開発したいと思います。
↓
Windows上でのインストールについて,少し説明を増やしたので,授業のページの最初を見て欲しい.

<日本語コメント/エンコーディングの問題>
・Windows実行環境で,文字エンコーディングの違いからコメントが不正な文字として認識され,javacのコンパイルが通りませんでした.Windows で通す方法はあるのでしょうか?
↓
すでにコメントに書いた記憶があるが….エディタ(emacs, miなど)を使えば,エンコーディングを変更できる.また,以下のようにコンパイル時にエンコーディングを指定してコンパイルする方法もある.
	javac -encoding utf8 *.java

<演習室>
・朝1限のうえに3階はつらいので,2階に戻りたい.
↓
もともとの部屋は中演習室3で,同じ3階の奥の部屋である.2階は他の授業で使われている.

<実行結果>
・今回の課題のような動きの有るプログラムについては、画像ではなく、 動画や何かを添付した方が好ましいと思ったが具体的な方法はわからなかった。  あと、プログラミング中の < 以降が表示されなくなってしまうのは、おそらく前後に空白を入れると解消できると思う。
↓
それもあって,jarファイルとして提出してもらっている.「<」の表示は空白を入れてうまくいくかはブラウザ依存であり,授業のページで書いているように「<」を使うべきだろう.

<授業に関するコメント>
・レポートに対するコメントがいつも文字化けしています。(文字エンコーディング が、実際はUTF-8であるものがISO-2022-JPとして認識されています。)文字化けを なくして、文章の可読性を高めるようお願いします。
↓
いろいろと調査した結果,多少改善されていると思う.確認してもらいたい.ブラウザの種類などにもよるので,不具合がある場合の環境も含めて指摘してもらいたい.