スケルタルアニメーションとスキニング
キャラクターがなめらかに動く仕組みを、ボーン階層・線形ブレンドスキニング・頂点ウェイトの原理から理解でき、関節がつぶれる典型不具合や逆運動学の勘所まで押さえられます。
- 1.スケルタルアニメーションは頂点を直接動かさず、ボーン階層の姿勢行列でメッシュを変形する。各ボーンはバインドポーズからの相対変換として姿勢を持つ。
- 2.線形ブレンドスキニング(LBS)は頂点ごとの複数ボーンウェイトで変換行列を加重平均する軽量手法だが、大きなねじれ・屈曲で体積が痩せる。デュアルクォータニオンスキニングは回転を球面補間して破綻を抑える。
- 3.アニメーションブレンドは複数クリップの局所姿勢を補間して遷移や重ね合わせを作り、逆運動学は末端目標から関節角を逆算して接地や注視を合わせる。
頂点を直接動かさず「骨格」で変形する
キャラクターアニメーションの基本方針は、数万頂点のメッシュを1つずつ動かすのではなく、少数のボーン(骨)からなる骨格を動かし、その姿勢に追従してメッシュを変形させる ことです。これがスケルタルアニメーションで、頂点を骨に結び付けて変形する処理を スキニング と呼びます。アニメーターは十数〜百数十本のボーンの回転だけを制御すればよく、データ量も計算量も劇的に減ります。GPU がこの変形を頂点シェーダで並列に行う点は /hardware-components/ のグラフィックス関連項目とも関わります。
骨格は ボーンの階層(ツリー) として構成されます。ルート(多くは腰)から胸・首・頭、あるいは肩・肘・手首へと親子関係が連なり、親の変換が子へ伝播します。肩を回せば肘・手首・指が一体で付いてくるのは、この親子伝播の帰結です。各ボーンは自分の姿勢を 親ボーンの座標系に対する相対変換(局所変換) として持ちます。
バインドポーズと姿勢行列 ── 変形の基準を固定する
スキニングの土台は バインドポーズ(束縛姿勢、多くは T ポーズや A ポーズ)です。これはメッシュとボーンを結び付けた時点の基準姿勢で、各頂点はこのときの位置をモデル空間の座標として保持します。アニメーション中の各ボーンの姿勢は、このバインドポーズからの差分として扱われます。
ある頂点をあるボーンに追従させるには、次の2段階の変換を合成します。
1本のボーン b が頂点 v に与える変換:
M_skin(b) = M_world(b) × InvBind(b)
InvBind(b) : バインドポーズでの b のワールド変換の逆行列
(頂点をモデル空間からボーン b の局所空間へ移す)
M_world(b) : 現在の姿勢での b のワールド変換
(ボーン局所空間から現在のワールド空間へ移す)
v' = M_skin(b) × v
直感的には、まず InvBind で頂点を「ボーンにくっついた座標系」へ引き込み、その座標系ごと現在の姿勢 M_world で運ぶ、という2段構えです。M_world(b) 自体は階層をたどって親から順に局所変換を掛け合わせて求めます(M_world(b) = M_world(parent) × M_local(b))。バインドポーズでは M_world(b) = Bind(b) かつ M_skin(b) が恒等変換になり、メッシュが動かないことが保証されます。
頂点はモデル空間の絶対座標で格納されており、そのままでは「どのボーンにどれだけ付いていくか」の基準がありません。InvBind で一度ボーン局所空間へ移すことで、頂点はボーンとの相対位置に変換され、以後はボーンの姿勢変化をそのまま浴びます。逆バインド行列はモデルロード時に一度だけ計算してボーンごとに保存しておく定数で、実行時のコストはありません。
線形ブレンドスキニング(LBS)── 複数ボーンの加重平均
1頂点を1ボーンだけに付けると、肘や肩などの関節でメッシュが折り紙のように鋭く割れてしまいます。そこで実務では、1頂点を複数ボーンに、正規化されたウェイトで結び付けます。関節付近の頂点は上腕と前腕の両方から引かれ、なめらかに曲がります。
最も普及した手法が 線形ブレンドスキニング(LBS、Linear Blend Skinning。リニアブレンドスキニングや SSD とも) です。各ボーンのスキン変換行列を、頂点ごとのウェイトで加重平均します。
線形ブレンドスキニング:
v' = Σ_i w_i × ( M_world(b_i) × InvBind(b_i) ) × v
w_i : ボーン b_i のウェイト(影響度)、Σ w_i = 1
通常は影響ボーン数を 4 本に制限(GPU で vec4 に収まる)
→ 各ボーンが計算した変形後位置を、ウェイトで線形に混ぜる
LBS は 行列を直接ブレンドする のが特徴で、頂点シェーダで数回の行列積と加算に落ちるため極めて高速です。GPU スキニングの事実上の標準として長年使われてきました。ただし本質的な弱点があります。
回転行列を線形補間すると、その中間は もはや正しい回転ではありません(直交性が崩れ、スケールが縮む)。前腕を 180 度ひねると、前腕側と手側のウェイトが拮抗する断面で行列平均が退化し、あたかも飴の包み紙をねじったように 体積がつぶれて細くなる 現象が起きます。これがキャンディラッパー(candy-wrapper)問題です。肩や股関節など大きくねじれ・屈曲する関節ほど顕著で、LBS の原理的限界です。
デュアルクォータニオンスキニング ── 回転を正しく混ぜる
キャンディラッパー問題の根本原因は「回転を行列のまま線形補間したこと」にあります。これを解くのが デュアルクォータニオンスキニング(DQS、Dual Quaternion Skinning) です。剛体変換(回転+平行移動)を デュアルクォータニオン という8次元の量で表し、ブレンド後に正規化することで、補間の全過程で「正しい剛体変換」であり続けます。
デュアルクォータニオンスキニング:
1. 各ボーンの剛体変換をデュアルクォータニオン q_i に変換
2. dq_blend = normalize( Σ_i w_i × q_i ) // 加重和のあと正規化
3. dq_blend を頂点に適用して v' を得る
実部(通常のクォータニオン)が回転、双対部が平行移動を担う。
正規化により、結果は常に「回転+平行移動」=体積を保つ剛体変換になる。
DQS は回転成分を実質的に 球面的に補間 するため、ねじれても体積が保たれ、キャンディラッパー問題が起きません。代償として、行列より計算がやや重く、逆に強く曲げた内側が膨らむ ジョイントバルジ(bulging)が出ることがあります。実装上は符号を揃える(最短経路の補間にする)処理も要ります。用途に応じた両者の使い分けが定石です。
| 観点 | 線形ブレンドスキニング(LBS) | デュアルクォータニオンスキニング(DQS) |
|---|---|---|
| ブレンド対象 | 変換行列を線形補間 | デュアルクォータニオンを補間して正規化 |
| 回転の扱い | 行列平均で直交性が崩れる | 球面的に補間され剛体性を保つ |
| 主な破綻 | キャンディラッパー(体積が痩せる) | ジョイントバルジ(曲げ内側が膨らむ) |
| 計算コスト | 軽い(行列積と加算) | やや重い(変換・正規化・符号処理) |
| 向く場面 | 曲げが穏やか・大量メッシュ | 肩・股関節など大きくねじれる関節 |
頂点ウェイト ── どの骨にどれだけ付くか
スキニングの質を最終的に決めるのは 頂点ウェイト(スキンウェイト) の割り当てです。各頂点は「影響を受けるボーンの ID」と「そのウェイト(合計 1 に正規化)」の組を持ちます。関節から遠い頂点は 1 本のボーンにほぼ 100% で付き、関節付近の頂点だけが複数ボーンに分配されます。
- ウェイトペイント: アーティストがメッシュ表面にウェイトを塗るように調整する。関節の折れ方や皮膚の追従を直接コントロールできる。
- 自動割り当て: ボーンからの距離やヒートマップ拡散(heat diffusion)などで初期ウェイトを生成し、破綻部分を手で修正する。
- 本数制限と正規化: GPU スキニングでは1頂点あたり 4 本まで に切り詰め、切り捨てた分を差し引いて残りを再正規化する。合計が 1 でないと、変形時にメッシュが伸縮・移動してしまう。
ウェイトが不適切だと、関節でメッシュが陥没したり突き抜けたりします。良いリグとは、ボーン配置・回転の効き方・ウェイト分布が噛み合った状態を指します。
アニメーションブレンド ── クリップを混ぜて動きを作る
個々の動き(歩き・走り・ジャンプなど)は アニメーションクリップ として、時間ごとの各ボーンの局所姿勢(多くは平行移動・回転クォータニオン・スケールの組)を記録したものです。実行時にはこれを補間して姿勢を作りますが、単一クリップの再生だけでは硬い動きになります。そこで複数クリップを混ぜる アニメーションブレンド を使います。
クロスフェード(歩き → 走り、遷移時間 t で α: 0→1):
各ボーンの局所姿勢について
T_blend = lerp( T_walk, T_run, α ) // 平行移動は線形補間
R_blend = slerp( R_walk, R_run, α ) // 回転は球面線形補間
S_blend = lerp( S_walk, S_run, α )
重要: 回転は必ず slerp(クォータニオンの球面補間)で混ぜる。
オイラー角の線形補間はジンバルや最短でない回転で破綻する。
ブレンドの核心は 回転をクォータニオンの球面線形補間(slerp)で混ぜる ことです。オイラー角(XYZ の角度)を直接補間すると、軸の順序依存やジンバルロックで意図しない経路を通ります。クォータニオンは回転を4次元単位球面上の点として表すため、2姿勢の最短円弧をなめらかにたどれます。
代表的なブレンド構成は次の通りです。遷移ブレンド(クロスフェード)でクリップ間を継ぎ目なく切り替え、ブレンドツリー(1次元/2次元)で速度や方向のパラメータから歩行〜走行を連続生成し、加算ブレンド(アディティブ)で基本姿勢の上に「上体をひねる」「呼吸で揺れる」といった差分を重ねます。加算ブレンドは差分姿勢(あるクリップと基準ポーズの差)を上乗せするため、下半身の歩行を保ったまま上半身だけ別動作をさせられます。
逆運動学(IK)── 末端から関節角を逆算する
ここまでは親から子へ姿勢を与える 順運動学(FK、Forward Kinematics) でした。逆に「手先を特定の位置に置きたい」「足を地面に接地させたい」という 目標位置から関節角を逆算する のが 逆運動学(IK、Inverse Kinematics) です。段差に足を合わせる、武器を掴む、頭を注視対象へ向ける、といった環境依存の調整に不可欠です。
IK の代表解法:
2ボーンIK(解析解):
肩・肘・手首など「関節2本+末端目標」を余弦定理で一発計算。
腕・脚のような単純鎖に最速・最安定。ヒンジの向き(極ベクトル)で肘の曲げ方向を指定。
CCD(Cyclic Coordinate Descent、反復解):
末端に近い関節から順に、末端が目標へ向くよう1関節ずつ回して収束させる。
実装が簡単で任意長の鎖に使えるが収束が振動しやすい。
FABRIK / ヤコビ法(反復解):
多関節・多目標を扱える汎用解法。全身IKや触手・尻尾など長い鎖に用いる。
IK が難しいのは 解が一意でない 点です。手先を同じ位置に置く肘の曲げ方は無数にあり、関節可動域(constraint)や自然さの優先を加えて解を選びます。実務では FK で作ったアニメーションの上に IK を後段で適用 するのが定石で、走行アニメの脚を実際の地形へ合わせる(フットIK)、上体アニメの頭だけをターゲットへ向ける(ルックアット)といった 部分的な補正 として使います。全身を IK だけで駆動することはまれで、FK と IK は対立ではなく補完関係にあります。
「なぜ回転を行列やオイラー角ではなくクォータニオンで補間するのか」は頻出です。行列の線形補間は直交性が崩れて体積がつぶれ(キャンディラッパー)、オイラー角の補間はジンバルロックと軸順序依存で最短経路を通らない。クォータニオンの slerp だけが、単位球面上の最短円弧として2姿勢を一定角速度でなめらかに結べる、と答えられれば要点を押さえています。DQS が LBS の何を解くか(回転補間の破綻=体積保存)も併せて問われます。
まとめ
- スケルタルアニメーションは頂点を直接動かさず、ボーン階層の姿勢でメッシュを変形 する。各頂点は
M_world(b) × InvBind(b)によって、いったんボーン局所空間へ移してから現在の姿勢で運ばれる。 - 線形ブレンドスキニング(LBS) は複数ボーンの変換行列をウェイトで線形平均する軽量手法だが、回転行列の補間が破綻して キャンディラッパー問題(体積の痩せ) を起こす。
- デュアルクォータニオンスキニング(DQS) は剛体変換を球面的に補間して体積を保ち、大きくねじれる関節で LBS の破綻を解く(代償はジョイントバルジと計算コスト)。
- 頂点ウェイト は 4 本程度に制限して正規化し、アニメーションブレンド は回転を必ず slerp で混ぜ、クロスフェード・ブレンドツリー・加算ブレンドで動きを合成する。
- 逆運動学(IK) は末端目標から関節角を逆算し、接地や注視などを FK の上に部分適用する補完技術である。
グラフィックス Article
スケルタルアニメーションとスキニングを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
スケルタルアニメーション
比較で見る軸
難易度: advanced / カテゴリ: グラフィックス / タグ数: 6
導入後に効く点
線形ブレンドスキニング(LBS)は頂点ごとの複数ボーンウェイトで変換行列を加重平均する軽量手法だが、大きなねじれ・屈曲で体積が痩せる。デュアルクォータニオンスキニングは回転を球面補間して破綻を抑える。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- グラフィックス
- タグ数
- 6
判断チェックリスト
- 自社の用途が「スケルタルアニメーション / スキニング」に近いか確認する。
- 強みである「スケルタルアニメーションは頂点を直接動かさず、ボーン階層の姿勢行列でメッシュを変形する。各ボーンはバインドポーズからの相対変換として姿勢を持つ。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。