はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 . . . . .. . 第 5 章 CG で使われる変換 畔上 秀幸 名古屋大学 情報科学研究科 複雑系科学専攻 May 8, 2012 . . . . . . 1 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 §5.1 はじめに (目標) CG で使われる幾何変換,投影変換,視野変換の理論と OpenGL を用いた変換方法について理解する. . . . . . . 2 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 §5.2 CG で使われる変換の種類 CG で使われる変換には次の種類がある. 幾何変換 3 次元形状モデルの定義された局所座標系を平行移動,回 転移動,拡大・縮小変形を行う変換(座標変換は幾何変換 の逆向き)を幾何変換 (geometric transformation) という. ⇒ 異なる座標系でモデリングされたパーツを全体座標 系で組み合わせるあるいは分解する際に幾何変換が使わ れる. 投影変換 3 次元形状モデルをディスプレイや印刷面の 2 次元面に投 影する変換を投影変換 (projective transformation) という. ⇒ モデリングされた形状をディスプレイに表示した り,プリンタで印刷する際に投影変換が使われる. 視野変換 視点の位置あるいは投影する方向(視線の方向)を移動・ 回転する変換を視野変換 (viewing transformation) という. ⇒ 実際には 3 次元形状モデルを幾何変換することに なる. . . . . . . 3 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 §5.3 幾何変換 平行移動,回転移動,投影変換を行列で表現するために同次座標を用 いる. . 定義 5.1 (同次座標) . .. T x = (x1 , x2 , · · · , xn ) に対して y1 , w x2 = y2 , w ··· , xn = yn w T が成り立つような y = (y1 , y2 , · · · , yn , w) を x の同次座標 .(homogeneous coordinate) 表現という. .. . . . . . . . x1 = . 4 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 §5.3.1 平行移動 T T 点 x = (x1 , x2 , x3 ) を a = (a1 , a2 , a3 ) だけ平行移動した点 T x′ = (x′1 , x′2 , x′3 ) は ′ ′ x1 x1 1 0 0 a1 x1 x1 + a1 x′2 0 1 0 a2 x2 ′= ′ x3 0 0 1 a3 x3 ∴ x2′ = x2 + a2 x3 x3 + a3 1 0 0 0 1 1 となる.この変換は, y, y ′ を x, x′ の同次座標 (homogeneous coordinate) 表現とするとき y ′ = T (a) y とかける. . . . . . . 5 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 §5.3.2 回転 T 点 x = (x1 , x2 , x3 ) を x1 軸, x2 軸, x3 軸に対して時計回りに T θ1 , θ2 , θ3 だけ回転した点を x′ = (x′1 , x′2 , x′3 ) とするとき x′1 1 0 0 x′2 0 cos θ1 − sin θ1 ′ = x3 0 sin θ1 cos θ1 1 0 0 0 ′ cos θ2 x1 0 sin θ2 x′2 0 1 0 ′ = x3 − sin θ2 0 cos θ2 1 0 0 0 ′ cos θ3 − sin θ3 0 x1 x′2 sin θ3 cos θ3 0 ′ = x3 0 0 1 1 0 0 0 0 x1 0 x2 , 0 x3 1 1 0 x1 0 x2 , 0 x3 1 1 0 x1 0 x2 0 x3 1 1 となる.この変換を y ′ = Ri (θi ) y (i = 1, 2, 3) . . . . . . 6 / 37 はじめに CG で使われる変換の種類 §5.3.2 回転 とかく. (注) ( x′1 x′2 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 (cnt.) ) =r ( ) ( ) cos(α + θ) cos α cos θ − sin α sin θ =r sin(α + θ) cos α cos θ + sin α sin θ ( )( ) cos θ − sin θ x1 =r sin θ cos θ x2 x2 x0 x θ ® x1 x3 図 1: 回転 . . . . . . 7 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 §5.3.3 拡大・縮小 T 点 x = (x1 , x2 , x3 ) を x1 軸, x2 軸, x3 T 点 x′ = (x′1 , x′2 , x′3 ) は ′ b1 0 0 x1 x′2 0 b2 0 ′= x3 0 0 b3 1 0 0 0 軸 に対して b1 , b2 , b3 倍した 0 x1 x2 0 0 x3 1 1 T となる.この変換を,b = (b1 , b2 , b3 ) として y ′ = S (b) y とかく. . . . . . . 8 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 §5.3.4 反転 T 点 x = (x1 , x2 , x3 ) を x1 軸,および原点,に対して反転した点 T x′ = (x′1 , x′2 , x′3 ) は ′ −1 0 0 0 x1 x1 x′2 0 1 0 0 x2 ′= x3 0 0 1 0 x3 z , 1 0 0 0 1 1 ′ x1 −1 0 0 0 x1 x′2 0 −1 0 0 x2 ′= x3 0 0 −1 0 x3 1 0 0 0 1 1 となる.これらの変換は,拡大・縮小の特別な場合とみなせる. . . . . . . 9 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 §5.3.5 任意の軸回りの回転移動 T 点 x = (x1 , x2 , x3 ) を点 x0 = (x01 , x02 , x03 )T を始点とする単位ベク T トル n = (n1 , n2 , n3 ) に対して時計方向に θ だけ回転した点 ′ ′ ′ ′ T x = (x1 , x2 , x3 ) への変換を考えてみよう. x3 x n θ x 0 x2 x1 図 2: 任意の軸回りの回転移動 . . . . . . 10 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く §5.3.5 任意の軸回りの回転移動 .1. .2. まとめ 参考文献 (cnt.) 点 x0 を原点に平行移動する. ( ) y1 = T −x0 y T 単位ベクトル n = (n1 , n2 , n3 ) を x3 軸回りに α だけ回転して x2 − x3 平面内に移動する. n2 n1 y2 = R3 (α) y1 , cos α = √ 2 , sin α = √ 2 2 n1 + n2 n1 + n22 x3 x3 ® n x2 x1 図 3: 点 x0 を原点に平行移動 x2 x1 図 4: n を z 軸回りに α だけ回転 . . . . . . 11 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 §5.3.5 任意の軸回りの回転移動 .3. まとめ 参考文献 (cnt.) n1 を x1 軸回りに β だけ回転して x1 軸と一致させる. y3 = R1 (β) y2 , .4. ティーポットを描く cos β = n3 n2 を x3 軸回りに θ だけ回転する. y4 = R3 (θ) y3 x3 x3 ¯ µ x2 x1 x2 x1 図 5: n1 を x1 軸回りに β だけ 回転 図 6: n2 を x3 軸回りに θ だけ回転 . . . . . . 12 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 §5.3.5 任意の軸回りの回転移動 .5. ティーポットを描く まとめ 参考文献 (cnt.) (3) の逆変換を行う. y5 = R1−1 (β) y4 .6. (2) の逆変換を行う. y6 = R3−1 (α) y5 .7. (1) の逆変換を行う. ( ) y7 = T −1 −x0 y6 したがって, ( ) ( ) y7 = T −1 −x0 R3−1 (α) R1−1 (β) R3 (θ) R1 (β) R3 (α) T −x0 y となる. . . . . . . 13 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 §5.3.6 Euler 角による回転 T 全体座標系 x1 -x2 -x3 の点 x = (x1 , x2 , x3 ) から局所座標系 T x1L -x2L -x3L の点 xL = (x1L , x2L , x3L ) への回転が Euler 角 (α, β, γ) で与えられているとき, yL = R2 (γ) R1 (β) R3 (α) y となる. x3 x3L x2L ¯ x2 x1 ® ° x1L x10 図 7: Euler 角による回転 . . . . . . 14 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 §5.4 投影変換 . . 定義 5.2 (視座標系) . .. 全体座標系 (world coordinate system) x1 -x2 -x3 に対して,視線を x3v 軸とした x1v -x2v -x3v 座標系を視座標系 (viewing coordinate system) と いう.全体座標系は右手系,視座標系は,通常,左手系とする.このと き, x1 = x1v , x2 = x2v となる. . .. . x2=x2v x3 x3v x1=x1v 図 8: 視座標系 . . . . . . 15 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 §5.4 投影変換 (cnt.) . . 定義 5.3 (正規化視座標系) . .. 視座標系の可視領域を正規化した座標系を正規化視座標系 (normalized viewing coordinate system) という. . .. . この座標系は,第 7 章において,隠面/隠線処理に使われる. »3 (1,1,1) »2 ({1,{1,0) »1 図 9: 正規化視座標系 . . . . . . 16 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 §5.4 投影変換 (cnt.) . . 定義 5.4 (透視投影, 平行投影) . .. 投影変換には次の 2 種類がある. .1. 視点を x3v 軸上に置き,x3v 軸に垂直な面に投影する変換を透視投 影 (perspective projection) という. .2. 視点を全体座標系の x3 軸上無限遠方に置き, x3v 軸に垂直な面に 投影する変換を平行投影 (parallel projection) という. . .. . . . . . . . 17 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 §5.4 投影変換 (cnt.) x2=x2v x3v x1=x1v 図 10: 透視投影 y=yv zv ∞ x=xv 図 11: 平行投影 . . . . . . 18 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 §5.4 投影変換 (cnt.) 視点 x3v = 0, 投影面 x3v = d のとき,任意の点 xv から投影点 xd の同次座標表現 y への透視投影は y1d 1 0 0 0 x1v y2d 0 1 0 0 = x2v y3d 0 0 1 0 x31v wd 0 0 1/d 0 1 となる. x2=x2v xd xv x3v x1=x1v x3v=d 図 12: 原点からの透視投影 . . . . . . 19 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 §5.4 投影変換 (cnt.) 視点 x3v = −d, 投影面 x3v = 0 のとき,任意の点 xv から投影点 x0 の同次座標表現 y0 への透視投影は y10 1 0 0 0 x1v y20 0 1 x2v 0 0 = y30 0 0 0 0 x3v w0 0 0 1/d 1 1 となる.d → ∞ のとき,平行投影となる. x2=x2v x0 xv x3v x3v={d x1=x1v 図 13: x3v = −d からの透視投影 . . . . . . 20 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 §5.5 OpenGL における変換 OpenGL では同次座標系の変換行列を使って各種変換を行っている. v0=Pm:::P1An:::A1v v A1 ::: An Point Geometric information transformations P1 ::: Pm Projective transformations Hidden Image surface processing calculation Picture 図 14: 変換行列を使った各種変換 . . . . . . 21 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 §5.5 OpenGL における変換 ティーポットを描く まとめ 参考文献 (cnt.) .1. 変換行列の初期化 . glMatrixMode .. void glMatrixMode(Glenum mode); . 現在対象としている行列を 4x4 の単位行列にする. . .. . . . . . . . . mode に引数 GL MODELVIEW, GL PROJECTION, GL TEXTURE を指 定して,幾何変換,射影変換,テクスチャー行列のどれを操作するか指 .定する. .. . . glLoadIdentity . .. void glLoadIdentity(void); . 22 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 §5.5 OpenGL における変換 ティーポットを描く まとめ 参考文献 (cnt.) . . 変換の例 . .. glMatrixMode(GL_PROJECTION); /*射影変換の設定*/ glLoadIdentity(); /*初期化: P_0 = I*/ gluPerspective(60.0, 1.0, 1.0, 10.0); /*P_1*/ ... glMatrixMode(GL_MODELVIEW); /*幾何変換の設定 */ glLoadIdentity(); /*初期化: A_0 = I*/ glTranslatef(-1.0, 0.0, 0.0); /* x 軸方向移動: A_1*/ glRotatef(-30.0, 0.0, 0.0, 1.0); /* 回転: A_2 */ glutWireTeapot(1.0); /* ティーポットを描画: v’=P_1A_2A_1v */ ... . .. . . . . . . . 23 / 37 CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 §5.5 OpenGL における変換 ティーポットを描く まとめ 参考文献 (cnt.) .2. OpenGL における平行投影変換 . glOrtho() .. void glOrtho(Gldouble left, Gldouble right, Gldouble bottom, Gldouble top, Gldouble near, Gldouble far); . 図 . 15 のとおり. .. . . はじめに x2=x2v left top near far x3v ∞ bottom x1=x1v right 図 15: OpenGL における平行投影変換 . . . . . . 24 / 37 CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 §5.5 OpenGL における変換 ティーポットを描く まとめ 参考文献 (cnt.) .3. OpenGL における透視投影変換 . gluPerspective() .. void gluPerspective(GLdouble fovy, Gldouble aspect, GLdouble near, Gldouble far) . 図 . 16 のとおり. .. . x2=x2v aspect=w=h w h . はじめに near far x3v fovy x1=x1v 図 16: OpenGL における透視投影変換 . . . . . . 25 / 37 CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 §5.5 OpenGL における変換 ティーポットを描く まとめ 参考文献 (cnt.) .4. 視点の設定 . gluLookAt() .. void gluLookAt(GLdouble e1, GLdouble e2, GLdouble e3, GLdouble c1, GLdouble c2, GLdouble c3, GLdouble u1, GLdouble u2, GLdouble u3) . 図 17 のとおり.ただし, u1, u2, u3 は,ウィンドウに表示される画像 .の上の方向を示す. .. . . はじめに x2=x2v (c1,c2,c3)T with x3-axis T (e1,e2,e3) with x3-axis x3 x3v (u1,u2,u3)T with x3-axis x1=x1v 図 17: OpenGL における視点の設定 . . . . . . 26 / 37 CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 §5.5 OpenGL における変換 ティーポットを描く まとめ 参考文献 (cnt.) .5. 平行移動 . glTranslatef() .. void glTranslatef(GLfloat x1, GLfloat x1, GLfloat x3) . 局所座標系を x1 , x2 , x3 軸に x1, x2, x3 だけ移動する. . .. .6. 回転 . glRotatef() .. void glRotatef(GLfloat angle, GLfloat x1, GLfloat x2, GLfloat x3) . . はじめに . • angle は度数で指定する.例えば,x1 -x2 平面で 60 度左に回転する場合 glRotatef(60.0, 0.0, 0.0, 1.0) とかく. . . . . . . . . .. . 27 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 §5.5 OpenGL における変換 ティーポットを描く まとめ 参考文献 (cnt.) .7. 拡大・縮小 . glScalef() .. void glScalef(GLfloat x1, GLfloat x2y, GLfloat x3) . 図 . 18 のとおり. .. . glPopMatrix .. void glPopMatrix() . . . . . . . . 図 . 18 のとおり. .. . . . 各軸方向へ指定された値で伸縮させる.例えば,x1 , x2 方向に半分の大 きさにする場合 glScalef(0.5, 0.5, 1.0) とかく. . .. . .8. 変換行列の保存と呼出し . glPushMatrix . .. void glPushMatrix() . 28 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 §5.5 OpenGL における変換 push stack I A 2A 1 まとめ 参考文献 (cnt.) push pop A 3A 2A 1 ティーポットを描く A 2A 1 pop A2A1 A5:::A1 A 2A 1 A2A1 glScalef() glLoadIdentity() glScalef() glTranslatef() draw¡quad() glTranslatef() glScalef() glRotatef() draw¡tri() 図 18: OpenGL における変換行列の保存と呼出し . . . . . . 29 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 §5.6 ティーポットを描く ティーポットを平行投影変換で描く. . program5 1.c .. int main(int argc, char **argv) ... glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); trackball(quat , 0.0, 0.0, 0.0, 0.0); ... void display(void) ... /* ティーポットを描画 */ glColor3f(1.0, 1.0, 1.0); glutWireTeapot(0.4); ... . .. . . . . . . . . . 30 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . §5.6 ティーポットを描く OpenGL における変換 ティーポットを描く まとめ 参考文献 (cnt.) このプログラムから trackball.h, trackball.c を使う. マウスのための関数 . glutMouseFunc() .. void glutMouseFunc(void (*func)(int button, int state, int x1, int x2)) . • func にはマウスのボタンが押されたときに実行する関数のポイン タを与える. . .. GLUT MIDDLE BUTTON, GLUT RIGHT BUTTON),state には 押した (GLUT DOWN) のか離した (GLUT UP) のか,x と y には その位置が渡される. . . . . . . . • button には押されたボタン (GLUT LEFT BUTTON, . 31 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . §5.6 ティーポットを描く OpenGL における変換 ティーポットを描く まとめ 参考文献 (cnt.) . glutMotionFunc() .. void glutMotionFunc(void (*func)(int x1, int x2)) . • func には,マウスのいずれかのボタンを押しながらマウスを動か したときに実行する関数のポインタを与える. • x1 と x2 には、現在のマウスの位置が渡される. 等の中で定義されている記号定数 NULL を使用しても良い). . ダブルバッファリング(ちらつきの原因となる画像の作成過程をみせ ないために,2つのバッファを用いて表示画面を交換すること)のため に次の関数が用意されている. . • 設定を解除するには引数に 0(ヌルポインタ)を指定する(stdio.h . .. • glutInitDisplayMode(GLUT DOUBLE) を指定する. • glFlush() の代りに glutSwapBuffers() を使用する. . . . . . . 32 / 37 CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . §5.6 ティーポットを描く OpenGL における変換 ティーポットを描く まとめ 参考文献 (cnt.) ティーポットを透視投影変換で描く. . program5 2.c .. int main(int argc, char **argv) ... gluPerspective(70.0, 1.0, 1.0, 10.0); ... void display(void) ... /* ティーポットを描画 */ glColor3f(1.0, 1.0, 1.0); glutWireTeapot(1.0); ... . .. . . . . . . . . はじめに . 33 / 37 CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . §5.6 ティーポットを描く OpenGL における変換 ティーポットを描く まとめ 参考文献 (cnt.) ティーポットと水滴を図のように移動する. . program5 3.c .. ... void display(void) ... // glPushMatrix(); // glTranslatef(0.0, 0.0, 0.0);/* x1 軸方向移動 */ // glRotatef(0.0, 0.0, 0.0, 1.0);/* 回転 */ glColor3f(1.0, 1.0, 1.0);/* 色指定 */ glutWireTeapot(1.0);/* ティーポットを描画 */ // glPopMatrix(); ... . .. . . . . . . . . はじめに . 34 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . §5.6 ティーポットを描く OpenGL における変換 ティーポットを描く まとめ 参考文献 (cnt.) 図 19: ティーポットと水滴 . . . . . . 35 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 §5.7 まとめ CG で使われる幾何変換,投影変換,視野変換の理論と OpenGL を用 いた変換方法についてみてきた. .1. 幾何変換,投影変換,視野変換では同次座標表現が用いられる. .2. 平行移動,回転移動,拡大・縮小,反転移動はそれぞれ同次座標表 現の変換行列で与えられる.一連の変換は,変換行列の積で与えら れる. .3. OpenGL における平行投影変換,透視投影変換,視点の設定,幾何 変換の関数について学んだ. . . . . . . 36 / 37 はじめに CG で使われる変換の種類 幾何変換 投影変換 . . . . . . . . . . OpenGL における変換 ティーポットを描く まとめ 参考文献 参考文献 [1] 嘉数侑昇, 古川正志. CAD/CAM/CG のための形状処理工学入門. 森北出版, 1995. [2] James D. Foley, Steven K. Feiner, Andries van Dam, John F. Hughes, 佐藤 義雄 (訳). コンピュータグラフィックス 理論と実践. オーム社, 2001. [3] 千葉則茂, 土井章男. 3次元 CG の基礎と応用. サイエンス社,, 2004. [4] OpenGL 公式サイト. http://www.opengl.org/. [5] 床井浩平. GLUT による「手抜き」OpenGL 入門. http://www.wakayama-u.ac.jp/˜tokoi/opengl/libglut.html. . . . . . . 37 / 37
© Copyright 2024 ExpyDoc