Augus 5, 009
10 B 3. ( ) (3)
( ) 1 OpenGL CG 1 C OpenGL 3 CG 4 OpenGL 1.
1 OpenGL CG
1 C
1.1 I C [1] es.c C es.obj es.exe *.lib *.obj
C 1. C I C #include < > in main( ) { reurn 0; } { reurn ; }
Hellow World 1.3 Hellow World I Hellow World program 1.c #include <sdio.h> in main(void) { prinf("hellow World!\n"); reurn(0); }
C 1.4 C I char (1bye), shor in or shor (bye), in, long in or long (4bye) unsigned char (1bye), unsigned shor in (bye),unsigned in (4bye), unsigned long in (4bye) enum floa (4bye), doubl (8bye), long double ( 80bi)
C program.c #include <sdio.h> in main(void) { in a; floa b; double c; a = 1; b = 1.5; /* 1.5F */ c = 500.4; /* 5.004E */ prinf("a = %d\n", a); prinf("b = %f\n", b); prinf("c = %e\n", c); reurn(0); }
in 1.5 in I program 3.c #include <sdio.h> #include <mah.h> #include <limis.h> #include <floa.h> in main(void) { /* in ( +3767) */ prinf("int_max = %u\n", INT_MAX); /* floa ( 1E+37 ) */ prinf("flt_max = %e\n", FLT_MAX); /* double ( 1E+37 ) */ prinf("dbl_max = %e\n", DBL_MAX); reurn(0); }
1.6 I (#define ) sin program 4.c #include <sdio.h> #include <mah.h> #define PI (3.141596535897933846) double deg_sin(double deg); void func(void); in main(void){ program_4.c }
OpenGL
OpenGL I 3 [, 3, 4] CAD CG UNIX OS Windows Macinosh
GLUT OpenGL.1 OpenGL I GLUT (OpenGL Uiliy Tooli) OpenGL OpenGL OpenGL GLU GL
OpenGL GLUT I GLUT GUI Tooli
program3 1.c. I void gluini(in *argc, char **argv) GLUT main. in glucreaewindow(char *name). name void gludisplayfunc(void (*func)(void)),, func. void glumainloop(void),.
.3 I program3.c void gluinidisplaymode(unsigned in mode) mode GLUT RGBA: RGB (,,, ) GLUT INDEX: ON / OFF void gluiniwindowsie(in w, in h) void gluiniwindowposiion(in x, in y)
void glclearcolor(glclampf R, GLclampf G, GLclampf B, GLclampf A) R G B A,,, α GLclampf (floa ) 0 1 (0, 0, 0), (1, 1, 1) void glclear(glbifield mas) mas ( ) GL COLOR BUFFER BIT: GL DEPTH BUFFER BIT:, glflush(void) OpenGL void glbegin(glnum mode) void glend(void) mode
glbegin( ) mode GL POINTS: GL LINES: GL LINE STRIP: GL LINE LOOP: v0 v0 v0 v v v v3 v3 v3 v1 v1 v1 GL LINES GL LINE STRIP GL LINE LOOP
glbegin( ) mode ( ) GL TRIANGLES / GL QUADS: 3 4 GL TRIANGLE STRIP / GL QUAD STRIP: GL TRIANGLE FAN: GL POLYGON: v5 v0 v3 v4 v v1 GL TRIANGLES v4 v3 v4 v v3 v0 v1 GL TRIANGLE STRIP v4 v3 v0 v v0 v v1 GL TRIANGLE FAN v1 GL POLYGON
void glverexf(glfloa x, GLfloa y) GLfloa (floa ) 3, 4 (x,y,), (x,y,,w) glverex3f (), glverex4f () double glverex?d(), in glverex?i() void glverex??v() void glcolor3f(glfloa r, GLfloa g, GLfloa b) r, g, b,, 0 1 r, g, b, a void glcolor4f( ) double glcolor?d( ), in glcolor?i( )
.4 I program3 3.c in rand(void): 0 RAND MAX srand() rand() RAND MAX in 1.0 0
I (ani-aliasing) glblendfunc(gl SRC ALPHA, GL ONE MINUS SRC ALPHA); glenable(gl BLEND);
glenable(gl POINT SMOOTH) glenable(gl LINE SMOOTH) glenable(gl POLYGON SMOOTH) glhin(gl POINT SMOOTH HINT, GL FASTEST); glhin(gl LINE SMOOTH HINT, GL FASTEST); glhin(gl POLYGON SMOOTH HINT, GL FASTEST); glhin(gl POINT SMOOTH HINT, GL NICEST); glhin(gl LINE SMOOTH HINT, GL NICEST); glhin(gl POLYGON SMOOTH HINT, GL NICEST);
.5 I program3 4.c lengh /=.0; /* */ if(lengh > 0.01){ draw_gase(x0, y0, lengh); draw_gase(mid_poin(x0, x1), mid_poin(y0, y1), lengh); draw_gase(mid_poin(x, x0), mid_poin(y, y0), lengh); }
3 CG
CG ( ) 3 (geomeric ransformaion) ( ) ( ) 3 (projecive ransformaion) ( )
( ) (viewing ransformaion) ( ) 3
3.1 ( ) n P = (x 1, x,, x n ) T (( ) T ) n + 1 ˆP = (X 1, X,, X n, W) T (homogeneous coordinae) x 1 = X 1 W, x = X W,, x n = X n W ( )
P = (x, y, ) T a = (a 1, a, a 3 ) T P = (x, y, ) T x 1 0 0 a 1 x y 0 1 0 a = y 0 0 1 a 3 1 0 0 0 1 1 x y x + a 1 = y + a + a 3 ˆP = T(a) ˆP
P = (x, y, ) T x, y, θ 1, θ, θ 3 P = (x, y, ) T x 1 0 0 0 x y 0 cos θ = 1 sin θ 1 0 y, 0 sin θ 1 cos θ 1 0 1 0 0 0 1 1 ˆP = R i (θ i ) ˆP (i = 1,, 3) x cos θ 0 sin θ 0 x y 0 1 0 0 y = sin θ 0 cos θ 0 1 0 0 0 1 1 x cos θ 3 sin θ 3 0 0 x y sin θ = 3 cos θ 3 0 0 y 0 0 1 0 1 0 0 0 1 1
( ) ( x y ) = r ( ) cos(α + θ) = r sin(α + θ) ( ) cos α cos θ sin α sin θ = cos α cos θ + sin α sin θ ( ) ( cos θ sin θ x sin θ cos θ y) y P P θ α x
P = (x, y, ) T x, y, b 1, b, b 3 P = (x, y, ) T x b 1 0 0 0 x y 0 b = 0 0 y 0 0 b 3 0 1 0 0 0 1 1 b = (b 1, b, b 3 ) T ˆP = S(b) ˆP
P = (x, y, ) T x P = (x, y, ) T x 1 0 0 0 x y 0 1 0 0 y =, 0 0 1 0 1 0 0 0 1 1 x 1 0 0 0 x y 0 1 0 0 y = 0 0 1 0 1 0 0 0 1 1
P = (x, y, ) T Q = (x 0, y 0, 0 ) T n = (n 1, n, n 3 ) T θ P = (x, y, ) T θ P P n x y
. C OpenGL CG OpenGL 1 Q. ˆP 1 = T( Q) ˆP n = (n 1, n, n 3 ) T α y ˆP = R 3 (α) ˆP 1, cos α = n, sin α = n 1 + n n 1 n 1 + n α x n y x y
. 3 n 1 x β x ˆP 3 = R 1 (β) ˆP, cos β = n 3 4 n θ. ˆP 4 = R 3 (θ) ˆP 3 β x y θ y
. 5 (3) ˆP 5 = R 1 1 (β) ˆP 4. 6 () 7 (1) ˆP 6 = R 1 3 (α) ˆP 5 ˆP 7 = T 1 ( Q) ˆP 6. ˆP 7 = T 1 ( Q)R 1 3 (α)r 1 1 (β)r 3(θ)R 1 (β)r 3 (α)t( Q) ˆP
Euler x y x L y L L Euler (α, β, γ) P L = (x L, y L, L ) T P = (x, y, ) T ˆP = R ( γ)r 1 ( β)r 3 ( α) ˆP L β y L x α γ x L y x
3. ( ) (world coordinae sysem) x y v x v y v v (viewing coordinae sysem) x = x v, y = y v y=y v v x=x v
. (, ) 1 v v (perspecive projecion) v (parallel projecion). y=y v v x=x v y=y v v x=x v
透視投影変換 透視投影変換では視点と投影面の位置を違えた つの変換が使われる. 視点 v =0, 投影面 v =d ( 通常こちらが使われる ) y v v = d ( x, y, ) ( x, y, ) d d d v v v x v v 視点 v = d, 投影面 v =0 (d のとき平行投影変換となる ) y v x, y, x, y, ( ) 0 0 0 ( ) v v v v = d x v v 1
透視投影変換 視点 v =0, 投影面 v =d のとき 点 (x v,y v, v ) と投影点 (x d,y d, d ) の関係は次式となる. xd xv yd yv xv yv =, =, d = d xd =, yd =, d = d d d d d v v v v y v v = d ( x, y, ) ( x, y, ) d d d v v v v x v
透視投影変換 (con.) 視点 v =0, 投影面 v =d のとき (con.) これらの関係を同次座標で表せば次式となる. X d 1 0 0 0 xv Y 0 1 0 0 d y v = Zd 0 0 1 0 v Wd 0 0 1 d 0 1 xv Xd xv v d xd 実際, 次のようになる. Y d y v xv = yd = Zd v v d d Wd v d d 3
透視投影変換 (con.) 視点 v = d, 投影面 v =0 のとき 点 (x v,y v, v ) と投影点 (x 0,y 0, 0 ) の関係は次式となる. x x y y x y =, =, = 0 x =, y =, d = 0 d d d d d d 0 v 0 v v v 0 0 0 v + v + 1+ v 1+ v y v ( x, y, ) 0 0 0 ( x, y, ) v v v v = d x v v 4
透視投影変換 (con.) 視点 v = d, 投影面 v =0 のとき (con.) これらの関係を同次座標で表せば次式となる. X 0 1 0 0 0 xv Y 0 0 1 0 0 y v = Z0 0 0 0 0 v W0 0 0 1 d 1 1 xv X0 xv 1+ v d 実際, 次のようになる. x0 Y 0 y v xv = y0 = Z0 0 1 v d + 0 W0 1 v d + 0 d のとき 平行投影変換となる. 5
OpenGL の変換 コンピュータで実行される変換の順番 OpenGL では同次座標系の変換行列 (4 4) を使って各種変換を行っている. 点情報 A 1 A 幾何変換 A n P 1 投影変換 P 陰線処理画像変換画像 v v = P PA A Av 1 n 1 10
OpenGL の変換 (con.) void glmarixmode(glenum mode) mode に引数 GL_MODELVIEW, GL_PROJECTION, GL_TEXTURE を指定して, 幾何変換, 射影変換, テクスチャー行列のどれを操作するか指定する. void glloadideniy(void) 現在対象としている行列を 4x4 の単位行列にする. 例えば glmarixmode(gl_projection); /* 射影変換の設定 */ glloadideniy(); /* 初期化 */ P = I 0 gluperspecive(60.0, 1.0, 1.0, 10.0); P 1 glmarixmode(gl_modelview); /* 幾何変換の設定 */ glloadideniy(); /* 初期化 */ gltranslaef(-1.0, 0.0, 0.0);/* x 軸方向移動 */ glroaef(-30.0, 0.0, 0.0, 1.0);/* 回転 */ gluwireteapo(1.0);/* ティーポットを描画 */ A = I 0 A1 A = v PA Av 1 1 11
OpenGL による平行投影変換 void glorho(gldouble lef, Gldouble righ, Gldouble boom, Gldouble op, Gldouble near, Gldouble far) y = y v op lef righ v 視点は無限遠方 boom near ( v 軸 ) x= x v far ( v 軸 ) 1
OpenGL による透視投影変換 void gluperspecive(gldouble fovy, Gldouble aspec, GLdouble near, Gldouble far) y = y v aspec=w/h fovy w h v 視点は原点 x= x v near ( v 軸 ) far ( v 軸 ) 13
視点の位置 void glulooa(gldouble ex, GLdouble ey, GLdouble e, GLdouble cx, GLdouble cy, GLdouble c, GLdouble ux, GLdouble uy, GLdouble u) ux, uy, u は ウィンドウに表示される画像の上の方向を示す. y = y v (ex, ey, e) ( 軸 ) (cx, cy, c) ( 軸 ) v x= x v 14
OpenGL の幾何変換 平行移動 void gltranslaef(glfloa x, GLfloa y, GLfloa ) 局所座標系を x, y, 軸に x, y, だけ移動する. 回転 void glroaef(glfloa angle, GLfloa x, GLfloa y, GLfloa ) angle は度数で指定する. 例えば,X-Y 平面で 60 度左に回転する場合 glroaef(60.0, 0.0, 0.0, 1.0); 伸縮 void glscalef(glfloa x, GLfloa y, GLfloa ) 各軸方向へ指定された値で伸縮させる. 例えば,X,Y 方向に半分の大きさにする場合 glscalef(0.5, 0.5, 1.0) 15
OpenGL の幾何変換 (con.) glpushmarix(), glpopmarix() 変換行列を保存する. スタック Push Pop Push Pop I A A 1 A 3 A A 1 A A 1 A 5 A 4 A A 1 A A 1 A A 1 A A 1 glloadideniy() glscalef() gltranslaef() glscalef() draw_quad() gltranslaef() glscalef() glroaef() draw_ri() 16
Program5_1.c ティーポットを平行投影変換で描く 17
Program5_1.c(con.) これ以降 racball.c, racball.h を利用する. glumousefunc(void (*func)(in buon, in sae, in x, in y)) func にはマウスのボタンが押されたときに実行する関数のポインタを与える. buon には押されたボタン (GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, GLUT_RIGHT_BUTTON), sae には押した (GLUT_DOWN) のか離した (GLUT_UP) のか,x と y にはその位置が渡される. glumoionfunc(void (*func)(in x, in y)) func には, マウスのいずれかのボタンを押しながらマウスを動かしたときに実行する関数のポインタを与える. x と y には 現在のマウスの位置が渡される. 設定を解除するには引数に 0( ヌルポインタ ) を指定する (sdio.h 等の中で定義されている記号定数 NULL を使用しても良い ). 18
ダブルバッファリング ダブルバッファリング gluinidisplaymode(glut_double) を指定して glflush() の代りに gluswapbuffers() を使用する. in gluswapbuffers(void) ダブルバッファリングのつのバッファを交換することでちらつきを防ぐ. ディスプレイのリフレッシュレートが 60H であれば, バッファの交換は 1/60 秒ごとに行われる. 19
Program5_.c ティーポットを透視投影変換で描く 0
Program5_3.c ティーポットと水滴を下図のように移動する. 1
4 OpenGL
OpenGL ( ) (animaion) 1 (+1 ) D.
1 8 10 4 / 30 / 8 1 / CG 4 30 /
program8_1.c, program8_.c ティーポットを回転させる. void gluidlefunc(void (*func)(void)) 入力イベントがない場合, 引数 func ( 関数のポインタ ) で指定した関数を実行する. 1
program8_3.c 回転するドーナツとティーポットのウォークスルーアニメーション
一般化座標表現 一般化座標 q ( r ) = x x ( r ) G1 ( r ) G ( r ) 拘束条件 ( q) θ Φ = 0 Φ 1 11 : R R 一般化外力 P ( L (( 0,T ))) 1 1 3 ( H (( 0,T ))) ( r = 1,,,4) ( 1) Ω Q x q = ( 4), q = q q () 1 ( 4) Q { ( (( ))) ( ) ( ) } 1 1 q H 0,T q 0 = 0, q 0 = 0 Ω ( 1) q ( 4) ( ) Ω x 1 ( ) q ( 3) q ( 3) Ω P
拘束条件 詳細 ( ) Φ q x x = ( 4) ( 1,4) ( 1) ( 4) ( 1,4) ( 1) () 1 ( 1,) () 1 ( ) (,1) ( ) G1 cosθ () 1 ( 1,) () 1 ( ) (,1) ( ) G + l + l x x x x G1 G sinθ ( ) (,3) ( ) ( 3) G1 cosθ ( ) (,3) ( ) ( 3) G + l + l + l + l sinθ θ θ cosθ x x x x ( 3) G ( 3) ( 4) G1 x ( 4) G ( 4) G1 1 G 1 sinθ x x + l + l G1 G x x G1 G cosθ sinθ l l ( 1,4) ( 1, ) ( 4) q ( ),1 l ( 1) q ( ) (,3) l q ( 3) q
制約付変分原理 作用積分の停留化問題 (Hamilon の原理 ) に拘束条件を加えた制約付停留化問題 saionalie q Q, λ R T q T 1 = q Mq d, 0 U 最適性の条件 L q + εδq, λ + εδλ T δl( q, λ) = lim = ε 0 ε 0 T Mq P Φ λ = 0, Φ = 0 拘束条件の時間微分 11 { L( q, λ) = T ( q ) U ( q) λ Φ} ( ) ( q) = T 0 P q d ( ) T ( Mq P Φ λ ) q q δq d Φ Φ Φ Φ Φ d Φ Φ Φ, T T T d q q d q qi qj d + Φ δλ = q + = q = 0 = 0 = q + qq = 0 i j
微分代数方程式 最適性の条件と拘束条件の時間 階微分より微分代数方程式 (DAE: differenial-algebraic equaions) を得る. T M Φ q q P = 0 Φq λ γ M = diag,,,,,, Φ Φ () 1 () 1 () 1 ( 4) ( 4) ( 4) ( m m I m m I ) Φq =, γ = qq T i j q qi qj q = AP Bq A= M M ( M ) M 1 T 1 T = T B M Φq ΦqM Φq Φ T qq q 1 1 T 1 T 1 1 Φq Φq Φq Φq 1 ( ) ( )
微分代数方程式 (con.) 詳細 ( ) ( ) ( ) () ( ) () () ( ) () ( ) ( ) ( ) () ( ) () ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) = 0 0 0 0 0 sin cos sin sin cos cos sin cos,3,3,1 1 1, 1,1 1 1, 1 1 1,4 1 1 1,4 1 θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ l l l l l l l l γ
時間積分法 次の Runge-Kua 法 () ( ) ( ) ( ) ( ) ( ) ( ) ( ) () ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) () ( ) ( ) ( ) ( ) ( ) ( ) ( ) Δ + = = Δ + + = = = = = + Δ + Δ + Δ + + = Δ Δ + Δ + + Δ + = Δ Δ + Δ + + Δ + = Δ Δ + + Δ + = Δ + Δ + Δ + = = + Δ = = + + + + b a b b a O b b a O b a O b a b a O N T T n 1 1 1 1 3 1 3 1 1 where 1/ 1/ 1/ 1 and 1 1 1, 0,1,,, 0, : f f f f f f f f f f f R
時間積分法 (con.) 4 次の Runge-Kua 法 () ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) Δ + = Δ + = Δ + = = Δ + + + + = = + Δ = = + + N T n 3 4 3 1 1 4 3 1 1 1 where 6, 0,1,,, 0, : f f f f f R
有限要素モデル Ω の有限要素モデル Femap Ver9.1.0 を使用 総節点数 : 5,491 総要素数 : 11,046
表面要素の描画 要素と節点のデータ構造 要素 ラベル : n 構成されている節点 : i, j, 節点 i n ラベル : i 座標値 : i x, i y, i j for( n=0 ; n<n ; n++ ){ glbegin( GL_TRIANGLES ); glverex3d( n. i. i_x, n. i. i_y, n. i. i_); glverex3d( n. j. j_x, n. j. j_y, n. j. j_); glend(); glverex3d( n.. _x, n.. _y, n.. _); }
アニメーション結果 ピストンクランク機構
I [1] ( ),. C ( ), ( ),., 00. [] Mar J. Kilgard. The opengl uiliy ooli (glu) programming inerface api version 3( ). hp://opengl.jp/glu/index.hml, 001. [3],. OpenGL 3 CG., 003. [4]. Glu opengl. hp://www.waayama-u.ac.jp/ ooi/opengl/libglu.hml, 006. Lins: [], [4]