情報科教育法 担当畔上秀幸情報科学研究科複雑系科学専攻
高等学校学習指導要領 第 章 : 普通教育に関する各教科 - 第 0 節 : 情報 hp://www.mex.go.jp/b_menu/shuppan/sono a/99030/03603/0.hm 情報 B (3) 問題のモデル化とコンピュータを活用した解決 ア モデル化とシミュレーション 身のまわりの現象や社会現象などを通して, モデル化とシミュレーションの考え方や方法を理解させ, 実際の問題解決に活用できるようにする 内容の取扱い (3) については, ソフトウェアやプログラミング言語を用い, 実習を中心に扱うようにする
畔上担当分の授業内容 モデル化とシミュレーション に関連して, コンピュータグラフィックスと数値シミュレーションについて学ぶ. OpenGL による CG プログラミング C 言語によるプログラミング Microsof Visual Sudio 005の環境で,Cによるプログラミング OpenGLによるコンピュータグラフィックス OpenGLの利用法 / コンピュータグラフィックスで使われる座標変換 / OpenGLで書かれたプログラムの実行 OpenGLによるアニメーション OpenGL を用いたアニメーションの制作 マルチボディダイナミクス 数値シミュレーションの例として, リンク機構の運動解析の解説 デモプログラムの実行 3
OpenGL による CG プログラミング 情報科教育法 4
C 言語によるプログラミング OpenGL による CG プログラミング 5
C プログラムの実行までの手順 C 言語で書かれたプログラムは次のように実行される. デバッグ例えば es.c ソースプログラムエラーメッセージ Cコンパイラ誤りあり es.obj オブジェクトモジュールライブラリ *.lib リンカオブジェクトモジュール es.exe 実行可能プログラム *.obj 6
C プログラムの構造 関数を含む C プログラムは次の形式で構成される. #include < ヘッダファイル名 > プロトタイプ宣言 in main( ) { 宣言部, 定義プログラム reurn 0; } 関数型関数名 ( 仮引数 ) { 宣言部, 定義プログラム reurn 結果の値 ; }... 7
lesson_.c Hellow World! を画面出力する. #include <sdio.h> in main(void) { prinf("hellow World! n"); } reurn(0); 8
C 言語で使う型 算術型 符号付き整数 char (bye), shor in or shor (bye), in (4bye), long in or long (4bye) 符号なし整数 unsigned char (bye), unsigned shor in (bye), unsigned in (4bye), unsigned long in (4bye) 列挙型 enum 浮動少数型 floa (4bye), double (8bye), long double (80bi 最低保証 ) 9
lesson_.c 整数, 浮動小数の入出力 #include <sdio.h> #include <mah.h> in main(void) { in a; floa b; double c; a ; b.5; /*.5F と書いてもよい */ c 500.4; /* 5.004E と書いてもよい */ prinf("a %d n", a); prinf("b %f n", b); prinf("c %e n", c); } reurn(0); 0
lesson_4.c 自前の sin 関数 マクロ ( 置換 ) #define 識別子置換要素並び 例えば #define PI (3.4)
OpenGL によるコンピュータグラフィックス OpenGL による CG プログラミング
OpenGL とは Open Graphic Library 3 次元形状の描画のために開発されたソフトウェア ライブラリ CAD, CG モデラーで使われている. 特徴 UNIX 系 OS と Windows と Macinosh のいずれでも動く. リアルタイムで ( インタラクティブに ) 表示を行える. 3
描画ハードウェアウィンドウシステムGLUT ライブラリの構成 OpenGL Library (GL): 点, 線, 多角形の描画など OpenGL Uiliy Library (GLU): プリミティブの描画 OpenGL Uiliy Tooli (GLUT): Window の管理 OpenGL OpenGL アプリケーションプログラム GLU GL 4
lesson_.c 空のウィンドウを開く. void gluini(in *argc, char **argv) GLUT を初期化する. 引数には main の引数を渡す. in glucreaewindow(char *name) ウィンドウを開く. 引数 name はそのウィンドウのタイトルバーに表示される. 戻り値は開いたウィンドウの識別子 void gludisplayfunc(void (*func)(void)) ウィンドウが開かれたり, 他のウィンドウによって隠されたウィンドウが再び現れたりして, ウィンドウを再描画する必要があるときに, 引数 func ( 関数のポインタ ) で指定した関数が実行される. void glumainloop(void) この関数を呼び出すことで, プログラムはループ処理に入り, イベントの待ち受け状態になる. 5
lesson_.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) 新たに開くウィンドウの位置を指定 6
lesson_.c(con.) void glclearcolor(glclampf R, GLclampf G, GLclampf B, GLclampf A) 背景色を設定 R,G,B, Aは赤, 緑, 青, 不透明度 (α 値 ) の強さを示す GLclampf 型 (floa 型と等価 ) 0~ の値 (0, 0, 0): 黒色, (,, ) : 白色 void glclear(glbifield mas) mas には消去するバッファ ( メモリ ) を指定 GL_COLOR_BUFFER_BIT: 描画エリアの消去 GL_DEPTH_BUFFER_BIT: 隠面消去処理用奥行情報の消去 このほかに, ステンシルバッファ, オーバーレイバッファなどの消去がある. glflush(void) 実行されていない OpenGL の命令を全部実行 void glbegin(glnum mode) ~ void glend(void) 図形の関数を置く環境 mode には描画する図形のタイプを指定 7
lesson_.c(con.) glbegin() の引数 mode に指定できる図形のタイプ GL_POINTS 点を打つ. GL_LINES 点を直線で結ぶ. GL_LINE_STRIP 折れ線を描く. GL_LINE_LOOP 折れ線を描き, 始点と終点の間も結ぶ. v3 v0 v v v4 GL_LINES v3 v0 v3 v0 v v v4 GL_LINE_STRIP v v v4 GL_LINE_LOOP 8
lesson_.c(con.) GL_TRIANGLES / GL_QUADS 3 あるいは 4 点を組にして, 三角形あるいは四角形を描く. GL_TRIANGLE_STRIP / GL_QUAD_STRIP 一辺を共有しながら帯状に三角形あるいは四角形を描く. GL_TRIANGLE_FAN 一辺を共有しながら扇状に三角形を描く. GL_POLYGON 凸多角形を描く. v4 v5 v3 v0 v7 v v v6 GL_QUADS v v0 v4 v3 v v5 GL_QUAD_STRIP v3 v4 v v5 v0 v GL_TRIANGLES v4 v v3 v0 v GL_TRIANGLE_STRIP v v v3 v4 v0 GL_TRIANGLE_FAN v3 v4 v v0 v GL_POLYGON 9
lesson_.c(con.) 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~ の範囲で指定 r,g,b, a のときは void glcolor4f() 引数が double 型のときは glcolor?d(), in 型のときは glcolor?i() 0
lesson_4.c シルピンスキーのギャスケット lengh /.0; /* 再帰関数 */ if(lengh > 0.0){ draw_gase(x0, y0, lengh); draw_gase(mid_poin(x0, x), mid_poin(y0, y), lengh); draw_gase(mid_poin(x, x0), mid_poin(y, y0), lengh); }
CG で使われる変換 投影変換 (projecive ransformaion) 3 次元形状モデルをディスプレイや印刷面の 次元面に投影する変換 モデリングされた形状をディスプレイに表示したり, プリンタで印刷する際に必要となる 幾何変換 (geomeric ransformaion) 3 次元形状モデルの定義された局所座標系を平行移動, 回転移動, 拡大 縮小変形を行う変換 ( 座標変換は幾何変換の逆向き ) 異なる座標系でモデリングされたパーツを全体座標系で組み合わせるあるいは分解する際に必要となる. 視野変換 (viewing ransformaion) 視点の位置あるいは投影する方向 ( 視線の方向 ) を移動 回転する変換 実際には 3 次元形状モデルを幾何変換することになる.
同次座標 n 次元空間上の点 P (x, x,, x n ) を次の関係に基づいて n 次元の直交座標系で座標 (X, X,, X n, W) で表現する方法を同次座標 (homogeneous coordinae) 表現と呼ぶ. X X X n x, x,, xn W W W 同次座標を導入する理由は, 平行移動, 回転移動, 投影変換などが行列で表現できるためである. 3
平行移動 点 P (x,y,) を T(T x,t y,t,) だけ平行移動した点 P (x,y, ) は同次座標表現を用いて次式となる. x 0 0 Tx x y 0 0 T y y 0 0 T 0 0 0 x x Tx y y Ty T P T P y x 4
回転移動 点 P (x,y,) を x 軸, y 軸, 軸の方向に向いて時計方向 ( 右回り ) に θ x,θ y,θ だけ回転した点 P (x,y, ) は同次座標表現を用いて次式となる. x 0 0 0 x y 0 cosθx sinθx 0 y 0 sinθx cosθx 0 0 0 0 x cosθy 0 sinθy 0 x y 0 0 0 y sinθy 0 cosθy 0 0 0 0 x cosθ sinθ 0 0 x y sinθ cosθ 0 0 y P 0 0 0 θ P α 0 0 0 x y x cos( α θ) r y sin ( α θ) cosα cosθ sinαsinθ r cosα sinθ sinαcosθ cosθ sinθ x sinθ cosθ y 5
拡大 縮小 反転変形 x 軸, y 軸, 軸に対して S x, S y, S 倍した場合 x Sx 0 0 0 x y 0 Sy 0 0 y 0 0 S 0 0 0 0 x 軸および原点に対して反転した場合 x 0 0 0 x y 0 0 0 y 0 0 0 0 0 0 x 0 0 0 x y 0 0 0 y 0 0 0 0 0 0 6
幾何変換の応用 任意の軸回りの回転移動 点 P (x,y,) を点 Q (x Q,y Q, Q ) を始点とする単位ベクトル n(n x,n y,n ) に対して時計方向に θ だけ回転した点 P (x,y, ) への変換を考えてみよう. y n Q P θ P x 7
幾何変換の応用 (con.) 任意の軸回りの回転移動 (con.) 手順 : 点 Q (x Q,y Q, Q ) を原点に平行移動する. x 0 0 xq x y 0 0 y Q y 0 0 Q 0 0 0 x Tx n Q y P x 8
幾何変換の応用 (con.) 任意の軸回りの回転移動 (con.) 手順 : 単位ベクトル n(n x,n y,n ) を 軸回りに α だけ回転して y- 平面内に移動する (n ベクトルとする ). ただし, ny nx cos α, sin α n n n n x y x y n y x cosα sinα 0 0 x y sinα cosα 0 0 y 0 0 0 0 0 0 x R x ( α ) 軸回りに α 回転 α Q P x 9
幾何変換の応用 (con.) 任意の軸回りの回転移動 (con.) 手順 3: n ベクトルを x 軸回りに β だけ回転して x 軸と一致させる (n ベクトルとする ). ただし, cos β n y x3 0 0 0 x y 3 0 cosβ sinβ 0 y 3 0 sinβ cosβ 0 0 0 0 x R x ( β ) 3 x n β Q P x 30
幾何変換の応用 (con.) 任意の軸回りの回転移動 (con.) 手順 4: n ベクトルを 軸回りに θ だけ回転する. x4 cosθ sinθ 0 0 x3 y 4 sinθ cosθ 0 0 y 3 4 0 0 0 3 0 0 0 x R x ( θ ) 4 3 n P y θ Q x 3
幾何変換の応用 (con.) 任意の軸回りの回転移動 (con.) 手順 5: 手順 3 の逆変換を行う. 手順 6: 手順 の逆変換を行う. 手順 7: 手順 の逆変換を行う. したがって, x x R x 5 β 4 R x 6 α 5 x T x 7 6 ( α) ( β) ( θ) ( β) ( α) x T R R R R R Tx 7 x x 3
幾何変換の応用 (con.) オイラー角による回転移動 (con.) 局所座標系 x L -y L - L から全体座標系 x-y- への回転移動を考えてみよう. 全体座標系から局所座標系への回転はオイラー角 (α,β,γ) で与えられた場合 ( γ) ( β) ( α) x R R R x y x L L β y L x α γ x L x y 33
投影変換 種類の投影変換 透視投影変換 視点を v 軸上に置き, v 軸に垂直な面に投影する. y v 平行投影変換 v x v 視点を全体座標系の 軸上無限遠方に置き, v 軸に垂直な面に投影する. y v 無限遠方 v x v 34
投影変換に必要な座標系 全体座標系 (world coordinae sysem): (x,y,) 3 次元モデルを定義する座標系 ( 右手系 ) 視座標系 (viewing coordinae sysem): (x v,y v, v ) 視線を v 軸とした座標系 ( 通常, 左手系 ) yv y v 視点を原点に置いた場合 xv x 35
投影変換に必要な座標系 (con.) 正規化視座標系 (normalied viewing coordinae sysem): (x nv,y nv, nv ) 視座標系の可視領域を正規化した座標系 ( 通常, 左手系 ) 隠面 隠線処理で必要となる. y nv y v (,,) v nv x v (,, 0) x nv 36
透視投影変換 透視投影変換では視点と投影面の位置を違えた つの変換が使われる. 視点 v 0, 投影面 v d ( 通常こちらが使われる ) y v v d ( x, y, ) ( x, y, ) d d d v v v v x v 視点 v d, 投影面 v 0 (d のとき平行投影変換となる ) y v x, y, x, y, ( ) 0 0 0 ( ) v v v v d x v v 37
透視投影変換 視点 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 38
透視投影変換 (con.) 視点 v 0, 投影面 v d のとき (con.) これらの関係を同次座標で表せば次式となる. X d 0 0 0 xv Y 0 0 0 d y v Zd 0 0 0 v Wd 0 0 d 0 xv 実際, 次のようになる. Xd xv v d xd Y d y v xv yd Zd v v d d Wd v d d 39
透視投影変換 (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 v v y v ( x, y, ) 0 0 0 ( x, y, ) v v v v d x v v 40
透視投影変換 (con.) 視点 v d, 投影面 v 0 のとき (con.) これらの関係を同次座標で表せば次式となる. X 0 0 0 0 xv Y 0 0 0 0 y v Z0 0 0 0 0 v W0 0 0 d xv 実際, 次のようになる. X0 xv v d x0 Y 0 y v xv y0 Z0 0 v d 0 W0 v d 0 d のとき平行投影変換となる. 4
正規化視座標系への変換 視点 v 0, 投影面 v d のとき 可視領域 (viewing volume) を d v f と仮定する. y v ( dmax, dmax, ) x y d ( x f max, yf max, f ) x v ( x, y, d) dmin dmin v x v -y v に対する正規化視座標系 (x v,y v, v ) ( x f max xdmax, yf max ydmax, f ) yv yv ydmax (,, d ) x v xv xdmax v v 4
正規化視座標系への変換 (con.) 視点 v 0, 投影面 v d のとき (con.) これらの関係を同次座標で表せば次式となる. X v xdmax 0 0 0 xv Y v 0 ydmax 0 0 y v Z v 0 0 0 v W v 0 0 0 実際, 次のようになる. X v xv xdmax x xv xdmax Y v yv y dmax y yv ydmax Z v v v W v 43
正規化視座標系への変換 (con.) 視点 v 0, 投影面 v d のとき (con.) さらに, 正規化視座標系 (x nv,y nv, nv ) を想定して, 可視領域が立方体に対応するような変換を考えよう. ( xf max xdmax, yf max ydmax, f ) yv yv ydmax (,, d ) v x v xv xdmax xnv x v ynv y v β d v d,, nv α d d d f d f d v v v v v α v d nv 0 d f v f nv d β d f y (,, 0) nv (,,) nv x nv 44
正規化視座標系への変換 (con.) 視点 v 0, 投影面 v d のとき (con.) 正規化視座標系 : (x nv,y nv, nv ) への変換 0 0 0 X nv 0 0 0 x v Y nv y v d Z 0 0 nv v d f d f W nv 0 0 d 0 実際, 次のようになる. xnv xnv v d ynv, v f ynv nv 0 nv x v y v xnv x v ( v d) v d ynv y v ( v d) ( d f ) nv ( v d) v d ( d f ) 45
OpenGL の変換 コンピュータで実行される変換の順番 OpenGL では同次座標系の変換行列 (4 4) を使って各種変換を行っている. 点情報 A A 幾何変換 A n P 投影変換 P 陰線処理画像変換画像 v v P PA A Av n 46
OpenGL の変換 (con.) void glmarixmode(glenum mode) mode に引数 GL_MODELVIEW, GL_PROJECTION, GL_TEXTURE を指定して, 幾何変換, 射影変換, テクスチャー行列のどれを操作するか指定する. void glloadideniy(void) 現在対象としている行列を4x4の単位行列にする. 例えば glmarixmode(gl_projection); /* 射影変換の設定 */ glloadideniy(); /* 初期化 */ gluperspecive(60.0,.0,.0, 0.0); P I 0 P glmarixmode(gl_modelview); /* 幾何変換の設定 */ glloadideniy(); /* 初期化 */ gltranslaef(-.0, 0.0, 0.0);/* x 軸方向移動 */ glroaef(-30.0, 0.0, 0.0,.0);/* 回転 */ gluwireteapo(.0);/* ティーポットを描画 */ A I 0 A A v PA Av 47
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 軸 ) 48
OpenGL による透視投影変換 void gluperspecive(gldouble fovy, Gldouble aspec, GLdouble near, Gldouble far) y y v aspecw/h fovy w h v 視点は原点 x x v near ( v 軸 ) far ( v 軸 ) 49
視点の位置 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 (cx, cy, c) ( 軸 ) (ex, ey, e) ( 軸 ) v x x v 50
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,.0); 伸縮 void glscalef(glfloa x, GLfloa y, GLfloa ) 各軸方向へ指定された値で伸縮させる. 例えば,X,Y 方向に半分の大きさにする場合 glscalef(0.5, 0.5,.0) 5
OpenGL の幾何変換 (con.) glpushmarix(), glpopmarix() 変換行列を保存する. スタック Push Pop Push Pop I A A A 3 A A A A A 5 A 4 A A A A A A A A glloadideniy() glscalef() gltranslaef() glscalef() draw_uad() gltranslaef() glscalef() glroaef() draw_ri() 5
lesson4_.c ティーポットを平行投影変換で描く 53
lesson4_.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 を使用しても良い ). 54
GLUT のプリミティブ関数 丸型オブジェクト 円錐 void gluwirecone(radius, heigh, slices, sacs); void glusolidcone(radius, heigh, slices, sacs); 球体 void gluwiresphere(radius, slices, sacs); void glusolidsphere(radius, slices, sacs); 特殊型オブジェクト トーラス void gluwiretorus(innerradius, ouerradius, nsides, rings); void glusolidtorus(innerradius, ouerradius, nsides, rings); ティーポット void gluwireteapo(sie); void glusolidteapo(sie); 面体オブジェクト 立方体 void gluwirecube(sie); void glusolidcube(sie); 四面体 void gluwireterahedron(void); void glusolidterahedron(void); 八面体 void gluwireocahedron(void); void glusolidocahedron(void); 十二面体 void gluwiredodecahedron(void); void glusoliddodecahedron(void); 二十面体 void gluwireicosahedron(void); void glusolidicosahedron(void); 55
ダブルバッファリング ダブルバッファリング gluinidisplaymode(glut_double) を指定して glflush() の代りに gluswapbuffers() を使用する. in gluswapbuffers(void) ダブルバッファリングのつのバッファを交換することでちらつきを防ぐ. ディスプレイのリフレッシュレートが 60H であれば, バッファの交換は /60 秒ごとに行われる. 56
lesson4_.c ティーポットを透視投影変換で描く 57
lesson4_3.c ティーポットと水滴を下図のように移動する. 58
OpenGL によるアニメーション OpenGL による CG プログラミング 59
lesson7_.c, lesson7_.c ティーポットを回転させる. void gluidlefunc(void (*func)(void)) 入力イベントがない場合, 引数 func ( 関数のポインタ ) で指定した関数を実行する. 60
lesson7_3.c 回転するドーナツとティーポットのウォークスルーアニメーション 6
マルチボディダイナミクス 情報科教育法 6
一般化座標表現 一般化座標 ( r ) x x ( r ) G ( r ) G ( r ) 拘束条件 一般化外力 63 ( ) θ Φ 0 Φ : R R P ( L (( 0,T ))) 3 ( H (( 0,T ))) ( r,,,4) ( ) Ω Q x ( 4), () ( 4) Q { ( (( ))) ( ) ( ) } H 0,T 0 0, 0 0 Ω ( ) ( 4) ( ) Ω x ( ) ( 3) ( 3) Ω P
拘束条件 詳細 ( ) Φ 64 x x ( 4) (,4) ( ) ( 4) (,4 ) ( ) () (, ) () ( ) (,) ( ) G cosθ () (,) () ( ) (,) ( ) G l l x x x x G G sinθ ( ) (,3) ( ) ( 3) G cosθ ( ) (,3) ( ) ( 3) G l l l l sinθ θ θ cosθ x x x x ( 3) G ( 3) ( 4) G x ( 4) G ( 4) G G sinθ x x l l G G x x G G cosθ sinθ l l (,4) (, ) ( 4) ( ), l ( ) ( ) (,3) l ( 3)
制約付変分原理 作用積分の停留化問題 (Hamilon の原理 ) に拘束条件を加えた制約付停留化問題 最適性の条件 拘束条件の時間微分 65 ( ) ( ) ( ) { } ( ) ( ) T T Q U T U T L 0 0, d, d, saionalie P M λ λ λ Φ R ( ) ( ) ( ) 0 0 Φ Φ Φ Φ, d, lim, T 0 T 0 λ P M λ λ P M λ λ λ δ δ ε εδ εδ δ ε T L L T T T T T d d, 0 d d Φ Φ Φ Φ Φ Φ Φ Φ
微分代数方程式 最適性の条件と拘束条件の時間 階微分より微分代数方程式 (DAE: differenial-algebraic euaions) を得る. () () () ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) M M B M M M M A B AP γ M γ P λ M T T T T T T T T T 4 4 4 T,,,,,,, diag 0 Φ Φ Φ Φ Φ Φ Φ Φ Φ Φ Φ Φ Φ I m m I m m 66
微分代数方程式 (con.) 詳細 67 ( ) ( ) ( ) () ( ) () () ( ) () ( ) ( ) ( ) () ( ) () ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) 0 0 0 0 0 sin cos sin sin cos cos sin cos,3,3,,,,,4,4 θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ 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 3 3 where / / / and, 0,,,, 0, : f f f f f f f f f f f R 68
時間積分法 (con.) 4 次の Runge-Kua 法 () ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) Δ Δ Δ Δ Δ N T n 3 4 3 4 3 where 6, 0,,,, 0, : f f f f f R 69
有限要素モデル Ω の有限要素モデル Femap Ver9..0 を使用 総節点数 : 5,49 総要素数 :,046 70
表面要素の描画 要素と節点のデータ構造 要素 ラベル : n 構成されている節点 : i, j, 節点 i n ラベル : i 座標値 : i x, i y, i j for( n0 ; 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.. _); } 7
アニメーション結果 ピストンクランク機構 7
参考文献. C 言語によるプログラミング基礎編 ( 第 版 ) / 応用編 ( 第 版 ), 内田智史 ( 監修 ) / スーパーリファレンス編, 内田智史ほか, オーム社. OpenGL による 3 次元 CG プログラミング, 林武文, 加藤清敬, コロナ社, 003. 3. 3 次元 CG の基礎と応用, 千葉則茂, 土井章男著, サイエンス社, 004. 4. CAD/CAM/CG のための形状処理工学入門, 嘉数侑昇, 古川正志著, 森北出版,995. 5. コンピュータグラフィックス理論と実践, James D. Foley, Seven K. Feiner, Andries van Dam, John F. Hughes: 佐藤義雄 ( 訳 ), オーム社, 00. 6. hp://www.waayamau.ac.jp/~ooi/opengl/libglu.hml 7. hp://opengl.jp/glu/index.hml 73