170 likes | 331 Views
ICG08 Modeler-3. TA : 大森・後藤・魏. Modeler プログラム概要. スケルトンのコンパイル プリミティブの追加 スライダーの追加 階層モデル アニメーション. 3D モデルを作ろう. 前回までに作成したプリミティブを積み木のように組み合わせて、自分の 3D モデルを作ろう 先生配布の課題内容を読むこと! プリミティブを「どの場所に」「どの向きで」「どんな大きさで」配置するかを 座標系の変換 で指定しよう. 座標系の変換. glTranslated(double x, double y, double z)
E N D
ICG08 Modeler-3 TA : 大森・後藤・魏
Modelerプログラム概要 • スケルトンのコンパイル • プリミティブの追加 • スライダーの追加 • 階層モデル • アニメーション
3Dモデルを作ろう • 前回までに作成したプリミティブを積み木のように組み合わせて、自分の3Dモデルを作ろう • 先生配布の課題内容を読むこと! • プリミティブを「どの場所に」「どの向きで」「どんな大きさで」配置するかを座標系の変換で指定しよう
座標系の変換 • glTranslated(double x, double y, double z) それぞれx, y, zだけ平行移動する • glScaled(double x, double y, double z) それぞれの軸方向にx, y, z倍スケーリングする • glRotated(double theta, double x, double y, double z) ベクトル(x, y, z)方向にtheta度だけ回転する • glPushMatrix() 現在の座標系の状態をスタックに記録する • glPopMatrix() スタックから座標系の状態を読み込む
3Dモデルを作ろう • 例えば以下のような3Dモデルを作りたい
階層モデリング • ジョイントで繋がっている部分で階層的に考えよう ①floor ②arm ③neck ④head(1) ⑤head(2) ⑥nail(1) ⑦nail(2) ⑧nail(3) ⑨nail(4) ④head(1) ⑤head(2) ③neck ⑧nail(3) ⑥nail(1) ⑦nail(2) ⑨nail(4) ②arm ①floor
y y x O O x 階層モデリング • 動かない部分(低階層部分)から作ろう! • 座標系を常に意識しよう! 左図のように配置したいが、drawBoxは「原点を一端とした直方体」
y y y O O x x O x 階層モデリング • 座標系をスタックに保存 • 座標系を平行移動 • 直方体を配置 • 座標系をスタックから読む glPushMatrix(); glTranslated(-2.5,0,-2.5); drawBox(5,0.01f,5); glPopMatrix();
y O x 階層モデリング • 後は同じ要領で! // draw arm glRotated(VAL(ROOT_ROT), 0.0, 0.0,-1.0); drawBox( 0.3, 3.0, 0.3); // draw neck glTranslated( 0.0, 3.0, 0.0); glRotated(VAL(NECK_ROT), 0.0, 0.0, 1.0); drawBox( 0.3, VAL(NECK_LENGTH), 0.3); ・・・(以降省略) ソースファイルhttp://www.cavelab.cs.tsukuba.ac.jp/icg/RobotArm.cpp
アニメーション • 恐竜の歩行アニメーションのサンプルを見てください ソースファイルhttp://www.cavelab.cs.tsukuba.ac.jp/icg/t_rex.cpp
アニメーション • 基本はパラパラ漫画 • draw関数内で描いている3Dモデルのパラメータを少しずつ変えていこう • 基本機能はスケルトンで実装されている • メニュー 「Animate」を「Enable」にすると、1秒に約30回draw関数を呼び出してくれる
アニメーション • draw関数の直前にVALの定義が書いてあるので、そこに2行追加しよう • draw関数内で、アニメーションのフレーム番号を管理しよう #define VAL(x) (ModelerApplication::Instance()->GetControlValue(x)) #define SVAL(x,y) (ModelerApplication::Instance()->SetControlValue(x,y)) #define ANIMATION (ModelerApplication::Instance()->GetAnimating())
フレーム番号の管理 • 方法その1 • フレーム番号を表すスライダーを追加する • (前回のスライドを参照) • 方法その2 • フレーム番号を表すスタティック変数を作る void T_RexModel::draw() { static int anim_counter = 0; ・・・(以下略)
アニメーション • アニメーション時と非アニメーション時は以下で判別できます if(ANIMATION) { // アニメーション時の処理を書く SVAL(XPOS, 0.3*cos(anim_counter*PI/180.0)); // (中略) // フレーム番号を更新 anim_counter++; anim_counter %= 360; } else { // 非アニメーション時の処理を書く } 方法その2の場合の例
アニメーション • スライダーで追加した変数の値はSVALを用いて変更しよう • フレーム番号を方法その1で実装した場合もSVALで • if文内ではパラメータ設定だけをして、モデル描画はif文の外で行うのがオススメ
アニメーション作成のコツ • 歩行などの周期的な動作の場合は、sinやcosをうまく使おう • 関節の多いモデルについて • 各関節毎にパラメータを設定した方がモデル作成は簡単 • 少ないパラメータ数で多くの関節を動かす方がアニメーション作成は楽かも • 動作を予め記述する方法以外にも、物理の方程式を解いて動かす事もできる • 振り子 • バネ • ボールの落下 etc. • リアルな動作に凝るも良し、ネタに走るも良し。頑張って下さい
Modeler課題提出方法 • 以下のスケルトンコードをダウンロードして使用してください http://130.158.80.141/~cai/Project/Project3/Project3-Modeler08.html • この資料はここにあります http://www.cavelab.cs.tsukuba.ac.jp/icg/modeler2008-3.ppt • 締め切りの日:2008-07-04 • 提出:cai@cs.tsukuba.ac.jp CC: icg-report@aoi3.cs.tsukuba.ac.jp • 件名式:kadai3(学籍番号) • Wordドキュメントにはオリジナルプリミティブと自分の3Dモデルの説明を書く