元記事:
How Armatures work
Armature の動作
アニメーション再コーディングプロジェクト
Armature、Pose、Action、NLA …何人かのアーティスト達はキャラクタアニメーションシステムをマスターしているでしょうが、多くの人達にとっては、いまだによく知られていない Blender の機能の一つにすぎません。
開発者にとってもこれは同様で、Blender 内でメンテナンスが非常に困難な部分の一つでした。一見、NaN による「作業済」の状態で残されているように見えましたが、それは限られたシチュエーションのみ、もしくは多くの応急処置的な改造がほどこされていました。
過去数年間のオープンソース開発でも、新しい開発がここではほとんど起こっていませんでした…そのコードは理解するのがほとんど不可能に近いものでした。よって、もうそろそろ再コーディングしてもいい頃でしょう!
私は私自身を二週間監禁し、このシステムが実際にいいものであるのか、オリジナルデザインのアイデアが何なのか、何を管理下に戻すことができるかを検証する必要がありました。すべての部分を取り、再構成し直すことで、私は幸運にもこのシステムがそんなに悪い物ではない、ということがわかりました。逆にいえば、オリジナルデザインはすばらしく、単にデザインのルールに忠実に従った、適切な実装が必要だっただけなのでした。
よって私はすべてのクレジットを、オリジナルのデザイナー/開発者であるReevan McKay氏に捧げたいと思います。ありがとう!
Armature、Pose、Action
最初のデザインの決定に忠実に従い、Armature、Pose、Action の意味を厳密に定義しましょう。これは開発者同様アーティストにとっても、これら三つの要素を明確にイメージする助けになるでしょう。
1) ArmatureArmature は Bone をキャラクタの
Rest Position(停止位置)で格納します。これは Mesh モデルとデータに互換性があり、EditMode で修正可能で、多くの Object により再利用されます。
2) PosePose はその
Object レベルの変更と、ある Armature の関係を定義します。Armature 内のそれぞれの Bone には、関連する "Pose Channel" が作成され、移動、回転、大きさの差分が格納されます。そして Constraint と他の Pose Channel もしくは 他の Object とのリンクが作成可能です。
一つの Armature は 多くの Object からリンクすることができ、それぞれに自身の Pose を持ちます。Pose は Armature から直接派生されるため、常に多くの Pose Channel を Bone として保持、すばやい評価のために、Transform データを格納することが可能です。
3) ActionAction は
PoseChannel のアニメーション Curve(Ipo)と、その Constraint を格納します。Action は Pose に適用しようとしている、すべてのアニメーションの変更を集めた、"Ipo バッグ" と定義することができます。
特定の Pose Channel 上で "Action Channel" が動作するかどうかは、Action Channel の名前により決まります。そのため、Action は Armature から直接派生すべきではなく、より少ないチャネルを持つことも、違う Pose 上での動作もできるかもしれません。
一般的には、Action は ウォークサイクル、ジャンプ、波、握りなど…ができます。そして NLA Editor 内でつなげる(編集する)ことができます。NLA Editor は実際には 'working Pose' を作成し、Action をこれに適用し、その Pose と実際の Pose をブレンドします。
これらの扱いにくい Transform 行列
Blender のキャラクタアニメーションシステムが、リアルタイム(game Engine)で動作するようにデザインされているため、多くの評価とアニメーションコードも同様に、全ての Bone と、その Parent の再計算が、再描画のリクエスト毎に、「リアルタイム」で動作します。
ローポリキャラクタのデフォームはもちろん、シンプルな Armature でも、これは上手く動作しますが、ハイクオリティなアニメーションでは、システムが非常に遅くなるのは明白でした。試しに行列のキャッシュを追加してみましたが、悪くなる一方でした…Bone、もしくは Pose と Action のデータの共有、コピーなどにより、実際に何をすべきか混乱していました。
現在、位置と Transform 行列は三つの別れた段階で格納されています。下の図はそのオーバービューです。
Vertex (デフォーム) Group
Blender の 別の複雑な機能として、VertexGroup の実装があります。このシステムは確実にデフォームする Vertex を定義すれば上手く動作しますが、その編集はとんでもなくやっかいです。
スケジュール化はツールとオプションのこの仕事を(部分的に)自動化します。
下の図は、Armature に関連付けられたある Mesh の変形の仕組みです。
長い ToDo リスト…
現在(2005年7月18日)、再コーディングには下記の改良と修正が含まれています。
- Bone の描画、Pose の評価、IK 実行、デフォームの大幅なスピードアップ。
- 現在のシステムはまだ後方互換性がありますが、古い版の Blender で現在のファイルを読み込むとトラブル発生が予測されます。
- 'Solid' 描画モードでの、
Bone の Solid 描画。
- EditMode で Bone の選択が可能に。PoseMode 用に選択状態の保存、逆も同様に。
- EditMode に Undo を追加。
- Bone のリネームが、VertexGroup、Constraint、PoseChannel、Action、そしてファイル全体の中の、その Armature を使用するすべての物に影響するように。
- [N]キーパネルに Bone のリネームを追加。
- PoseMode の Transform Properties パネル([N]キー)で、オイラーが表示されるように。
- EditMode と PoseMode でも、「アクティブ」Bone(最後にクリックしたもの)を持つように。
- EditMode での Bone の Parent: [Ctrl]+[P]、[Alt]+[P] に素晴らしいオプションが!
- Pose が Outliner に追加、Armature ではなく、Pose 内の Constraint を表示するように。
- Constraint からの つながっていない IK の解決。これは現在別のフェーズになっており、Pose 計算全体の一番最初になっています。
- Pose 自身も依存グラフを持っているため、評価順によるラグはありません。
-
B-Bone オプションを追加、Bezier Curve による Bone が可能で、「Roll」の補間も同様に行えます。
再コーディング作業は現在、Action と NLA Editor のクリーンアップに移行しています。また、来月以降に追加される予定の、新しいクールなアイデアのすべてが掲載される、新しいデザインのドキュメントも近いうちに期待できるでしょう。
元記事:
How Armatures work Last update: Aug 22 2005.
This section is maintained by Ton Roosendaal.