このような 回転や平行移動による座標変換の情報は ModelView 行列 が持っている ModelView 行列は gl.glpushmatrix() でいったん保存しておき 回転や平行移動を重ねて描画した後 gl.glpopmatrix() で保存した状態に戻すことができる ワールド座標系とウィ

Similar documents

3D 描画 Step1-1 まず O 原子となる球を 1 つ描画する <WaterPanel.java の作成 > 1.Chemical プロジェクトをインポート 共有フォルダから Chemical.zip をコピーして workspace 内にはりつけ パッケージ エクスプローラで右クリック イン

手書認識 グラフ描画 Step2-2 手書認識 : 認識結果を PaintPanel で描画する < 属性付き文字列 AttributedString> 標準出力では分かりにくいうえに認識結果を使えないので 認識するごとに PaintPanel に文字を描画することにする ここで 数式はただの文字列

以下に java.awt.graphics クラスの主なメソッドを示す (Graphics クラスの ) メソッド drawline(int x1, int y1, int x2, int y2) drawrect(int x, int y, int width, int height) fillr

Assignment_.java /////////////////////////////////////////////////////////////////////// // 課題 星の画像がマウスカーソルを追従するコードを作成しなさい 次 ///////////////////

Microsoft PowerPoint - 04.pptx

のようにする 上の例では GeneralPath を new するときに コンストラクタに何も指定していないが 直線を表す Line, 四角形を表す Rectangle などを引数に与えてもよい 矢印を作成するメソッドの引数矢印を表す GeneralPath を生成するために getarrowpat

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

Microsoft PowerPoint prog1_doc2x.pptx

Microsoft PowerPoint prog1_doc2.pptx

コンピューターグラフィックスS

Graphical User Interface 描画する

コンピュータグラフィックスS 演習資料

問 1 図 1 の図形を作るプログラムを作成せよ 但し ウィンドウの大きさは と し 座標の関係は図 2 に示すものとする 図 1 作成する図形 原点 (0,0) (280,0) (80,0) (180,0) (260,0) (380,0) (0,160) 図 2 座標関係 問 2

I. (i) Foo public (A). javac Foo.java java Foo.class (C). javac Foo java Foo (ii)? (B). javac Foo.java java Foo (D). javac Foo java Foo.class (A). Jav

Java言語 第1回


ブロック崩し Step1 矢印キーで左右に動かせるパドルを描画する < パドルの表現方法 > パドルは java.awt パッケージの Rectangle という Java が用意しているクラスを使う これは四角形を表すクラスで 左上の点の座標と幅 高さをもっている (x, y) Rectangle

問1

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Animals サンプル Step3 張り付けた動物の上をクリックすると それぞれの鳴き声で鳴く その鳴く間 一定時間 ( ここでは 1 秒間 ) 画像が別のものに変わる <アニメーションの基礎 : タイマーについて> アニメーションは アプリケーションが指定する間 一定間隔でどんどん画像をおきかえ

XAML Do-It-Yourself シリーズ 第 12 回 3D グラフィックス -1-

Animals サンプル Step 1 動物の種類を指定しておいて クリックした場所に画像を貼り付ける < レイアウトについて > 前回は ラベルやボタンの位置を座標で設定した Absolute Layout を選んだためである レイアウトは どのようにボタンなどのコンポーネントを配置するかを決定す

Microsoft PowerPoint - OOP.pptx

HCI プログラミング 5 回目ウィンドウに画像を表示してみよう 今日の講義で学ぶ内容 画像の表示 画像のエフェクト 画像のビューポート指定 画像の表示 1 画像を表示してみましょう 画像の表示はクラス ImageView により管理されます ソースファイル名 :Sample5_1.java //

ToDo: 今回のタイトル

次の演習課題(1),(2)のプログラムを完成させよ

Microsoft PowerPoint ppt

PowerPoint Presentation

PowerPoint プレゼンテーション

演算増幅器

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

Cir

スライド 1

vecrot

コンピューターグラフィックスS

IT プロジェクト

JavaプログラミングⅠ

C#の基本

JOGLによるOpenGL入門

