Comments
Description
Transcript
1.3 2次元図形の描画 1.3.1図形の描画方法 点、線、多角形平面
Ⅱ- 1 1.3 2次元図形の描画 1.3.1図形の描画方法 点、線、多角形平面(ポリゴン)の描画方法 glBegin(図形描画種類の指定); ←セミコロンを忘れずに glVertex3f(x0,y0,z0); V1 V0 glVertex3f(x1,y1,z1); V2 ・・・ V4 glVertex3f(xn,yn,zn); V3 glEnd( ); GL_LINE_LOOP glVertex3f(x,y,z); は図形の頂点のxyz座標を設定する関数で, glBegin行とglEnd行の間に全ての頂点を記述する. glBegin(GL_POINTS); 点を生成する. glBegin(GL_LINES); 頂点を2つずつ結んでできる直線を生成する. glBegin(GL_POLYGON);頂点を結んでできる塗りつぶした多角形平面を生成する. Ⅱ- 2 OpenGLの基本図形(I) V1 V1 V0 V2 V4 V2 V4 V3 V3 GL_POINTS V1 GL_LINES V1 V0 V2 V0 V4 V3 GL_LINE_STRIP V0 V2 V4 V3 GL_LINE_LOOP glBegin(図形描画種 類の指定); glVertex3f(x0,y0,z0); glVertex3f(x1,y1,z1); ・・・ glVertex3f(xn,yn,zn); glEnd( ); Vn(xn,yn,zn) Ⅱ- 3 OpenGLの基本図形(II) V3 V1 V0 V2 V2 V4 V1 V4 V3 V0 GL_POLYGON GL_TRIANGLE_FAN V2 V2 V0 V1 V3 V4 V5 GL_TRIANGLE_STRIP V2 V0 V1 V3 V4 V5 GL_QUAD_LOOP V6 V7 Ⅱ- 4 プログラムc1-2.cを各自の01フォルダにコピーし,コンパ イル・実行して動作を確認する(ウィンドウの中央に白色 で塗りつぶされた四角形を描くプログラム).c1-2.pdf 実行! y (-1,1,0) x y 1 z 0.5 -0.5 0.5 -1 -1 -0.5 1x スクリーン座標系 (ウィンドウ) (1,-1,0) ワールド座標系 (コンピュータ内部) Ⅱ- 5 練習問題1-2: 1)プログラムc1-2.cをコピーして,図形の頂点ごとにつぎの順番で異なる色を 表示できるように修正する(プログラム名はp1-2-1.cとする). 赤、黄色、緑、青 色の指定:glColor3f(R,G,B); をglVertex3fの直前に呼ぶ (R,G,Bは0.0~1.0の実数) 2)幅2ドットと8ドットの線分を描け (プログラム名はp1-2-22.c,p1-2-28.cとする) glLineWidth(float width)をglBeginより前に呼ぶこと(widthは線分のドット数) 3)3角形,4角形,5角形ポリゴンを描け プログラム名はp1-2-33.c,p1-2-34.c,p1-2-35.cとする) ヒント:正多角形とする場合その頂点は次式で計算できる(PAI2=2π=2*3.14…) 半径 r 角数 pnum x0=r*cos(PAI2*((double)i)/((double)pnum)); y0=r*sin(PAI2*((double)i)/((double)pnum)); x1=r*cos(PAI2*((double)(i+1))/((double)pnum)); y1=r*sin(PAI2*((double)(i+1))/((double)pnum)); 解答例1 2 3 Ⅱ- 6 OpenGLの関数名規則 gl Vertex 3f ( x, y, z) 接頭語:ライブラリの種類を表わす.小文字. GL,GLU,GLUTのそれぞれ に応じて gl,glu,glut コマンド名:処理内容を反映した名前がつけられる.大文字ではじまる 接尾語:数字とアルファベットからなる.数字は引数の数,アルファベットは引 数の型. f: float d: double i: int(long) s: int(short) v:vectorは引数に配列を指定する場合に用いる. 上記の例では,GLの関数で,頂点に関する処理を行ない,float型引数を3 個持つ. glColor3f(R,G,B):図形を描画する前に,赤,緑,青の濃度を 0.0~1.0で設定する( 0-255ではないので注意). Ⅱ- 7 3次元図形の描画と隠面処理 2. 2.1. ワールド座標系と投影法 右手系、左手系:x軸、y軸に対し、z軸の正の方向をどちらにとるかは2とおりある。 y軸 z軸 0 z軸 右手系:x軸をy軸に重ねるように時計方 向に回転したとき(この図では向こう側か らみたとき)、右ネジが進む方向にz軸の 正の方向がとられる場合(手前)右手系と 呼ぶ。通常は右手系がとられる。 右 x軸 Ⅱ- 8 ポリゴンの頂点の順番と表面の定義 頂点の順番によって、面の表裏が決められている。 図(教科書1.9)に示すように、頂点の順番に右ネジを回した とき、ネジが進む方向の面を表面と定義するのが一般的 正方向 V1 V2 V0 V3 Ⅱ- 9 投影法: ワールド座標系で表わされた3次元物体を2次元スクリーン座標系に映すことを投影 と呼ぶ。 A A A’ A’ B B B’ B’ 投影面 (スクリーン) 平行投影: 投影面 (スクリーン) 投影中心 透視投影: 平行投影:物体の寸法を正確に表わすことができる。 透視投影(中心投影):視覚系と同様に遠近感がでて現実に 近い画像が生成される Ⅱ-10 平行投影: 透視投影: Ⅱ-11 視点と物体との距 離が近い場合物 体の奥行きに応じ て投影面(図中の 半透明緑面) との 交点の位置は異 なるが、視点が遠 い場合にはほと んど影響しなくな る. 投影面(視野面) 透視投影 (中心投影) 視線(投影線) 視点(投影中心) 平行投影 投影方向 ∞ 無限遠 Ⅱ- 三角柱を真横から見たとき、近くでは見る 位置(A,B)を変えると形状が変わって見え るが、遠くから見るとほとんど変化しない。 (A) (B) (A) (B) (∞) (∞) Ⅱ-13 ワールド座標系:コンピュータ内部の3次元座標系 スクリーン座標系:ディスプレイ上の2次元平面の座標系 後方クリップ面 (1)ローカル座標系:各物体単位で記述 (2)ワールド座標系:全ての物体を1まとめにして記述 (1) (3)視野参照座標系:どの位置から見るか (0,0,1) (4)クリッピング:どの部分を切り取るか (5)ビューポート変換:表示装置 のWindowのどこに表示させるか (5,10,20) (1,0,0) (2) (3) 投影面2 (4) 投影面1 前方クリップ面 (4) (3) 767 (5) デバイス座標系 視野座標系投影面 0 1023 Ⅱ-14 投影法の設定とビューボリューム:この範囲しか表示されない 平行投影のビューボリューム y top= y2 x left =x1 視点の 方向 x right= x2 z near = z1 y bottom =y1 z far= z2 このあたりに図形を書い ても表示されない glOrtho( xleft ,xright ,ybottom ,ytop ,znear ,zfar); Ⅱ-15 透視投影のビューボリューム w aspect = h w 視点 (投影中心) h fovy z near z far gluPerspective(fovy,aspect,znear,zfar); fovy:ビューボリューム(四角錐台)の上下の開き角 aspect:断面の幅/高さの比 znear,zfar:視点から頂面までと底面までの距離(座標値ではない) Ⅱ-16 透視投影によるポリゴン描画p24: 実行! 1)c2-1.cをコピーして実行する(pdf). 実行結果 実行! 2)gluPerspective(60.0,aspect,1.0,7.0);を glOrtho(0.0,5.0,0.0,5.0,1.0,7.0);に変更して実行 3) glOrtho(0.0,5.0,0.0,5.0,0.0,7.0);で実行 4) glOrtho(-5.0,5.0,-5.0,5.0,0.0,7.0); Ⅱ-17 2.3 幾何変換 ワールド座標空間=物体を置く空間=で物体の位置や姿勢を 変えたり寸法を拡大・縮小する操作 平行移動: glTranslatef(tx,ty,tz) 回転: glRotatef(angle,tx,ty,tz)((tx,ty,tz)軸周りにangle度回転) 拡大・縮小: glScalef(tx,ty,tz) 普通の考え方では 物体を作ってからそれを回転させる,あるいは回転した絵を最 初から書く (この人は特別としてhttp://karapaia.livedoor.biz/archives/52117877.html) が、 OpenGLでは座標系を回転させてから書く(書き手が回転して 書くイメージ)。 Ⅱ-18 練習問題2-1(p27 2.3.2): (1)C2-1.cにおいて,以下の幾何変換を実行せよ. ・x方向へ0.2,y方向へ0.1,z方向へ0.2平行移動 ・y軸方向に30度回転 ・z方向に2倍,y方向に0.5倍拡大 (2)前回使用したc2-1.cにおいて,図形をy軸周りに30度回転させ,c2-1.cと比較 (3)c2-1.cにおいてビューボリュームの形を変えて(glPerspectiveの引数を変える) 結果を確認せよ. ファイル名はp2-1-1a.c, p2-1-1b.c, p2-1-1c.c, p2-1-2.c, p2-1-3.cとする 解答例 1a 1b 1c 2 3