アニメーション...
Transcript of アニメーション...
アニメーション(物理シミュレーション)
コンピュータグラフィックス基礎(第9回)
アニメーションの原理
原理◦ 少しずつ変化する画像を連続して表示することで物体やシーンの動きが認識される◦ 1秒間に30枚程度(FPS: Frame Per Sec)
2次元のセルアニメーション◦ 少しずつ変化する2次元画像を作成◦ 作成した画像を連続的に表示する
3次元のCGアニメーション◦ 3次元シーンを少しずつ変化させる◦ レンダリングによって画像を生成する◦ 作成した画像を連続的に表示する
2D・3Dアニメーションの比較
2Dセルアニメ◦ 1枚1枚の絵を「ほぼ手描きで」作成する◦ 3次元シーン全体を作る必要がない(見えるところだけの情報でよい)
◦ 様々な変形、誇張表現、現実的でない動きが表現できる
◦ 後からの変更(視点の変更など)が原則できない◦ 複雑な立体形状の扱いが難しい
3DCGアニメ◦ 3次元シーンやキャラクタのモデリングに膨大な時間がかかる
◦ 形ができてしまえば、好きな視点から見た映像を作りだせる
◦ 動きを後から与え、編集できる◦ 破壊、炎上など複雑な物理現象の際限が難しい
3Dアニメーションでの動きの生成
シーン内の移動◦ カメラ位置、向きの連続的な変更
物体の動き◦ 物理シミュレーション 剛体運動のシミュレーション 服、髪、煙、炎など様々なシミュレーション
人物の動き◦ モーションキャプチャデータなどによる動きの組み込み
キーフレームアニメーション
◦ 全てのフレームの位置や向きを指定するのは手間がかかる。◦ 代表フレーム(キーフレーム)を用い、その間のフレームを自動的に補間する◦ 補間パラメータ:物体位置、向き、大きさ、色およびカメラパラメータ
キーフレームの補間方法
単純直線補間 なめらかな動きの生成が困難
スプライン補間 スプライン曲線による滑らかな補間
2006/7/10 Computer Graphics 7
キーフレームアニメーションの制御 テンションの制御
◦ 誇張表現
イーズイン・イーズアウト
◦ 速度変化を滑らかにすることにより、画面へのキャラクタの入り方、出方を滑らかに
キャラクタ・アニメーション
パスアニメーション
◦ 曲線(パス)や曲面に沿って移動させ、自動的に姿勢を変えながらアニメーションを生成
◦ 物体、カメラ双方に利用
◦ パス上で様々なデータ(3次元位置や法線ベクトルの向きなど)を補間
画像のモーフィング
◦ ある画像を別の画像に滑らかに変化させる手法◦ 画像Aと画像B上で、対応点を指定◦ 2枚の画像の混合比をもとに画像の2次元変換を行い、合成画像を生成
形状変形アニメーション
パーティクル(粒子)の応用◦ 物理シミュレーション◦ 乱数を利用したパラメータの変化◦ 雨、噴水、滝、炎、煙 など
形状変形アニメーション
自由形状変形(Free Form Deformation: FFD)◦ 柔軟な物体の形状変形を実現
◦ オブジェクトを囲む格子点を動かすことで内部の空間を変形、それに応じてオブジェクトを変形
有限要素法による変形の再現(シミュレーション)
手続き型アニメーション
進化・生長のアニメーション◦ 植物の生長過程をモデル化し、自動でアニメーションを生成◦ 受光量や植生等の環境要因を考慮
物理法則・自然法則をシミュレートすることによる動きの生成
手続き型アニメーション
自然現象 流体や火花など、不定形オブジェクトのアニメーション
流体:ナビエ・ストークス方程式(粘性流体の挙動を記述するための運動方程式)
スケルトン法
キーフレーム法◦ 複雑な形状 → キーフレーム間の対応点が数くなる
スケルトン法◦ 動物、人間など、骨格形状が既知の対象にスケルトンを当てはめ、形状を変化
2006/7/10 Computer Graphics 15
キャラクタ・アニメーション
フォワードキネマティクス 多関節物体を階層構造で表現 目的とする動作を得るため、各関節の回転角度を直接指定
初期位置
目標位置
キャラクタ・アニメーション
インバースキネマティクス 目的位置を指定することで、その間の各関節角度を自動計算
逆運動学による動作付け(Inverse Kinematics)
解が一意に決まらない↓
効果的な制約条件の付与(曲がりやすさ、可動範囲など)
キャラクタ・アニメーション
筋肉変形アニメーション
◦ 筋肉→骨→肉体→皮膚の解剖学構造をモデル化
◦ 筋肉の伸縮→骨→肉体の変形
◦ 演者の実際の動きを測定し、動きデータを収集◦ 微妙で自然な動作を表現可能◦ 個人の形状、個人の運動 ⇔ 一般的なCGモデル
モーションキャプチャ
http://www.youtube.com/watch?v=19u7IBZ6dJ8
モーションデータ
人体を多関節体として扱う
40程度の自由度関節の角度により人間の姿勢を表す
骨格の自由度
基準点(腰)の自由度(位置+向き)6肘・ひざ :自由度1肩、首:自由度3◦ 各関節の角度の時間変化によって動作を表現できる
Popovic et al. © 1995
表情のアニメーション
◦ FACS(Facial Action Coding System)に基づく幾何学変形手法
◦ 運動方程式に基づく物理変形手法
布地のアニメーション
◦ ばね-質点系モデルによる変形予測
リアルタイム・アニメーション
画像生成の高速化・簡略化◦ モデルの適応的な詳細度(LOD)制御◦ ビデオゲーム、テレビのバーチャルセット等
動きの数値シミュレーション
動きを伴う物理現象をシミュレートする◦ 惑星の動き◦ 剛体の落下、衝突◦ 水・空気の流れ◦ 柔物体(布)の動き
自由落下のシミュレート
y
時刻を与えれば位置が数式から定まる。
このような簡単な数式で表現できることはまれ。
空気抵抗があったら? 風が吹いてきたら?
バネの振動
A
バネが1つだけなら簡単な数式で表現できる
複数のバネが連結すると数式で表現することが難しい
物理シミュレーション(オイラー法)の考え方
時刻Δt後の位置を知るにはx(t+Δt) = x(t) + Δt v(t)
時刻Δt後の位置=現在の位置+微小時間×現在の速度
速度も時刻によって変化するv(t+Δt) = v(t) + Δt a(t)時刻Δt後の速度=現在の速度+微小時間×現在の加速度
加速度も時刻によって変化するa(t) = F(t) / m(t)現在の加速度=現在加わっている力/現在の質量(通常は変化しない)
力も時刻によって変化するF(t) = ? ← 物理現象によって異なる。例:バネの力、空気抵抗など
加えられる力がわかる→加速度がわかる→速度がわかる→位置がわかる
2次元平面なら、それぞれがxとyの値を持つ3次元空間なら、それぞれがx,y,zの値を持つ
※ 自由落下の場合は加速度一定
自由落下の場合
時刻Δt後の位置を知るにはx(t+Δt) = x(t) + Δt v(t)
時刻Δt後の位置=現在の位置+微小時間×現在の速度
速度も時刻によって変化するv(t+Δt) = v(t) + Δt a(t)時刻Δt後の速度=現在の速度+微小時間×現在の加速度
加速度は一定(重力加速度)a(t) = g
(重力以外の)力は加わらないF(t) = 0
加速度一定→速度が更新される→位置が更新される
2次元平面なら、それぞれがxとyの値を持つ3次元空間なら、それぞれがx,y,zの値を持つ
物理シミュレーションのアルゴリズム
// ループ処理1. 物体に働く力を求める
さまざまに働く力を合計する・連結しているバネによって加えられる力・空気抵抗・重力
2. 働く力を用いて加速度を計算する3. 加速度を用いて現在の速度を更新する4. 現在の速度を用いて現在の位置を更新する
描画更新
※物体に働く力さえ適切に設定できれば、後は決まったルーチン
布のシミュレーション
布をどのような物理モデルで表現するか?
スプリング・マスモデル
質点をバネのネットワークで連結する柔物体のシミュレーションで広く使われる
実装が容易
Spring – Mass Model
各質点に働く力を独立に計算各質点の加速度・速度・位置を独立に計算
結果的に自然な布の動きが得られる
物理シミュレーションのアルゴリズム
double dt = 0.01; // 時間の刻み幅double t = 0; // 時刻をゼロに設定while(true) { // ループ処理でシミュレーションを実行
1. 物体に働く力を求めるさまざまに働く力を合計する・連結しているバネによって加えられる力・空気抵抗・重力
2. 働く力を用いて加速度を計算する3. 加速度を用いて現在の速度を更新する4. 現在の速度を用いて現在の位置を更新する
描画更新if(シミュレーション終了) break;
t += dt; // 時刻を進める}
※ 物体に働く力さえ適切に設定できれば、後は決まったルーチン
全ての質点で計算
全ての質点で計算
全ての質点で計算
全ての質点で計算
衝突判定
球と衝突(ワイヤフレーム)
球と衝突(面表示)
円柱と衝突(面表示)
課題
Vector3d クラスの活用方法について学ぶ◦ C++の演算子のオーバーロードを用いることで、+ - * % などの記号による演算を自分で定義できる。◦ ベクトルの計算が簡単に記述できる。
これまでの計算方法(x, y, z) の値を持つ3次元ベクトルのための Vector3d クラスを定義したとする。
(1) 値の設定Vector3d vecA;vecA.x = 1.0;vecA.y = 2.0;vecA.z = 3.0;
(2) 代入Vector3d vecB;vecB.x = vecA.x;vecB.y = vecA.y;vecB.z = vecA.z;
(3) 加算Vector3d vecC;vecC.x = vecA.x + vecB.x;vecC.y = vecA.y + vecB.y;vecC.z = vecA.z + vecB.z;
サンプルコードに含まれるVector3dクラスを用いた場合
演算子がオーバーロードされているので、次のような記述ができる(1) 値の設定Vector3d vecA;vecA.set(1.0, 2.0, 3.0);
(2) 代入Vector3d vecB;vecB = vecA;
(3) 加算Vector3d vecC;vecC = vecA + vecB;
課題
球の自由落下をオイラー法でシミュレートする
// =======================================================// 一定時間ごとに呼ばれる。// ここで、対象物の物理量(力、加速度、速度、位置)を更新する// =======================================================void timer(int value) {
if(bRunning) { // シミュレーション実行中の処理
/* 加速度(ball.a)を設定する処理 */
/* 加速度に基づいて、速度(ball.v)を更新する処理(単純に現在の速度に加速度を加算すればよい)*/
/* 位置(ball.p)の更新(単純に速度を加算すればよい)
}
glutPostRedisplay(); // 描画内容の更新glutTimerFunc(10 , timer , 0); // 一定時間後にこの関数を再実行する
}