Chapter JDK KeyListener keypressed(keyevent e ) keyreleased(keyevent e ) keytyped(keyevent e ) MouseListener mouseclicked(mouseeven

Animals サンプル Step 2 張り付けた動物の上をクリックすると それぞれの鳴き声で鳴く < 例外について > エラーや 通常の処理の中では起こってはいけない事象のことを例外といい 例外が起こる可能性がある場合はその対応処理を記述しなければならない 一般に java.lang パッケージの

Microsoft Word - 92.doc

一方, 物体色 ( 色や光を反射して色刺激を起こすもの, つまり印刷物 ) の表現には, 減法混色 (CMY) が用いられる CMY の C はシアン (Cyn),M はマゼンタ (Mgent),Y はイエロー (Yellow) であり, これらは色の 3 原色と呼ばれるものである なお, 同じシア

Microsoft PowerPoint - OOP.pptx

Microsoft PowerPoint - chap10_OOP.ppt

表示の更新もそういた作業のひとつに当たる スレッドの使用アニメーション アニメーションやシミュレーションなどは画面の更新が一定のタイミングで行われていく この連続した画面の更新をスレッドを利用して行う しかし paint() メソッドを直接呼び出して表示を更新することはできない その理由

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

JAVA入門

コンピュータグラフィックス第8回

0 21 カラー反射率 slope aspect 図 2.9: 復元結果例 2.4 画像生成技術としての計算フォトグラフィ 3 次元情報を復元することにより, 画像生成 ( レンダリング ) に応用することが可能である. 近年, コンピュータにより, カメラで直接得られない画像を生成する技術分野が生

PowerPoint プレゼンテーション

教材ドットコムオリジナル教材 0から始めるiアフ リ リファレンス i アプリ簡易リファレンス ver i アプリ Java 独自のメソッド (1)iアプリの命令を使えるようにする import com.nttdocomo.ui.*; (2) 乱数を使う import java.u

JAVA入門

KeyListener init addkeylistener addactionlistener addkeylistener addkeylistener( this ); this.addkeylistener( this ); KeyListener public void keytyped

Javaプログラムの実行手順

2008 e-learning T050050

r3.dvi

Microsoft PowerPoint - prog10.ppt

Java講座

Microsoft PowerPoint - lec06 [互換モード]

Microsoft PowerPoint - prog10.ppt

Java講座

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

10/31 Java AWTの基本構造(Frameクラスの継承) 演習課題資料

ソフトウェア開発方法論2

Processingをはじめよう

Java講座

情報システム設計論II ユーザインタフェース(1)

Microsoft Word - BouncingBall.doc

JavaプログラミングⅠ

デジタル表現論・第4回

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

// ステージを設定します stage.setscene(scene); stage.settitle(" キャンバス "); // ステージを表示します stage.show(); public static void main(string[] args) launch(args); キャンバス

1222-A Transform Function Order (trsn

謗域・ュ逕ィppt

スライド 1

プログラミング入門1

謗域・ュ逕ィppt

PowerPoint プレゼンテーション

2 1 Java 1.1: (paint, update) Frame Canvas java.awt.canvas java.awt.component java.lang.object paint Canvas Graphics update Canvas ( ) paint Graphics

Microsoft PowerPoint - info_eng3_05ppt.pptx

基本情報STEP UP演習Java対策

CG

ガイダンス

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

r3.dvi

文字列操作と正規表現

Microsoft PowerPoint - [150421] CMP実習Ⅰ(2015) 橋本 CG編 第1回 幾何変換.pptx

< F2D F B834E2E6A7464>

謗域・ュ逕ィppt

< F2D8EA CE909482CC92EA82852E6A7464>

GUIプログラムⅣ

PowerPoint プレゼンテーション

ガイダンス

Microsoft PowerPoint - 9.pptx

Microsoft PowerPoint - 9.pptx

免許法認定公開講座: コンピュータグラフィックス

pp2018-pp9base

Transcription:

3D 描画 Step3 元素名を 2D 描画する OpenGL には文字描画の概念がないこと 元素名は回転してほしくないことの 2 点の理由から 元素名は 2D 描画する そのために 原子の 3 次元空間の座標から 文字を描画するウィンドウ上の座標を求める < 座標変換について > 座標変換について まとまった詳しい解説は OpenGL による 3D 描画の基礎知識 の 3 ページ以降に記述してあるので 参照のこと y 軸 104.45 z 軸 θ x 軸 ワールド座標系の軸 オブジェクト座標系とワールド座標系 O 原子も H 原子も描画するときは glut.glutsolidsphere(0.2f, div, div); (*) と記述する 引数は順に半径 Z 軸まわりの分割数 Z 軸に沿った分割数で 球の中心座標を設定する引数はない これは 常にこの関数が球の中心を原点として描画するからである この場合の座標系が オブジェクト座標系 となる しかし 図のように実際にワールド座標系で考えれば O 原子の中心座標は (0, 0.4, 0) だし 右側の H 原子は (cosθ, 0.4-sinθ, 0) [ θ=(180-104.45 )/2] である このような位置に描画するためには 描画したい球の中心が原点になるよう事前に gltranslatef や glrotatef で座標変換しておく 例えば O 原子の場合 gl.gltranslatef(0.0f, 0.4f, 0.0f); // y 軸正方向に 0.4 平行移動 θに相当するを実行した後で (*) の球の描画命令を書けばよい また 右側の H 原子は上記の 0.4 の平行移動が利いた状態でさらに以下を実行する gl.glrotatef(-degree, 0.0f, 0.0f, 1.0f); // 座標軸を z 軸周りに-degree 度回転 gl.gltranslatef(1.0f, 0.0f, 0.0f); // x 軸正方向に 1 だけ平行移動 -1-

このような 回転や平行移動による座標変換の情報は ModelView 行列 が持っている ModelView 行列は gl.glpushmatrix() でいったん保存しておき 回転や平行移動を重ねて描画した後 gl.glpopmatrix() で保存した状態に戻すことができる ワールド座標系とウィンドウ座標系 3 次元空間であるワールド座標から 2 次元の表示領域に対する座標をもとめるには Projectioin 行列 を使う この行列は 3D からどのように 2D に投影するかを決めるものである また パネルに対する表示領域を ビューポート といい 4 次元の配列で表現する ビューポート =[ 左下の点の x 座標, y 座標, 幅, 高さ ] オブジェクト座標系からウィンドウ座標系への変換 OpenGL には便利な関数があって glu.gluproject(objx, objy, objz, modelmatrix, 0, projmatrix, 0, viewport, 0, winpos, 0); objx, objy, objz:3d 空間の x 座標 y 座標 z 座標 ( オブジェクト座標系 ) modelmatrix:modelview 行列 projmatrix:projection 行列 viewport: ビューポートを呼び出すと winpos(double の配列 ) にビューポートの左下を原点とする 右 上が正方向の 2 次元ピクセルの単位での座標がはいる つまりオブジェクト座標系からウィンドウ座標系に変換してくれる しかし 描画するにはパネルの左上を原点とした 下向きが正の座標でなければならないので 今回は上記の関数で求めた座標をさらに変換する 下記のソースコードはこの変換部分が空欄になっているので 下図を参考に考えて埋めなさい 描画で必要な座標の原点 viewport[2] viewport[0] ビューポート getheight() viewport[3] glu.gluproject で求まる座標の原点 viewport[1] < 作成手順 > 1. を編集する 2. 実行して元素名 O,H が正常に描画されることを確認する -2-

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 package chemical.water; import java.awt.color; import java.awt.font; import java.awt.graphics; import java.awt.point; import java.awt.event.mouseevent; import java.awt.event.mouselistener; import java.awt.event.mousemotionlistener; import javax.media.opengl.gl; import javax.media.opengl.glautodrawable; import javax.media.opengl.gleventlistener; import javax.media.opengl.gljpanel; import javax.media.opengl.glu.glu; import com.sun.opengl.util.glut; public class WaterPanel extends GLJPanel implements GLEventListener, MouseListener, MouseMotionListener { private GL gl; // OpenGL の関数群をもつオブジェクトその1 private GLU glu; // OpenGL の関数群をもつオブジェクトその2 private GLUT glut; // OpenGL の関数群をもつオブジェクトその3 private int div = 20; // 球 円柱の分割数 // 軸と O-H のなす角 ( 水の O-H がなす角は 104.45 度 ) private float degree = (180-104.45f)/2.0f; private float rotx = 0.0f, roty = 0.0f; // 回転量 private float srotx, sroty; // ドラッグ開始時の回転量 private Point startpoint, endpoint; // ドラッグの開始点と終了点 private boolean defaultflg = true; // true だったら回転量を 0 にする private double[] model = new double[16]; // ModelView 行列 private double[] proj = new double[16]; // Projection 行列 private int[] view = new int[4]; // ビューポート private double[] pointo = new double[3]; // O 原子のウィンドウ座標 private double[] pointh1 = new double[3]; // H 原子 1 のウィンドウ座標 private double[] pointh2 = new double[3]; // H 原子 2 のウィンドウ座標 /* 光 ---------------------------------------------------- // 光の位置 {x 座標, y 座標, z 座標, 光源までの距離 (0 は無限円 ) private float[] lposition = { -10.0f, 10.0f, 10.0f, 0.0f ; // 光の色 {R, G, B, アルファ ( 透明度 ) 数値は 0 から 1 まで private float[] lspecular = { 0.8f, 0.8f, 0.8f, 1.0f ; // 鏡面 private float[] ldiffuse = { 0.8f, 0.8f, 0.8f, 1.0f ; // 拡散 private float[] lambient = { 0.4f, 0.4f, 0.4f, 1.0f ; // 環境 /* 物体の反射率 ------------------------------------------- // {R, G, B, アルファ ( 透明度 ) 数値は 0 から 1 まで private float[] mspecular = { 0.3f, 0.3f, 0.3f, 1.0f ; // 鏡面 private float[] mdiffuse = { 0.2f, 0.2f, 0.2f, 1.0f ; // 拡散 // 鏡面係数 : きらめきの度合い (0~128) private float mshininess = 10.0f; /* 色の定義 ----------------------------------------------- // {R, G, B, アルファ ( 透明度 ) 数値は 0 から 1 まで private float[] blue = { 0.0f, 0.0f, 1.0f, 1.0f ; // 青 private float[] red = { 1.0f, 0.0f, 0.0f, 1.0f ; // 赤 private float[] green = {0.0f, 1.0f, 0.5f, 1.0f ; // 緑 * コンストラクタ -3-

65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 public WaterPanel () { // MouseEvent を受け取れるようにする addmouselistener(this); // MouseMotionEvent を受け取れるようにする addmousemotionlistener(this); // 3D 描画できるようにリスナ登録 addgleventlistener(this); /* 2D 描画 *********************************************************** public void paintcomponent(graphics g) { // 親クラスの paintcomponent 呼び出し super.paintcomponent(g); // フォント設定 Dialog は Windows では MS ゴシック g.setfont(new Font("Dialog", Font.BOLD, 24)); // 白色設定 g.setcolor(color.white); // 文字位置の微調整用 int tune = 8; // 元素名を描画 g.drawstring("o", (int)pointo[0]-tune, (int)pointo[1]+tune); g.drawstring("h", (int)pointh1[0]-tune, (int)pointh1[1]+tune); g.drawstring("h", (int)pointh2[0]-tune, (int)pointh2[1]+tune); /* 3D 描画 *********************************************************** * x 軸周りに円柱を描画 * @param r 円柱の半径 * @param length 円柱の長さ * @param offset offset x offset+length に描かれる public void drawcylinder(float r, float length, float offset) { double t; // 要素として連続する四角形を使う gl.glbegin(gl.gl_quad_strip); for (int i=0; i<=div; i++) { // 角度を計算 ( ラジアン ) t = 2.0 * Math.PI * i / div; // 光の反射の法線ベクトル gl.glnormal3f(0, (float)math.cos(t), (float)math.sin(t)); // 頂点を設定 gl.glvertex3f(offset, (float)(r*math.cos(t)), (float)(r*math.sin(t))); gl.glvertex3f(offset+length, (float)(r*math.cos(t)), (float)(r*math.sin(t))); gl.glend(); * オブジェクト座標から ウィンドウ座標を求める public boolean gluproject(double objx, double objy, double objz, double[] modelmatrix, double[] projmatrix, int[] viewport, double[] winpos ) { /* gluproject:3d 空間のx 座標,y 座標,z 座標,ModelView 行列,Projection 行列, ビューポートを使って * ウィンドウ座標を求める * ただし ビューポート ( 描画領域 ) の左下が原点 y 座標上向き -4-

129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 boolean bl = glu.gluproject(objx, objy, objz, modelmatrix, 0, projmatrix, 0, viewport, 0, winpos, 0); winpos[0] += viewport[0]; // パネルの左上を原点とする y 座標下向きに変換 // viewport の中身は [ 左下の x 座標, y 座標, ビューポート ( 描画領域 ) の幅, 高さ ] winpos[1] = getheight() - viewport[1] - winpos[1]; return bl; * GLEventListener のメソッド :3D 描画メソッド public void display(glautodrawable drawable) { /* deaultflg=true なら最初かリセットボタンが押された状態 * なので 回転量を 0 にするs if (defaultflg) { rotx = 0.0f; roty = 0.0f; defaultflg = false; // 背景色で塗りつぶし gl.glclear(gl.gl_color_buffer_bit GL.GL_DEPTH_BUFFER_BIT); // 現時点のマトリクス (Modelview 行列 ) を保存 必ず glpopmatrix() と対で使用する /* glpushmatrix と glpopmatrix() は 座標を回転したり平行移動したり * したものを する前の状態を覚えておくために使う * これを使わないと 回転などがどんどん重なっていってしまう // z 軸上 15 の位置から原点を見る, 上方向は y 軸 // glulookat( 視点の位置 x,y,z, 視点から見る座標 x,y,z, 上方向ベクトル x,y,z) glu.glulookat(0.0, 0.0, 15.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // マウスの移動量に応じて回転 gl.glrotatef(rotx, 1.0f, 0.0f, 0.0f); gl.glrotatef(roty, 0.0f, 1.0f, 0.0f); // y 軸正方向に少しずらす gl.gltranslatef(0.0f, 0.4f, 0.0f); /* 棒 1 を描画 (z 軸周りに-degree 度回転 )---------- // ModelView 行列保存 // 色指定 // 環境光の反射率とは つまり物体の色になる gl.glmaterialfv(gl.gl_front, GL.GL_AMBIENT, green, 0); // 座標軸を z 軸周りに-degree 度回転 // 2,3,4 番目の引数は回転軸を表す ( 順に x, y, z) gl.glrotatef(-degree, 0.0f, 0.0f, 1.0f); // 半径 0.07 の円柱を 0 x 1 に描画 drawcylinder(0.07f, 1.0f, 0.0f); // 行列を保存した時の状態に戻す /* 棒 2 を描画 (z 軸周りに degree 度回転 )---------- gl.glmaterialfv(gl.gl_front, GL.GL_AMBIENT, green, 0); gl.glrotatef(degree, 0.0f, 0.0f, 1.0f); drawcylinder(0.07f, 1.0f, -1.0f); // -1 x 0 /* O 原子を原点に描画 ------------------------- gl.glmaterialfv(gl.gl_front, GL.GL_AMBIENT, red, 0); // 塗りつぶしの球を描画 // glutsolidsphere( 半径, Z 軸まわりの分割数, Z 軸に沿った分割数 ) glut.glutsolidsphere(0.3, div, div); -5-

193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 // ModelView 行列を取得 gl.glgetdoublev(gl.gl_modelview_matrix, model, 0); // O 原子のウィンドウ座標を取得 gluproject(0.0, 0.0, 0.0, model, proj, view, pointo); // H 原子 1 を描画 ----------------------------- gl.glmaterialfv(gl.gl_front, GL.GL_AMBIENT, blue, 0); gl.glrotatef(-degree, 0.0f, 0.0f, 1.0f); gl.gltranslatef(1.0f, 0.0f, 0.0f); // x 方向に 1 だけ平行移動 glut.glutsolidsphere(0.2, div, div); gl.glgetdoublev(gl.gl_modelview_matrix, model, 0); // ModelView 行列を取得 gluproject(0.0, 0.0, 0.0, model, proj, view, pointh1); // H 原子 2 を描画 ----------------------------- gl.glmaterialfv(gl.gl_front, GL.GL_AMBIENT, blue, 0); gl.glrotatef(degree, 0.0f, 0.0f, 1.0f); gl.gltranslatef(-1.0f, 0.0f, 0.0f); // x 方向に-1 だけ平行移動 glut.glutsolidsphere(0.2, div, div); gl.glgetdoublev(gl.gl_modelview_matrix, model, 0); // ModelView 行列を取得 gluproject(0.0, 0.0, 0.0, model, proj, view, pointh2); // glpushmatrix() を呼ぶ前の行列の状態に戻す * GLEventListener のメソッド : 表示の切り替えが発生した場合に呼ばれる * 今回は特に記述することはない public void displaychanged(glautodrawable drawable, boolean modechanged, boolean devicechanged) { * GLEventListener のメソッド : 初期化時に呼ばれる public void init(glautodrawable drawable) { // OpenGL の関数群をもつオブジェクトを取得 gl = drawable.getgl(); glu = new GLU(); glut = new GLUT(); // 背景色を黒に設定 gl.glclearcolor(0.0f, 0.0f, 0.0f, 0.0f); // 影に隠れて見えないものは表示しない gl.glenable(gl.gl_depth_test); // 光を有効にする gl.glenable(gl.gl_lighting); gl.glenable(gl.gl_light0); // 光の反射の法線ベクトルを正規化 gl.glenable(gl.gl_normalize); // 光の位置を設定 /* 4 番目の数字はオフセット * JOGL は c++ のソースを JAVA に自動変換している * c++ では配列はポインタなので オフセットの概念がある * JAVA にポインタはないので引数が増やされているのだが * オフセットの数字は 0 でよい gl.gllightfv(gl.gl_light0, GL.GL_POSITION, lposition, 0); // 光の色を設定 -6-

257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 gl.gllightfv(gl.gl_light0, GL.GL_SPECULAR, lspecular, 0); // 鏡面 gl.gllightfv(gl.gl_light0, GL.GL_DIFFUSE, ldiffuse, 0); // 拡散 gl.gllightfv(gl.gl_light0, GL.GL_AMBIENT, lambient, 0); // 環境 // 物体の反射率を設定 gl.glmaterialfv(gl.gl_front, GL.GL_SPECULAR, mspecular, 0); // 鏡面 gl.glmaterialfv(gl.gl_front, GL.GL_DIFFUSE, mdiffuse, 0); // 拡散 gl.glmaterialf(gl.gl_front, GL.GL_SHININESS, mshininess); // 鏡面係数 * GLEventListener のメソッド : 表示領域が変更されたときに呼ばれる public void reshape(glautodrawable drawable, int x, int y, int width, int height) { // ビューポート ( 描画領域 ) を設定 gl.glviewport(0, 0, width, height); // マトリクスとして Projection 行列を対象にする gl.glmatrixmode(gl.gl_projection); // マトリクスを単位行列で初期化 gl.glloadidentity(); // 視点の設定 ( 参考資料を参照 ) // gluperspactive( 視野角, 縦横比, near, far); glu.gluperspective(10.0, (double)width/(double)height, 1.0, 100.0); // マトリクスとして ModelView 行列を対象にする gl.glmatrixmode(gl.gl_modelview); // Projection 行列取得 gl.glgetdoublev(gl.gl_projection_matrix, proj, 0); // ビューポート取得 gl.glgetintegerv(gl.gl_viewport, view, 0); /* MouseListener のメソッド ************************************************* public void mouseclicked(mouseevent e) { public void mouseentered(mouseevent e) { public void mouseexited(mouseevent e) { * マウスを押したらスタートポイントに設定 public void mousepressed(mouseevent e) { // マウスを押した場所を取得 startpoint = e.getpoint(); // 現時点での回転量を保存 srotx = rotx; sroty = roty; -7-

321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 public void mousereleased(mouseevent e) { /* MouseMotionListener のメソッド ************************************************ * ドラッグで回転量を計算 public void mousedragged(mouseevent e) { // マウスの場所を取得 endpoint = e.getpoint(); // 回転量を計算 ( パネルの端から端で一回転 ) rotx = srotx + 360.0f*(float)(endPoint.y - startpoint.y)/(float)getwidth(); roty = sroty + 360.0f*(float)(endPoint.x - startpoint.x)/(float)getheight(); // 再描画 repaint(); public void mousemoved(mouseevent e) { /* defaultflg の setter ************************************************************** public void setdefaultflg(boolean defaultflg) { this.defaultflg = defaultflg; -8-