キャラクタ・アニメーション 今日の内容 最終レポート課題

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