2014/12/9 コンピュータグラフィックス特論Ⅱ 第8回 キャラクタ・アニメーション コンピュータグラフィックス特論Ⅱ 第8回 キャラクタアニメーション(1) システム創成情報工学科 尾下 真樹 今日の内容 • キャラクタ・アニメーションの基礎 – キャラクタの表現 – モーションデータ • キャラクタ・アニメーションのためのプログラミング – 多関節モデル、ワンスキンモデルの表現 – BVHモーションデータの読み込みと描画 • モーションデータの作成 • キャラクタ・アニメーション技術 – モーションデータの変形 – キャラクタの自律動作制御 • CGによる人間などのキャラクタのアニメー ションを実現するための技術 • キャラクタアニメーションの用途 – オンラインアニメーション生成(ゲームなど) – オフラインアニメーション生成(映画など) • どちらの用途でも使われる基本的な技術は同じ (データ量や詳細度が異なる) • ただし、オンラインアニメーションの場合は、インタラ クティブに動作を決める必要があるので、そのための 工夫が必要になる 最終レポート課題(予告) • レポート課題 – 講義で学習した内容を利用して、何らかのプログラムを作 成する • • • • なるべく実用的なプログラムの方が望ましい 講義で学習した範囲外の技術を自分で勉強して使っても構わない なるべく2つ以上の技術を組み合わせることが望ましい 昔自分で作成したプログラムの改良でも良い (追加内容のみを評価対象とする) – 1月9日(金) プログラム+スライド提出締め切り(予定) • 発表(プレゼンテーション) – 1月13日・1月20日の授業中 – 1人 発表 8分・質疑 5分(予定) 人間の各要素の表現 • 人体の表現 キャラクタ・アニメーションの基礎 – 全身の骨格・形状の表現 – 顔の表現 • 細かい表情変化を表現するため には体とは別のモデルが必要 • 付属物の表現 – 髪の毛や衣服など • シミュレーションによる動きの計算 1 2014/12/9 コンピュータグラフィックス特論Ⅱ 第8回 人間の骨格・形状の表現 • 人間を多関節体として扱う – 人体の形状モデルは、骨格 の動きに応じて変形 – 人間の骨格をモデル化する のに、大体40~200くらいの 自由度が必要になる • 基本的な関節だけで 40弱 • 手の指や足の指なども入れる と 200自由度くらい必要 人間の動きのデータ • 多関節体の姿勢の表現 – 腰の位置・向き(6自由度) – 各関節の回転角度(n自由度) • 関節角度(姿勢)の時間変化に より多関節体の動きを表現 – 全関節の角度により人間の 姿勢を表せる Popovic et al. © 1995 関節の回転の表現 • キーフレームアニメーションの回に学習した、 3種類の向きの表現方法のどれかを使用 – オイラー角による表現 – 回転行列による表現 – 四元数による表現 • これらの表現は互いに変換可能なので、必要に応じ て変換できる • 複数の表現を持たせるようにしても良い(どちらにし てもレンダリング時には回転行列が必要) ワンスキンモデル • 人間の形状を全身で1つの ポリゴンモデルとして作成 • 骨格モデルの変形に応じて ポリゴンモデルの各頂点を移動 参考書 図4.16 関節の自由度の種類 • 3自由度関節 – 人間の大部分の関節は3自由度 • 1自由度関節 – ひじやひざなどの関節 • 2自由度以上も多少は回転可能 – オイラー角表現の場合は1つの回 転角度で表現できる – 回転行列・四元数の場合は1自由 度になるよう制約(なくても可) より高度な変形モデル • 人間の筋肉をモデリング – 骨格の動きに応じて筋肉を伸縮 – 筋肉の動きに応じて皮膚を変形 ※ 単純なワンスキンモデルよりもリアルな変形を 実現できる [Softimage XSI] 2 2014/12/9 コンピュータグラフィックス特論Ⅱ 第8回 剛体によるキャラクタの表現 モーションデータの例 • 各リンクを幾何形状モデルとして表す方法 • 仕様が公開されているフォーマットは少ない – 関節部分ではポリゴンがめり込むが、全体とし てはつながって見える • 正確な陰面消去が必要 • 境界が不自然になる – 昔はよく使われていた – ロボットなどの表現には有効 – BVH・BVA、ASF-AMC、 FBX(MotionBuilder)、VRML、X、COLLADA • BVH形式 – アスキー形式で扱いやすい – 骨格情報と動作情報(各時刻の姿勢)を持つ – 姿勢はオイラー角表現 • ASF-AMC形式 – 骨格(ASFファイル)+動作(AMCファイル) – アスキー形式、姿勢はオイラー角表現 BVH形式の例(1) • 骨格情報 BVH形式の例(2) • 動作情報 HIERARCHY ROOT Hips { OFFSET 0 0 0 CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation JOINT LeftHip { OFFSET 3.43 0 0 CHANNELS 3 Zrotation Xrotation Yrotation JOINT LeftKnee { OFFSET 0 -18.47 0 CHANNELS 3 Zrotation Xrotation Yrotation JOINT LeftAnkle { ・・・ MOTION Frames: 119 Frame Time: 0.033333 0.10 40.50 1.60 -0.24 -2.63 2.74 2.91 -2.99 -7.38 0.00 9.65 0.00 -2.93 -6.03 8.51 -2.92 1.64 -8.20 0.00 0.00 0.00 4.06 -0.50 -5.97 0.97 1.48 2.61 -5.28 5.05 4.56 13.23 1.16 -13.80 0.00 -24.15 0.00 -6.44 4.51 -13.38 1.52 4.52 -15.92 -11.11 -2.84 27.50 0.00 -9.85 0.00 -0.08 -10.67 5.92 1.51 -1.19 -4.58 2.76 10.20 1.32 ・・・ 説明内容 • デモプログラム キャラクタ・アニメーションのための プログラミング • 多関節モデルの表現 • ワンスキンモデルの表現と変形 • 動作データの読み込みと再生 3 2014/12/9 コンピュータグラフィックス特論Ⅱ 第8回 デモプログラム(1) • BVH動作データの再生 デモプログラム(2) • キャラクタの表示 – 市販のアニメーションソフト (3ds max)で作成したキャラ クタのデータを独自形式で エクスポートしておく – 独自形式ファイルの読み込み とキャラクタの表示 – BVH動作データを読み込んで再生 – BVH動作データに記述されている骨格を表示 – LキーでBVHファイルを選択 • BVHファイルは講義のページ には置いていないので、各自、 ネット上に公開されているもの などを探すこと • インバース・キネマティックス – 手先の位置・向きをマウスで 操作すると、それに合わせて 姿勢を変化させる 多関節モデルの表現方法(1) • 最も単純な表現方法 – 各リンクを表すクラスを定義 – リンクに含まれる情報 • 骨格情報 (固定情報) – 隣接リンク – 隣接リンクとの距離 – (スキニング情報) 多関節モデルの表現方法(1) // 多関節体の骨格・姿勢を表す構造体 struct Joint { // 関節階層(親関節) Joint * parent; // 関節階層(子関節) vector< Joint * > children; // 親関節からの接続位置 double offset[3]; // ルート関節かどうかのフラグ bool is_root; • 姿勢情報 (動作によって変化する) // ルート関節の位置・向き(ルート関節のみが持つ) double root_pos[ 3 ]; double root_angles[ 3 ]; // オイラー角表現 // 親関節に対する相対的な回転(ルート関節以外が持つ) double axis_angles[ 3 ]; // オイラー角表現 – 親リンクに対する相対的な回転 – ルート関節の位置・向き }; 多関節モデルの表現方法(2) • 骨格情報と姿勢情報を分ける方法 – 骨格情報を表すクラス(基本的に固定の情報) – 全身の姿勢を表すクラス • 腰の位置・向き(6自由度) • 各関節の回転(n自由度) – こちらの方法の方が使いやすい • 同一骨格の複数の姿勢データが表せる • 同じキャラクタが複数登場するときも骨格データは1 つで済む 多関節モデルの表現方法(2) // 多関節体の骨格・姿勢を表す構造体 struct Joint { // 関節階層(親関節) Joint * parent; // 関節階層(子関節) vector< Joint * > children; // 親関節からの接続位置 double offset[3]; }; // 多関節体の骨格を表す構造体 struct Skeleton { // ルート関節(関節のツリー構造により全骨格を表現) Joint * root_joint; }; 4 2014/12/9 コンピュータグラフィックス特論Ⅱ 第8回 多関節モデルの表現方法(2) // 多関節体の骨格を表す構造体 struct Skeleton { // ルート関節(関節のツリー構造により全骨格を表現) Joint * root_joint; }; // 多関節体の姿勢を表す構造体 struct Posture { Skeleton * body; double root_pos[ 3 ]; // ルート関節の位置 double root_angles[ 3 ]; // ルート関節の向き(オイラー角表現) double * axis_angles; // 各回転軸周りの回転(オイラー角表現) }; ワンスキンモデルの作成 • ワンスキンモデルに必要な情報 – 骨格構造の情報 – 全身の幾何形状データ – 骨格構造の各リンクから 幾何形状の各頂点への ウェイト • m×n の行列データ (リンク数m、頂点数n) • 通常はアニメーションソフトを 使って作成したモデルを利用 ワンスキンモデルの出力 ワンスキンモデルの表現方法 • 一般的に仕様が公開されているワンスキンモデル のファイル形式は少ないので、適当な独自形式を 使うのが一般的 • 変形のためのウェイト情報を2次元配列に よって表現 – FBX、Collada、X などは、ワンスキンモデルも利用可能 • 各情報を個別に出力して読み込むことも可能 – 骨格構造の情報 → BVH形式で出力できる – 全身の幾何形状データ → Obj形式などで出力できる – 骨格構造の各リンクから幾何形状の各頂点へのウェイト → ソフトによっては独自のテキスト形式で出力可能 ワンスキンモデルの変形方法 • 各頂点の位置を、各体節の変換行列とウェ イトに応じて計算 pi wij M j p i 0 p j 0 j pi 各頂点の位置 M j 各体節の変換行列(姿勢から計算される) wij 各頂点が各体節から受けるウェイト pi 0 各頂点の初期位置(形状データ内での位置) p j 0 各体節の初期位置(形状データ内での位置) // ワンスキンモデルの表現方法 struct OneSkinModel { // 骨格情報 Skeleton * skeleton; // 幾何形状情報 Geometry * geometry; // 変形のためのウェイト情報 double ** weight; // wheight[頂点番号][体節番号] の2次元配列 }; モーションデータの表現方法 • 一定間隔データ – BVH形式のように、一定間隔ごとの各フレームの姿勢 データを持つ方法 – 姿勢データの配列により表現 • キーフレームデータ – キーフレームの姿勢データのみ持ち、中間の姿勢は補 間によって求める方法 • ルートの位置・回転の補間、関節の回転の補間の方法について は以前の講義で学習した通り – (時刻、姿勢データ)の組の配列により表現 • 各関節ごとの別のキー時刻を持つ方法もある 5 2014/12/9 コンピュータグラフィックス特論Ⅱ 第8回 BVHファイルの読み込み • BVH形式の例 – 詳しい仕様はネット上で見つかる – 参考ページ(日本語): http://www.tmps.org/index.php Programming Tips > Character Animation > MOCAP • BVHファイルからの骨格情報とモーションデータ (姿勢情報の配列)の読み込み処理の例 – サンプルプログラムを参照 – ファイル読み込みの実現方法については、幾何形状 データの読み込みの回で説明した通り サンプルプログラム • BVHクラス – BVHデータ構造の定義 • なるべく BVH形式に近い形式で定義 • 骨格情報 + 動作情報 – BVHファイルの読み込み – 読み込んだ動作データの任意のフレーム番号 の姿勢を描画 • BVHのサンプルデータ – Eyes, Japan によるモーションキャプチャライブラリ http://www.mocapdata.com/ 今日の内容 • キャラクタ・アニメーションの基礎 – キャラクタの表現 – モーションデータ 動作データの作成 • キャラクタ・アニメーションのためのプログラミング – 多関節モデル、ワンスキンモデルの表現 – BVHモーションデータの読み込みと描画 • モーションデータの作成 • キャラクタ・アニメーション技術 – モーションデータの変形 – キャラクタの自律動作制御 動作データの作成 • 動作のデータの主な作成方法 – モーションキャプチャ – 手作業によるキーフレームの編集 • 動作データの表現方法 – 一定間隔データ • モーションキャプチャデータは通常こちらで表現 – キーフレームデータ • 手作業での編集にはこちらの方が向いている ※ アニメーションソフトの機能で一定間隔データ からキーフレームデータへの変換も可能 キーフレームの編集 • キーフレームにおける姿勢の編集 – 基本的にはアニメータが各キーフレームの時 刻・姿勢を手作業で設定 • かなりの時間・労力がかかる • 主な編集方法 – 関節の回転を操作 – 各部位の位置を操作 • 部位の位置に合わせて 関節の回転を自動計算 (インバース・キネマティックス) 6 2014/12/9 コンピュータグラフィックス特論Ⅱ 第8回 キネマティックス(運動学) • フォワード・キネマティックス(順運動学) – 多関節体の関節回転が決まれば、各部位の 位置・向きが求まる – 多関節体の表現の基礎になる考え方 インバース・キネマティックス • インバース・キネマティックスで生じる問題 – アンダー・コンストレインツ(少な過ぎる制約) • ある部位の位置・向きを指定しただけでは姿勢が一 意に決まらない • インバース・キネマティックス(逆運動学) – 各部位の位置・向きから、多関節体の関節 回転を計算する技術 – 動きを指定する時、関節回転よりも、手先の 位置・向きなどを使った方がやりやすい – 手先などの移動・回転量が与えられた時、そ れを実現するための関節回転の変化を計算 – 例:手の位置がきまっても、その手の位置を実現するような 全身の関節角度の組は無数に存在する • 何らかの評価基準を入れて適当な解を決定 – 例:前ステップの姿勢との差がなるべく小さくなる解を選択 – オーバー・コンストレインツ(多過ぎる制約) • 逆に制約が多すぎて、与えられた制約を満足する姿 勢がない インバース・キネマティックス • いくつかの計算方法がある – 数値的解法(Numerical) • • • • デモプログラム • インバース・キネマティックス(IK)計算のデモ – このプログラムでは解析的解法を使用 擬似逆行列を使った計算方法 非線形計算による計算方法 Cyclic Coordinate Descent(CCD)法 粒子法(Particle-IK) – 解析的解法(Analytical) IKの数値的解法(1) • ヤコビ行列による計算 – 各関節の角度を微小変化させたときの、 末端部位の微小変化を計算 Jθ p • θ 支点から末端までの各関節の角度変 化(n次元) • p 末端部位の位置・向き変化(3or6 次元) 向きにはオイラー角や部位の軸などを使用 – p を満たすような θ を計算 • 通常 n>3or6 なので解は一意に決まらない IKの数値的解法(2) • ヤコビ行列の計算 – 各関節の角度を微小変化させたときの、 末端部位の微小変化 J Jj θ p 関節から末端へのベクトル J j aˆ j l j j番目の関節の回転 回転軸の向きを表す単位ベクトル に応じた末端の変化 θ j lj aˆ j p Jj p θ j 7 2014/12/9 コンピュータグラフィックス特論Ⅱ 第8回 IKの数値的解法(3) IKの数値的解法(4) • 擬似逆行列による計算 • 零空間写像による他の制約の導入 – Jは正則ではなので逆行列は計算できない – 擬似逆行列を使用( が最小となる解を計算) Jθ p θ J p J J T JJ T θ J p I J J θ – 第2項は末端部位の位置・向きは影響しない – 末端部位の位置・向きを満たしつつ、任意の修 正を適用できる 1 – 逆行列が計算できれば擬似逆行列は計算可能 • 重み付き擬似逆行列 – J には関係のない関節は含まないようにする 必要がある(逆行列が計算できない) θ J p J W 1J T JW 1J T 1 – W は各回転軸の重みを表す n×n 行列 IKの数値的解法(5) IKの解析的解法(1) • ヤコビ行列による計算方法の注意 • 人間の骨格に基づく効率的な計算方法 • 手足の解析的なIK計算 θ J p I J J θ – p の長さは十分小さく取る必要がある • リンク全体の長さの 2~10 % 以下 aˆ j θ j – 繰り返し計算によって少し lj ずつ姿勢を修正 – 姿勢が変わる度に J を p 計算し直す必要がある 本来は弧を描く移動量 – 腕・脚は7自由度 – 手先・足先の位置・向きは6自由度 – 残りの自由度は1(ひじ・ひざの回転)のみ • 何らかの方法でこれを決定すれば解は一意に決まる 手先の位置・ 向き(6DOF) 1DOF 3DOF 3DOF を直線で近似している 1DOF IKの解析的解法(2) モーションキャプチャ 1. 入力:手先の目標位置・向き、肩(胴体)の位置・ 向き、腕の2本の体節の長さ • 人間の体にセンサをつけて、人間の動きを 動作データとしてそのまま取り込む方法 2. 目標位置と肩の距離から、ひじの屈伸回転を計 算(1DOF) • モーションキャプチャ機器の方式 3. 手先が目標位置に来るように、肩の回転を計算 (2DOF) 4. 何らかの方法で、ひじの 旋回回転を決定(1DOF) 手先の位置・ 向き(6DOF) 5. 手先の目標向きに応じて、 手首の回転を計算(3DOF) 1DOF 3DOF – – – – 光学式 磁気式 機械式 赤外線自発式 3DOF 1DOF 8 2014/12/9 コンピュータグラフィックス特論Ⅱ 第8回 モーションキャプチャ機器の種類(1) 光学式モーションキャプチャ • 光学式 – 現在、主に使われている方式 – 体の各部位にマーカを付けて カメラで撮影 – 複数のカメラから姿勢を計算 – 姿勢の計算には時間がかかる マーカー位置 • 磁気式 ラベリング – 磁界を発生させて、体の各部位に つけたセンサの位置・向きを計算 – 比較的高速 姿勢(関節角度) モーションキャプチャ機器の種類(2) モーションキャプチャ機器の種類(3) • 機械式 • RGB-Dカメラ方式 – 体の各関節に回転角度を計測 するための計器を身に着ける – 身動きがしづらいのが難点 • 自発赤外線式 © spice inc. – 光学式の発展版 – 光学式に近いが、各マーカが 順番に自発的に発光する – ラベリング処理が容易になる – – – – Microsoft Kinect など 各ピクセルの奥行を計測 人体部位・姿勢の推定 他の方式より精度は低い • マーカレスカメラ方式 © Microsoft – 部位の長さが既知であれば、通常のカメラのみ でも姿勢推定は可能 – RGB-Dカメラを使うより、さらに精度は落ちる © PhoeniX Tech. Co. 動きのデータの作成方法の比較 • モーションキャプチャ – 人間の動きがそのまま取り込めるので、一見手軽そう – 実際には、ノイズや、俳優とキャラクタの骨格の違いなど のため、かなり編集が必要になる – そのままではキーフレームがないので編集がしづらい • キーフレーム編集 – ゼロから作らないといけないので大変 – キーフレームが設定されているので、修正はしやすい – 人間らしい細部の動きや自然さを実現するのは難しい • 両者の使い分けや組み合わせが必要 まとめ • キャラクタ・アニメーションの基礎 – キャラクタの表現 – モーションデータ • キャラクタ・アニメーションのためのプログラミング – 多関節モデル、ワンスキンモデルの表現 – BVHモーションデータの読み込みと描画 • モーションデータの作成 • キャラクタ・アニメーション技術 – モーションデータの変形 – キャラクタの自律動作制御 9 コンピュータグラフィックス特論Ⅱ 第8回 2014/12/9 次回予告 • キャラクタ・アニメーションの基礎 – キャラクタの表現 – モーションデータ • キャラクタ・アニメーションのためのプログラミング – 多関節モデル、ワンスキンモデルの表現 – BVHモーションデータの読み込みと描画 • モーションデータの作成 • キャラクタ・アニメーション技術 – モーションデータの変形 – キャラクタの自律動作制御 10
© Copyright 2024