drawBoxは「原点を一端とした直方体」

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
④head(1)
②arm
⑤head(2)
③neck
③neck
④head(1)
⑤head(2)
⑧nail(3)
⑨nail(4)
⑥nail(1)
⑦nail(2)
⑥nail(1)
②arm
⑦nail(2)
⑧nail(3)
①floor
⑨nail(4)
階層モデリング


動かない部分(低階層部分)から作ろう!
座標系を常に意識しよう!
左図のように配置したいが、drawBoxは
「原点を一端とした直方体」
y
O
y
x
O
x
階層モデリング
①
②
③
④
座標系をスタックに保存
座標系を平行移動
直方体を配置
座標系をスタックから読む
y
O
x
glPushMatrix();
glTranslated(-2.5,0,-2.5);
drawBox(5,0.01f,5);
glPopMatrix();
階層モデリング

後は同じ要領で!
// 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);
・・・(以降省略)
y
O
// draw arm
glRotated(VAL(ROOT_ROT), 0.0, 0.0,-1.0);
drawBox( 0.3, 3.0, 0.3);
x
ソースファイル
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行
追加しよう
#define VAL(x) (ModelerApplication::Instance()->GetControlValue(x))
#define SVAL(x,y) (ModelerApplication::Instance()->SetControlValue(x,y))
#define ANIMATION (ModelerApplication::Instance()->GetAnimating())

draw関数内で、アニメーションのフレーム番号を管理しよう
フレーム番号の管理


方法その1
 フレーム番号を表すスライダーを追加する
 (前回のスライドを参照)
方法その2
 フレーム番号を表すスタティック変数を作る
void T_RexModel::draw()
{
static int anim_counter = 0;
・・・(以下略)
アニメーション

アニメーション時と非アニメーション時は以下で判別できます
if(ANIMATION) {
// アニメーション時の処理を書く
SVAL(XPOS, 0.3*cos(anim_counter*PI/180.0));
// (中略)
方法その2の場合の例
// フレーム番号を更新
anim_counter++;
anim_counter %= 360;
} else {
// 非アニメーション時の処理を書く
}
アニメーション

スライダーで追加した変数の値は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
提出:[email protected]
CC: [email protected]
件名式:kadai3(学籍番号)
Wordドキュメントにはオリジナルプリミティブと自分の3Dモデルの説明を書く