情報科教育法1
担当 畔上秀幸 情報科学研究科 複雑系科学専攻
高等学校学習指導要領
` 第2章:普通教育に関する各教科-第10節:情報 http://www.mext.go.jp/b_menu/shuppan/sono ta/990301/03122603/011.htm ` 情報B ` (3) 問題のモデル化とコンピュータを活用した解決 ` ア モデル化とシミュレーション 身のまわりの現象や社会現象などを通して,モデル化とシミュレーション の考え方や方法を理解させ,実際の問題解決に活用できるようにする。 内容の取扱い ` (3)については,ソフトウェアやプログラミング言語を用い,実 習を中心に扱うようにする。畔上担当分の授業内容
` 「モデル化とシミュレーション」に関連して,コンピュータグ ラフィックスと数値シミュレーションについて学ぶ.
` OpenGL によるCGプログラミング
` C言語によるプログラミング
Microsoft Visual Studio 2005の環境で,Cによるプログラミング
` OpenGLによるコンピュータグラフィックス OpenGLの利用法/コンピュータグラフィックスで使われる座標変換/ OpenGLで書かれたプログラムの実行 ` OpenGLによるアニメーション OpenGLを用いたアニメーションの制作 ` マルチボディダイナミクス ` 数値シミュレーションの例として,リンク機構の運動解析の解説 ` デモプログラムの実行
OpenGL によるCGプログラミング
C言語によるプログラミング
Cプログラムの実行までの手順
` C言語で書かれたプログラムは次のように実行される. ソースプログラム Cコンパイラ オブジェクトモジュール ライブラリ オブジェクトモジュール リンカ 実行可能プログラム 例えば test.c test.obj test.exe *.lib *.obj エラーメッセージ 誤りあり デバッグCプログラムの構造
` 関数を含むCプログラムは次の形式で構成される. #include <ヘッダファイル名> プロトタイプ宣言 int main( ) { return 0; } 宣言部,定義 プログラム 関数型 関数名(仮引数) { return 結果の値; } 宣言部,定義 プログラム ...lesson1_1.c
` Hellow World! を画面出力する.
#include <stdio.h> int main(void)
{
printf("Hellow World!¥n"); return(0);
C言語で使う型
` 算術型
` 符号付き整数
` char (1byte), short int or short (2byte), int (4byte),
long int or long (4byte)
` 符号なし整数
` unsigned char (1byte), unsigned short int (2byte),
unsigned int (4byte), unsigned long int (4byte)
` 列挙型
` enum
` 浮動少数型
` float (4byte), double (8byte), long double (80bit 最低保
lesson1_2.c
` 整数,浮動小数の入出力 #include <stdio.h> #include <math.h> int main(void) { int a; float b; double c; a = 1; b = 1.5; /* 1.5Fと書いてもよい */ c = 500.4; /* 5.004E2と書いてもよい */ printf("a = %d¥n", a); printf("b = %f¥n", b); printf("c = %e¥n", c);lesson1_4.c
` 自前のsin関数 ` マクロ(置換) ` #define 識別子 置換要素並び ` 例えば #define PI (3.14)OpenGLによるコンピュータグラ
フィックス
OpenGLとは
` Open Graphic Library
` 3次元形状の描画のために開発されたソフトウェア・ライ ブラリ
` CAD, CGモデラーで使われている.
` 特徴
` UNIX 系 OS と Windows と Macintosh のいずれでも動く.
ライブラリの構成
` OpenGL Library (GL):点,線,多角形の描画など ` OpenGL Utility Library (GLU):プリミティブの描画 ` OpenGL Utility Toolkit (GLUT): Window の管理
GLU ウィ ン ド ウ シス テ ム GLUT OpenGL アプリケーション プログラム GL OpenGL 描画ハ ー ド ウ ェ ア
lesson2_1.c
` 空のウィンドウを開く.
` void glutInit(int *argc, char **argv)
` GLUT を初期化する.
` 引数には main の引数を渡す.
` int glutCreateWindow(char *name)
` ウィンドウを開く.
` 引数 name はそのウィンドウのタイトルバーに表示される.
` 戻り値は開いたウィンドウの識別子
` void glutDisplayFunc(void (*func)(void))
` ウィンドウが開かれたり, 他のウィンドウによって隠されたウィンドウが再
び現れたりして, ウィンドウを再描画する必要があるときに,引数 func
(関数のポインタ)で指定した関数が実行される.
` void glutMainLoop(void)
` この関数を呼び出すことで, プログラムはループ処理に入り,イベントの
lesson2_2.c
` 矩形を描く.
` void glutInitDisplayMode(unsigned int mode)
` ディスプレイの表示モードを設定
` mode に色の指定方法を設定する場合
GLUT_RGBA:RGB (赤,緑,青,透明度) GLUT_INDEX:インデックスカラーモード
` 各種バッファの ON/OFF の設定がある.
` void glutInitWindowSize(int w, int h)
` 新たに開くウィンドウの幅と高さを指定
` void glutInitWindowPosition(int x, int y)
lesson2_2.c(cont.)
` void glClearColor(GLclampf R, GLclampf G, GLclampf B,
GLclampf A)
` 背景色を設定
` R,G,B, Aは赤, 緑, 青, 不透明度(α値)の強さを示す GLclampf 型
(float 型と等価) 0~1 の値
(0, 0, 0): 黒色, (1, 1, 1) :白色
` void glClear(GLbitfield mask)
` mask には消去するバッファ(メモリ)を指定 GL_COLOR_BUFFER_BIT:描画エリアの消去 GL_DEPTH_BUFFER_BIT:隠面消去処理用奥行情報の消去 このほかに,ステンシルバッファ, オーバーレイバッファなどの消去がある. ` glFlush(void) ` 実行されていない OpenGL の命令を全部実行
` void glBegin(GLnum mode) ~ void glEnd(void)
` 図形の関数を置く環境
lesson2_2.c(cont.)
` glBegin() の引数 mode に指定できる図形のタイプ ` GL_POINTS 点を打つ. ` GL_LINES 2点を直線で結ぶ. ` GL_LINE_STRIP 折れ線を描く. ` GL_LINE_LOOP 折れ線を描き,始点と終点の間も結ぶ. v0 v1 v2 v3 v4 GL_LINES v0 v1 v2 v3 v4 GL_LINE_STRIP v0 v1 v2 v3 v4 GL_LINE_LOOPlesson2_2.c(cont.)
` GL_TRIANGLES / GL_QUADS 3あるいは4点を組にして,三角形あるいは四角形を描く. ` GL_TRIANGLE_STRIP / GL_QUAD_STRIP 一辺を共有しながら帯状に三角形あるいは四角形を描く. ` GL_TRIANGLE_FAN 一辺を共有しながら扇状に三角形を描く. ` GL_POLYGON 凸多角形を描く. v0 v1 v2 v3 v5 GL_QUADS v4 v0 v1 v2 v3 GL_QUAD_STRIP v4 v6 v7 v5 GL_POLYGON v0 v1 v2 v3 v4 v0 v1 v2 v3 v5 GL_TRIANGLES v4 v0 v1 v2 v3 GL_TRIANGLE_STRIP v4 GL_TRIANGLE_FAN v0 v1 v2 v3 v4lesson2_2.c(cont.)
` void glVertex2f(GLfloat x, GLfloat y)
` 頂点の座標値を設定
` 引数の型は GLfloat (float と等価)
` 3, 4次元 (x,y,z), (x,y,z,w) のときは glVertex3f (), glVertex4f ()
` 引数が double 型のときは glVertex?d(), int 型のときは
glVertex?i()
` 引数がポインタのときは void glVertex??v()
` void glColor3f(GLfloat r, GLfloat g, GLfloat b)
` 描画色を指定
` r,g,b には赤, 緑, 青の強さを 0~1 の範囲で指定
` r,g,b, a のときは void glColor4f()
lesson2_4.c
` シルピンスキーのギャスケット
length /= 2.0;
/* 再帰関数 */
if(length > 0.01){
draw_gasket(x0, y0, length);
draw_gasket(mid_point(x0, x1), mid_point(y0, y1), length); draw_gasket(mid_point(x2, x0), mid_point(y2, y0), length); }
CGで使われる変換
` 投影変換(projective transformation) ` 3次元形状モデルをディスプレイや印刷面の2次元面に投影する変換 ` モデリングされた形状をディスプレイに表示したり,プリンタで印刷する際に 必要となる ` 幾何変換(geometric transformation) ` 3次元形状モデルの定義された局所座標系を平行移動,回転移動,拡 大・縮小変形を行う変換(座標変換は幾何変換の逆向き) ` 異なる座標系でモデリングされたパーツを全体座標系で組み合わせるある いは分解する際に必要となる. ` 視野変換(viewing transformation) ` 視点の位置あるいは投影する方向(視線の方向)を移動・回転する変 換 ` 実際には3次元形状モデルを幾何変換することになる.同次座標
` n 次元空間上の点 P (x1, x2,…, xn) を次の関係に基づ いて n+1 次元の直交座標系で座標 (X1, X2,…, Xn , W) で表現する方法を同次座標(homogeneous coordinate)表現と呼ぶ. ` 同次座標を導入する理由は,平行移動,回転移動,投影変 換などが行列で表現できるためである. 1 2 1 , 2 , , n n X X X x x x W W W = = =平行移動
` 点P (x,y,z) を T=(Tx,Ty,Tz,) だけ平行移動した点P’ (x’,y’,z’) は同次座標表現を用いて次式となる. 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 x y z x y x T x y T y z T z x x T y y T z z T ′ ⎧ ⎫ ⎡ ⎤ ⎧ ⎫ ⎪ ⎪ ⎢′ ⎥ ⎪ ⎪ ⎪ ⎪ = ⎢ ⎥ ⎪ ⎪ ⎨ ⎬′ ⎢ ⎥ ⎨ ⎬ ⎪ ⎪ ⎢ ⎥ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎩ ⎭ ⎣ ⎦ ⎩ ⎭ ′ + ⎧ ⎫ ⎧ ⎫ ⎪ ⎪ ⎪′ ⎪ ⇔ ⎨ ⎬ ⎨= + ⎬ ⎪ ⎪ ⎪′ + ⎪ ⎩ ⎭ ⎩ ⎭ z y T P P′回転移動
` 点P (x,y,z) を x軸, y軸,z軸 の方向に向いて時計方向 (右回り)にθ
x,θ
y,θ
z だけ回転した点P’ (x’,y’,z’)は同次 座標表現を用いて次式となる. 1 0 0 0 0 cos sin 0 0 sin cos 0 1 0 0 0 1 1 x x x x x x y y z z θ θ θ θ ′ ⎧ ⎫ ⎡ ⎤ ⎧ ⎫ ⎪ ⎪ ⎢′ − ⎥ ⎪ ⎪ ⎪ ⎪ = ⎢ ⎥⎪ ⎪ ⎨ ⎬′ ⎢ ⎥⎨ ⎬ ⎪ ⎪ ⎢ ⎥⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎩ ⎭ ⎣ ⎦ ⎩ ⎭ cos 0 sin 0 0 1 0 0 sin 0 cos 0 1 0 0 0 1 1 y y y y x x y y z z θ θ θ θ ′ ⎧ ⎫ ⎡ ⎤ ⎧ ⎫ ⎪ ⎪ ⎢′ ⎥ ⎪ ⎪ ⎪ ⎪ = ⎢ ⎥⎪ ⎪ ⎨ ⎬′ ⎢− ⎥⎨ ⎬ ⎪ ⎪ ⎢ ⎥⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎩ ⎭ ⎣ ⎦ ⎩ ⎭ cos sin 0 0 sin cos 0 0 0 0 1 0 1 0 0 0 1 1 z z z z x x y y z z θ θ θ θ ′ − ⎧ ⎫ ⎡ ⎤ ⎧ ⎫ ⎪ ⎪ ⎢′ ⎥ ⎪ ⎪ ⎪ ⎪ = ⎢ ⎥⎪ ⎪ ⎨ ⎬′ ⎢ ⎥⎨ ⎬ ⎪ ⎪ ⎢ ⎥⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎩ ⎭ ⎣ ⎦ ⎩ ⎭ x y ( ) ( ) cos sincos cos sin sin cos sin sin cos cos sin sin cos x r y r x y α θ α θ α θ α θ α θ α θ θ θ θ θ ′ ⎧ + ⎫ ⎧ ⎫= ⎪ ⎪ ⎨ ⎬′ ⎨ + ⎬ ⎪ ⎪ ⎩ ⎭ ⎩ ⎭ − ⎧ ⎫ = ⎨ + ⎬ ⎩ ⎭ − ⎡ ⎤ ⎧ ⎫ =⎢ ⎥⎨ ⎬ ⎣ ⎦ ⎩ ⎭ z α θ P P′
拡大・縮小・反転変形
` x軸, y軸,z軸 に対して Sx, Sy, Sz 倍した場合 ` x 軸および原点に対して反転した場合 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 x y z x S x y S y z S z ′ ⎧ ⎫ ⎡ ⎤ ⎧ ⎫ ⎪ ⎪ ⎢′ ⎥ ⎪ ⎪ ⎪ ⎪= ⎢ ⎥⎪ ⎪ ⎨ ⎬′ ⎢ ⎥⎨ ⎬ ⎪ ⎪ ⎢ ⎥⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎩ ⎭ ⎣ ⎦ ⎩ ⎭ 1 0 0 0 0 1 0 0 0 0 1 0 x x y y z z ′ − ⎧ ⎫ ⎡ ⎤ ⎧ ⎫ ⎪ ⎪ ⎢′ ⎥ ⎪ ⎪ ⎪ ⎪= ⎢ ⎥⎪ ⎪ ⎨ ⎬′ ⎢ ⎥⎨ ⎬ ⎪ ⎪ ⎢ ⎥⎪ ⎪ 1 0 0 0 0 1 0 0 0 0 1 0 x x y y z z ′ − ⎧ ⎫ ⎡ ⎤ ⎧ ⎫ ⎪ ⎪ ⎢′ − ⎥ ⎪ ⎪ ⎪ ⎪= ⎢ ⎥⎪ ⎪ ⎨ ⎬′ ⎢ − ⎥⎨ ⎬ ⎪ ⎪ ⎢ ⎥⎪ ⎪幾何変換の応用
` 任意の軸回りの回転移動 ` 点P (x,y,z) を点Q (xQ,yQ,zQ) を始点とする単位ベクトル n=(nx,ny,nz) に対して時計方向に θ だけ回転した点P’ (x’,y’,z’) への変換を考えてみよう. z y x P Q P′ θ n幾何変換の応用
(cont.)
` 任意の軸回りの回転移動(cont.) ` 手順1:点Q (xQ,yQ,zQ) を原点に平行移動する. z y P Q n 1 Q 1 Q 1 Q 1 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 x x x y y y z z z − ⎧ ⎫ ⎡ ⎤ ⎧ ⎫ ⎪ ⎪ ⎢ − ⎥ ⎪ ⎪ ⎪ ⎪ = ⎢ ⎥⎪ ⎪ ⎨ ⎬ ⎢ − ⎥⎨ ⎬ ⎪ ⎪ ⎢ ⎥⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎩ ⎭ ⎣ ⎦ ⎩ ⎭ = x Tx幾何変換の応用
(cont.)
` 任意の軸回りの回転移動(cont.) ` 手順2:単位ベクトル n=(nx,ny,nz) を z軸回りに α だけ回転し て y-z 平面内に移動する(n1ベクトルとする).ただし, 2 2 2 2 cos = y , sin = x x y x y n n n n n n α α + + z y x Q 1 n P α( )
2 1 2 1 2 1 2 1 cos sin 0 0 sin cos 0 0 0 0 1 0 1 0 0 0 1 1 z x x y y z z α α α α α ⎧ ⎫ ⎡ ⎤ ⎧ ⎫ ⎪ ⎪ ⎢− ⎥ ⎪ ⎪ ⎪ ⎪ = ⎢ ⎥⎪ ⎪ ⎨ ⎬ ⎢ ⎥⎨ ⎬ ⎪ ⎪ ⎢ ⎥⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎩ ⎭ ⎣ ⎦ ⎩ ⎭ = x R x z 軸回りに α 回転幾何変換の応用
(cont.)
` 任意の軸回りの回転移動(cont.) ` 手順3: n1ベクトルを x軸回りに β だけ回転して x軸と一致さ せる(n2ベクトルとする).ただし, z y 2 n P β cos =β nz Q( )
3 2 3 2 3 2 1 0 0 0 0 cos sin 0 0 sin cos 0 1 0 0 0 1 1 x x y y z z β β β β β ⎧ ⎫ ⎡ ⎤ ⎧ ⎫ ⎪ ⎪ ⎢ − ⎥ ⎪ ⎪ ⎪ ⎪ = ⎢ ⎥ ⎪ ⎪ ⎨ ⎬ ⎢ ⎥ ⎨ ⎬ ⎪ ⎪ ⎢ ⎥ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎩ ⎭ ⎣ ⎦ ⎩ ⎭ = x R x幾何変換の応用
(cont.)
` 任意の軸回りの回転移動(cont.) ` 手順4: n2ベクトルを z軸回りに θ だけ回転する. z y x 2 n P θ Q( )
4 3 4 3 4 3 4 3 cos sin 0 0 sin cos 0 0 0 0 1 0 1 0 0 0 1 1 z x x y y z z θ θ θ θ θ ⎧ ⎫ ⎡ ⎤ ⎧ ⎫ ⎪ ⎪ ⎢− ⎥ ⎪ ⎪ ⎪ ⎪ = ⎢ ⎥ ⎪ ⎪ ⎨ ⎬ ⎢ ⎥ ⎨ ⎬ ⎪ ⎪ ⎢ ⎥ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎩ ⎭ ⎣ ⎦ ⎩ ⎭ = x R x幾何変換の応用
(cont.)
` 任意の軸回りの回転移動(cont.) ` 手順5: 手順3の逆変換を行う. ` 手順6: 手順2の逆変換を行う. ` 手順7: 手順1の逆変換を行う. ` したがって, 1 5 β 4 − = x R x 1 6 α 5 − = x R x 1 7 6 − = x T x( )
( ) ( ) ( ) ( )
1 1 1 7 z α x β z θ x β z α − − − = x T R R R R R Tx幾何変換の応用
(cont.)
` オイラー角による回転移動(cont.) ` 局所座標系 xL-yL-zL から全体座標系 x-y-z への回転移動を 考えてみよう. ` 全体座標系から局所座標系への回転はオイラー角(α,β,γ) で与え られた場合 L z L y L x z y x x′ α β γ( ) ( ) ( )
y γ x β z α L = − − − x R R R x投影変換
` 2種類の投影変換 ` 透視投影変換 ` 視点を zv 軸上に置き, zv 軸に垂直な面に投影する. ` 平行投影変換 ` 視点を全体座標系の z 軸上無限遠方に置き, zv 軸に垂直な面に投 影する. v z v x v y v y投影変換に必要な座標系
` 全体座標系(world coordinate system): (x,y,z) `
3次元モデルを定義する座標系(右手系)
` 視座標系(viewing coordinate system): (xv,yv,zv) `
視線を z
v軸とした座標系(通常,左手系)
z zv v x = x v y = y 視点を原点に置いた場合投影変換に必要な座標系
(cont.)
` 正規化視座標系(normalized viewing coordinate
system): (xnv,ynv,znv) `
視座標系の可視領域を正規化した座標系(通常,
左手系)
` 隠面・隠線処理で必要となる. nv z x nv y (− −1, 1, 0) (1,1,1) v z v x v y透視投影変換
` 透視投影変換では視点と投影面の位置を違えた2つの 変換が使われる. ` 視点 zv =0,投影面 zv =d (通常こちらが使われる) ` 視点 zv =−d,投影面 zv =0 (d→∞ のとき平行投影変換とな る) v z v x v y v z = d(
xd , y zd , d)
(
x y zv, v, v)
v z v x v y v z = −d(
x y zv, v, v)
(
x y z0, 0, 0)
透視投影変換
` 視点 zv =0,投影面 zv =d のとき ` 点 (xv,yv,zv) と投影点 (xd,yd,zd) の関係は次式となる. v z x v y v z = d(
, ,)
v v v x y z(
xd , y zd , d)
, , , , d v d v v v d d d d v v v v x x y y x y z d x y z d d = z d = z = ⇒ = z d = z d =透視投影変換
(cont.)
` 視点 zv =0,投影面 zv =d のとき(cont.) ` これらの関係を同次座標で表せば次式となる. ` 実際,次のようになる. 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 d v d v d v d X x Y y Z z W d ⎧ ⎫ ⎡ ⎤ ⎧ ⎫ ⎪ ⎪ ⎢ ⎥ ⎪ ⎪ ⎪ ⎪ = ⎢ ⎥ ⎪ ⎪ ⎨ ⎬ ⎢ ⎥ ⎨ ⎬ ⎪ ⎪ ⎢ ⎥ ⎪ ⎪ ⎪ ⎪ ⎣ ⎦ ⎩ ⎭⎪ ⎪ ⎩ ⎭ v d v v d d v v d d v v d d v x X x z d x Y y x y Z z z d z W z d d ⎧ ⎫ ⎪ ⎪ ⎧ ⎫ ⎧ ⎫ ⎪ ⎪ ⎧ ⎫ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪= ⎪⇒ ⎪ ⎪ = ⎨ ⎬ ⎨ ⎬ ⎨ ⎬ ⎨ ⎬ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎩ ⎭ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎩ ⎭ ⎩ ⎭ ⎪ ⎪ ⎩ ⎭透視投影変換
(cont.)
` 視点 zv =−d,投影面 zv =0 のとき ` 点 (xv,yv,zv) と投影点 (x0,y0,z0) の関係は次式となる. v z v x v y v z = −d(
x y zv, v, v)
(
x y z0, 0, 0)
0 0 0 0 0 , , 0 , , 0 1 1 v v v v d v v v v x x y y x y z x y z d = z + d d = z + d = ⇒ = + z d = + z d =透視投影変換
(cont.)
` 視点 zv =−d,投影面 zv =0 のとき(cont.) ` これらの関係を同次座標で表せば次式となる. ` 実際,次のようになる. ` d→∞ のとき 平行投影変換となる. 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 v v v X x Y y Z z W d ⎧ ⎫ ⎡ ⎤ ⎧ ⎫ ⎪ ⎪ ⎢ ⎥ ⎪ ⎪ ⎪ ⎪ = ⎢ ⎥ ⎪ ⎪ ⎨ ⎬ ⎢ ⎥ ⎨ ⎬ ⎪ ⎪ ⎢ ⎥ ⎪ ⎪ ⎪ ⎪ ⎣ ⎦ ⎩ ⎭⎪ ⎪ ⎩ ⎭ 0 0 0 0 0 0 0 1 0 1 1 0 v v v v v v v x X x z d x Y y x y Z z d z W z d ⎧ ⎫ ⎪ ⎪ ⎧ ⎫ ⎧ ⎫ ⎪ + ⎪ ⎧ ⎫ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪= ⎪⇒ ⎪ ⎪ = ⎨ ⎬ ⎨ ⎬ ⎨ ⎬ ⎨ + ⎬ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎩ ⎭ ⎪ ⎪ ⎪ ⎪ + ⎪ ⎪ ⎪ ⎩ ⎭ ⎩ ⎭ ⎪ ⎪ ⎩ ⎭正規化視座標系への変換
` 視点 zv =0,投影面 zv =d のとき ` 可視領域(viewing volume)を d≤zv≤f と仮定する. ` xv-yv に対する正規化視座標系 (xv’,yv’, zv’) v z v x v y ( ) max, max, d d x y d(
xfmax,yfmax, f)
max v v d y′ = y y(
)
max max, max max,
f d f d
x x y y f
(1,1, d)
正規化視座標系への変換
(cont.)
` 視点 zv =0,投影面 zv =d のとき(cont.) ` これらの関係を同次座標で表せば次式となる. ` 実際,次のようになる. max max 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 v d v v d v v v v X x x Y y y Z z W ′ ⎧ ⎫ ⎡ ⎤ ⎧ ⎫ ⎪ ′ ⎪ ⎢ ⎥ ⎪ ⎪ ⎪ ⎪ = ⎢ ⎥ ⎪ ⎪ ⎨ ′ ⎬ ⎢ ⎥ ⎨ ⎬ ⎪ ⎪ ⎢ ⎥ ⎪ ⎪ ⎪ ′⎪ ⎣ ⎦ ⎩ ⎭⎪ ⎪ ⎩ ⎭ max max max max 1 v v d v d v v d v d v v v v X x x x x x Y y y y y y Z z z z W ′ ⎧ ⎫ ⎧ ⎫ ′ ⎧ ⎫ ⎧ ⎫ ⎪ ′ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪= ⎪⇒ ⎪ ⎪ ⎪′ = ⎪ ⎨ ′ ⎬ ⎨ ⎬ ⎨ ⎬ ⎨ ⎬ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎩ ⎭ ⎩′ ⎪⎭ ⎪ ′⎪ ⎪⎩ ⎪⎭ ⎩ ⎭正規化視座標系への変換
(cont.)
` 視点 zv =0,投影面 zv =d のとき(cont.) ` さらに,正規化視座標系 (xnv,ynv,znv) を想定して,可視領域が 立方体に対応するような変換を考えよう. nv z nv y (1,1, 0) (1,1,1) v z′ = z max v v d x′ = x x max v v d y′ = y y(
)
max max , max max ,
f d f d x x y y f (1,1, d) 1 1 , , 1 1 1 nv v nv v v nv v v v v v x x y y d z d z d z d z z d f z d f d z β α α ′ ′ − ′ = = = + = + ′ ′ ′ − ′ − ′ ⎧ =
正規化視座標系への変換
(cont.)
` 視点 zv =0,投影面 zv =d のとき(cont.) ` 正規化視座標系: (xnv,ynv,znv) への変換 ` 実際,次のようになる. 1 0 0 0 0 1 0 0 1 1 0 0 1 1 1 0 0 1 0 nv v nv v nv v nv X x Y y d Z z d f d f W d ⎡ ⎤ ′ ⎧ ⎫ ⎢ ⎥⎧ ⎫ ⎪ ⎪ ⎢ ⎥⎪ ⎪′ ⎪ ⎪ = ⎢ ⎥⎪ ⎪ − ⎨ ⎬ ⎨ ⎬′ ⎢ ⎥ ⎪ ⎪ − − ⎪ ⎪ ⎢ ⎥ ⎪ ⎪ ⎪ ⎪⎩ ⎭ ⎩ ⎭ ⎢ ⎥ ⎣ ⎦ ( ) ( ) ( ) ( ) ( ) 1 1 1 1 1 v v nv v v v nv v v nv v v x y x x z d z d y y z d d f z z d z d d f ′ ⎧ ⎫ ⎧ ⎫ ⎪ ⎪ ⎪ ′ ⎪ ⎧ ′ ′ ⎫ ⎪ ⎪ ⎪ ⎪ ⎪− + ′ ⎪⇒ ⎪ ⎪ ⎪= ′ ′ ⎪ ⎨ ⎬ ⎨ ⎬ ⎨ ⎬ ⎪ − ⎪ ⎪⎩ ⎪ ⎪⎭ − ′ + ⎪ ⎪ ⎪ ⎪ ⎪ ′ ⎪ ⎪ ⎪ − ⎪ ⎩ ⎭ ⎩ ⎭ 1 1 1 , 1 0 1 nv nv v nv v nv nv nv x x z d y z f y z z ⎧ ⎫ ⎧ ⎫ ⎧ ⎫ ⎧ ⎫ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ′ = ⇒⎨ ⎬ ⎨ ⎬= ′ = ⇒⎨ ⎬ ⎨ ⎬= ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎩ ⎭ ⎩ ⎭ ⎩ ⎭ ⎩ ⎭OpenGLの変換
` コンピュータで実行される変換の順番 ` OpenGLでは同次座標系の変換行列(4×4)を使って各種変 換を行っている. 点情報 A 1 陰線処理 画像変換 画像 2 1 n 2 1 ′ = v P P A A A v A2 … 幾何変換 An P1 投影変換 P2 vOpenGLの変換(cont.)
` void glMatrixMode(Glenum mode)
` mode に引数 GL_MODELVIEW, GL_PROJECTION, GL_TEXTUREを指定して,幾
何変換,射影変換,テクスチャー行列のどれを操作するか指定する.
` void glLoadIdentity(void)
` 現在対象としている行列を4x4の単位行列にする. ` 例えば glMatrixMode(GL_PROJECTION); /*射影変換の設定*/ glLoadIdentity(); /*初期化*/ gluPerspective(60.0, 1.0, 1.0, 10.0); …… glMatrixMode(GL_MODELVIEW); /*幾何変換の設定 */ glLoadIdentity(); /*初期化*/ glTranslatef(-1.0, 0.0, 0.0);/* x軸方向移動 */ glRotatef(-30.0, 0.0, 0.0, 1.0);/* 回転 */ glutWireTeapot(1.0);/* ティーポットを描画 */ …… v′ = P A A v1 2 1 2 A 0 = P I 0 = A I 1 A 1 P
OpenGLによる平行投影変換
` void glOrtho(Gldouble left, Gldouble right,
Gldouble bottom, Gldouble top, Gldouble near, Gldouble far) left right top bottom z v z 視点は無限遠方 v y = y = near (zv軸) far (zv軸)
OpenGLによる透視投影変換
` void gluPerspective(GLdouble fovy, Gldouble aspect, GLdouble near, Gldouble far)
v y = y z fovy aspect=w/h far (zv軸) near (zv軸) w h v z 視点は原点 v x = x
視点の位置
` void gluLookAt(GLdouble ex, GLdouble ey, GLdouble
ez, GLdouble cx, GLdouble cy, GLdouble cz, GLdouble ux, GLdouble uy, GLdouble uz)
` ux, uy, uz は、ウィンドウに表示される画像の上の方向を示す.
v
y = y
z
(ex, ey, ez) (z軸)
(cx, cy, cz) (z軸)
v
OpenGLの幾何変換
` 平行移動
` void glTranslatef(GLfloat x, GLfloat y, GLfloat z)
` 局所座標系を x, y, z 軸に x, y, z だけ移動する.
` 回転
` void glRotatef(GLfloat angle, GLfloat x, GLfloat y,
GLfloat z)
` angleは度数で指定する.例えば,X-Y平面で60度左に回転する場
合 glRotatef(60.0, 0.0, 0.0, 1.0);
` 伸縮
` void glScalef(GLfloat x, GLfloat y, GLfloat z)
` 各軸方向へ指定された値で伸縮させる.例えば,X,Y方向に半分の
OpenGLの幾何変換(cont.)
` glPushMatrix(), glPopMatrix() ` 変換行列を保存する. I スタック glLoadIdentity() A2A1 A3 A2A1 A2A1 glScalef() Push Pop A2A1 glScalef() Push A5A4 A2A1 A2A1 Pop glTranslatef() A2A1lesson4_1.c
lesson4_1.c(cont.)
` これ以降 trackball.c, trackball.h を利用する.
` glutMouseFunc(void (*func)(int button, int state, int x, int y)) func にはマウスのボタンが押されたときに実行する関数のポインタを与 える. button には押されたボタン (GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, GLUT_RIGHT_BUTTON),state には 押した (GLUT_DOWN) のか離した (GLUT_UP) のか,x と y にはそ の位置が渡される.
` glutMotionFunc(void (*func)(int x, int y))
func には,マウスのいずれかのボタンを押しながらマウスを動かしたと
きに実行する関数のポインタを与える.
GLUTのプリミティブ関数
` 丸型オブジェクト
` 円錐
` void glutWireCone(radius,
height, slices, stacks);
` void glutSolidCone(radius,
height, slices, stacks);
` 球体 ` void glutWireSphere(radius, slices, stacks); ` void glutSolidSphere(radius, slices, stacks); ` 特殊型オブジェクト ` トーラス ` void glutWireTorus(innerRadius,
outerRadius, nsides, rings);
` void glutSolidTorus(innerRadius,
outerRadius, nsides, rings);
` ティーポット ` void glutWireTeapot(size); ` void glutSolidTeapot(size); ` 面体オブジェクト ` 立方体 ` void glutWireCube(size); ` void glutSolidCube(size); ` 四面体 ` void glutWireTetrahedron(void); ` void glutSolidTetrahedron(void); ` 八面体 ` void glutWireOctahedron(void); ` void glutSolidOctahedron(void); ` 十二面体 ` void glutWireDodecahedron(void); ` void glutSolidDodecahedron(void); ` 二十面体 ` void glutWireIcosahedron(void); ` void glutSolidIcosahedron(void);
ダブルバッファリング
` ダブルバッファリング
` glutInitDisplayMode(GLUT_DOUBLE) を指定して
glFlush() の代りに glutSwapBuffers() を使用する.
` int glutSwapBuffers(void)
` ダブルバッファリングの2つのバッファを交換することでちらつきを防
ぐ.
ディスプレイのリフレッシュレートが 60Hz であれば,バッファの交換は
lesson4_2.c
lesson4_3.c
OpenGLによるアニメーション
lesson7_1.c, lesson7_2.c
` ティーポットを回転させる.
` void glutIdleFunc(void (*func)(void))
` 入力イベントがない場合,引数 func (関数のポインタ)で指定した
lesson7_3.c
` 回転するドーナツとティーポットのウォークスルーアニ メーション
マルチボディダイナミクス
一般化座標表現
` 一般化座標 ` 拘束条件 ` 一般化外力 ( ) ( ) ( ) ( )( )
(
)
(
)
(
)
( ) ( )( )
(
)
(
)
( )
( )
{
∈ = 0 = 0}
= ∈ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎝ ⎛ = = ∈ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎜ ⎝ ⎛ = 0 , 0 0 , 4 , , 2 , 1 0 12 1 4 1 3 1 2 1 q q q q q q q ,T H Q Q r ,T H x x r r G r G r θ ( )1 Ω ( )2 Ω ( )3 Ω ( )1q
( )2q
( )3q
P
( )4 Ωx
1 2x
( )
11 12 : R R → = Φ q Φ 0( )
(
)
(
2)
12 0,T L ∈ P ( )4q
拘束条件
` 詳細( )
( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) sin cos sin sin cos cos sin cos 4 3 3 2 3 2 2 3 , 2 2 2 3 1 2 3 , 2 2 1 2 1 , 2 2 2 1 2 , 1 1 2 2 1 , 2 2 1 1 2 , 1 1 1 1 2 1 4 , 1 4 2 1 1 1 4 , 1 4 1 ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎞ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛ − + − + + − − + − − − + − + = θ θ θ θ θ θ θ θ θ G G G G G G G G G G G G G x x x l x x l x l x l x l x l x x l x x l x q Φ ( )1,4 l ( )1,2 l ( )1 q q( )2 ( )3 q ( )4 q ( )2,3 l ( )2,1 l制約付変分原理
` 作用積分の停留化問題 (Hamilton の原理) に拘束条 件を加えた制約付停留化問題 ` 最適性の条件 ` 拘束条件の時間微分( ) ( ) ( )
{
}
( )
=∫
⋅( )
=∫
⋅ ⋅ − − = ∈ ∈ T T Q t U t T U T L 0 0 , d , d 2 1 , ze stationali q P q q M q q λ q q λ q λ q 11 Φ R( )
(
)
(
)
0 0 = = − − ⇒ ⋅ + ⋅ − − = + + =∫
→ Φ Φ Φ Φ , d , lim , T 0 T 0 λ P q M λ q λ P q M λ λ q q λ q q q δ δ ε εδ εδ δ ε T t L L q q q q q q q q q q ∵ ⎟⎟⎠ ⎞ ⎜⎜ ⎝ ⎛ ∂ ∂ ∂ ∂ + ∂ ∂ = ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ = ∂ ∂ ∂ ∂ = ∂ ∂ + ∂ ∂ = T T 2 2 T T T d d , 0 d dΦ Φ Φ Φ Φ Φ Φ Φ t t t t微分代数方程式
` 最適性の条件と拘束条件の時間2階微分より微分代数
方程式(DAE: differential-algebraic equations)を 得る. ( ) ( ) ( ) ( ) ( ) ( )
(
)
( )
(
)
⎪ ⎪ ⎨ ⎧ − = − = ⇒ ⎪ ⎪ ⎪ ⎩ ⎪ ⎪ ⎪ ⎨ ⎧ ∂ ∂ = ∂ ∂ = = ⎟⎟ ⎠ ⎞ ⎜⎜ ⎝ ⎛ = ⎟⎟ ⎠ ⎞ ⎜⎜ ⎝ ⎛ ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎝ ⎛ − − − − − M M M M A q B AP q q q q γ q M γ P λ q M q q q q q q q q 1 1 T 1 T 1 1 T T T 4 4 4 1 1 1 T , , , , , , , diag 0 Φ Φ Φ Φ Φ Φ Φ Φ Φ I m m I m m微分代数方程式
(cont.)
` 詳細 ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ⎟⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ ⎛ − − − − − − = 0 0 0 0 0 sin cos sin sin cos cos sin cos 2 3 , 2 2 2 2 3 , 2 2 2 2 1 , 2 2 2 1 2 , 1 2 1 2 1 , 2 2 2 1 2 , 1 2 1 1 4 , 1 2 1 1 4 , 1 2 1 θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ θ l l l l l l l l γ時間積分法
` 2次の Runge-Kutta 法 ( ) ( ) ( )( ) ( ) ( )
( )
( )
( )( ) ( )
( )
( )
(
( ) ( )
)
( )
( )
( )
( )
( )
( ) ( )
( )
( )
( )
( )
( )
(
( ) ( )
( )
( )
)
( )
( )( )
( )
( )
( )
( ) ( ) ( )( )
( )
⎧ = ⎩ ⎨ ⎧ = = ⇒ ⎩ ⎨ ⎧ = = + ⇒ Δ + Δ + Δ + + = Δ Δ + Δ + + Δ + = Δ ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ Δ + Δ ∂ ∂ + + Δ + = Δ Δ + + Δ + = Δ + Δ + Δ + = = Δ + = → = + + + b a b b a t O t t b t t b a t t t O t t t b t t a t t t O t t t t b t t a t t t t t b t t a t t t O t t t t t t N k t t t T k k k k k k k k k T k k k k k k k k k k k k k k n 3 2 2 2 1 3 2 1 1 2 / 1 2 / 1 2 / 1 1 2 and 1 2 1 2 1 , , 2 , 1 , 0 , , 0 : z z f z z z f z f z z z z f z f z f z z z f z f z z z z z z z z f z R時間積分法
(cont.)
` 4次のRunge-Kutta 法( )
( )
(
)
( ) ( )
( )
( )
( )
( )
( )
(
)
⎪ ⎪ ⎪ ⎪ ⎩ ⎪⎪ ⎪ ⎪ ⎨ ⎧ Δ + = ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ Δ + = ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ + Δ = = Δ + + + + = = Δ + = → = + + t t t t t t t t t t N k t t t T k k k k k k k k n 3 4 2 3 1 2 1 4 3 2 1 1 1 2 2 where 6 2 2 , , 2 , 1 , 0 , , 0 : k z f k k z f k k z f k z f k k k k k z z z z f z R有限要素モデル
` Ω2 の有限要素モデル
` Femap Ver9.1.0 を使用
` 総節点数: 5,491
表面要素の描画
` 要素と節点のデータ構造 ` 要素 ` ラベル: n ` 構成されている節点: i , j , k ` 節点 ` ラベル: i ` 座標値: ix , i y, i zi
j
k
n
for( n=0 ; n<N ; n++ ){ glBegin( GL_TRIANGLES );glVertex3d( n. i. i_x, n. i. i_y, n. i. i_z); glVertex3d( n. j. j_x, n. j. j_y, n. j. j_z); glVertex3d( n. k. k_x, n. k. k_y, n. k. k_z); glEnd();
アニメーション結果
参考文献
1. C言語によるプログラミング 基礎編(第2版) / 応用編(第2版),内 田智史(監修) / スーパーリファレンス編, 内田智史ほか,オーム 社 2. OpenGLによる3次元CGプログラミング, 林武文, 加藤清敬, コロ ナ社, 2003. 3. 3次元CGの基礎と応用, 千葉則茂,土井章男著, サイエンス社, 2004. 4. CAD/CAM/CGのための形状処理工学入門,嘉数侑昇,古川正志 著,森北出版,1995.5. コンピュータグラフィックス 理論と実践, James D. Foley, Steven K. Feiner, Andries van Dam, John F. Hughes: 佐藤 義雄
(訳), オーム社, 2001.
6.
http://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html