2001年の早い時期からOkinoは、Autodesk Maya、Autodesk 3ds max、Newtek Lightwave、Softimage XSI、DirectX、Collada、FBX、U3D、Milkshape-3Dなどの主要な3Dキャラクターアニメーションソフトウェアやファイルフォーマット間の、スケルトンとスキニング処理の変換について積極的な開発研究を行ってきました。このWebページではスケルトンとスキニングの考え方のおおまかな基本を説明し、なぜ全体に前掲したソフトウェアパッケージ間でのスキニングデータの変換が潜在的な問題をはらみつつ成熟しているのか説明します。
FBXの'Samurai'スキンメッシュ(スケルトン付き)モデルをインポートし、OkinoのNuGrafでアニメーションおよびレンダリングしたもの。モデルはKaydara/Alias/Autodeskの提供。
イメージをクリックするとWindows Mediaの640x480サイズアニメーションを表示します(ダウンロード 2.3MB)。
お客様からの直接の反応、長期間にわたる集中的な開発、アニメーション会社が開発したメッシュスキンプログラムのバグや問題の調査にこれまで私たちが行ってきた助言などから、マーケットにおいて最良でもっとも洗練され技術的優位に立つスキン変換システムを私たちは持っていると確信しています。スケルトンとスキンメッシュを、3ds max(Character StudioやSkinMod)、Lightwave、Mayaの間で相互変換しなければならないときは特にです。これら3つのプログラムは、そのボーンの並べ方の相違・Bipedの軸に沿わないスケーリング・Mayaから出力した場合に「失われる」バインドポーズなどの理由から、とりわけコンパチビリティがありません。私たちのスキニングシステムは、他の無償・有償ソフトウェアでの変換によって作成されたスケルトンやスキンメッシュの誤りを修正することができる点においても有名です。あなたにとって必要なことは、3DS MAXやMayaからOkinoの.bdfファイルフォーマットでエクスポートし、それを再度インポートするだけです。OkinoのArcticツールキットは変換過程のなかで内在する問題を埋め合わせるでしょう。もし私たちのスキン変換システムを使っていて問題と思われるどんなことでも、起きるとしても滅多にないでしょうが、私たちにメールを送っていただければそれが何であるかをご説明いたします。
メッシュのスキニング処理の概念はかなり簡単であったので、当初私たちはスケルトンとスキニングのデータ変換の開発は簡単だと考えていましたが、数年たった事実からは、いつもそうとは限らないと言わざるをえません。いろいろな問題(他の変換ソフトウェアでは気にしていないように思えるような)がそのようなデータの変換途上で発見されました。例えば、
- 3ds maxで、エクスポート前に行う「ゆがんだ(skewing)」または「軸に沿わない(off axis)」スケーリングがされているデータ構造におけるスケルトンツリーへの影響の伝播(3ds maxの構造上の古くからの問題点)
- Mayaの「ジョイント」を3ds maxで「ボーン」として利用するために、スケルトンノードのアニメーションカーブを合成し再サンプルする際の並び替え(3ds maxプラグインにあるOkinoの特徴的な処理オプションを使うことで、他の
- コンバーターが作ってしまった質の悪い変換結果を修正することにも使えます)
- メッシュ下でのスケルトン構成手法としてあまり使われていない(Lightwaveで使われているような)ものと、お互いはっきりと異なる、より標準的なスケルトンとメッシュの手法との間の変換
- 暗黙的に仕込まれているスキンのウェイト(重み付け)関数(Lightwaveのような)と、他の3Dファイルフォーマットで使われているような明示的なスキンのウェイト値との変換
- また、Mayaのジョイントを基本とするスケルトンを3ds maxのボーンを基本とするスケルトンへ変換するときのサイズと揃えの「分別ある」計算処理
DirectXについては、Okinoは1997年以降、.Xの標準エクスポーターとして業界から認められてきました。.Xフォーマットは、スムーススキニングによるリアルタイムのメッシュ変形や頂点の複製リストがサポートされることになったDirectX 8.1まで変更されることはありませんでした。簡単すぎるファイルフォーマットほど開発時に問題になりやすいことを私たちはこれまでに深く学んでおり、.Xファイルのコンバーターにおいても直接あてはまりました。スキンされたメッシュを何も考えずにエクスポートできるようにするために、スケルトンが出力されたあとにメッシュデータを出力できるような機能(メッシュがスケルトン構造の内部に置かれた場合に備えて)を追加し、メッシュ上の頂点ウェイトの合計が1.0に達しない(DirectXでは好ましくないケース)ときはダミーの追加ボーンを自動作成するようにしました。
3Dキャラクターアニメーションにおけるスケルトンとは、人間の骨格とダイレクトに対応する関係にあります。関節(ジョイント)と骨(ボーン)とで構成され、「スキニング」処理によって付加されているメッシュデータの変形をコントロールするメカニズムとして使われます。スケルトンは3D空間においてはNULLノード(あるいは「ダミーノード」や「グループ化用ノード」と呼ばれることもあります)として実際には構成されます。NULLノード同士の親子関係を構成することで明示的な階層構造を作り、NULLノードの移動情報はその親のNULLノードに対する回転やオフセットを意味します。各NULLノードの位置は「関節」に対応するものであり、2つの親子NULLノード間の距離はボーンの長さを意味します。
ある3Dプログラムは「ジョイントベース」であり、そのほかは「ボーンベース」です。MayaとOkinoのPolyTransはジョイントベースであり、ボーンは2つのジョイント(2つのNULLノード)の間に暗黙的に与えられます。このため、ボーンを定義するには最低でも2つのジョイントを必要とします。3ds maxやLightwaveなどのその他のプログラムはボーンベースで、ボーンはその開始位置と方向・長さにより定義されます(ボーンを可視化するのに、これらのプログラムでは子供ジョイントノードは不要です)。
Okinoのスタンドアローンソフトウェア(PolyTransやNuGraf)の内部では、各ジョイントを中心とする球と、球同士をつなぐ台形のボーンで、スケルトンは表現されます。下の図のように例示されます。
「スキニング」は関節化されたスケルトンのボーンやジョイントへの関連付けによってポリゴンメッシュのリアルタイム変形を行うための一般的な手法です。スキニングはスケルトンを単一のメッシュオブジェクトへバインドする処理で、スキンデフォーメーションはスケルトンがアニメーションしたり移動したりすることでメッシュを変形する処理です。スケルトンのボーンが移動・アニメーションすることで、重み付けを考慮したデフォームがメッシュの各頂点に与えられた行列により行われます。スキニングは多くの3Dゲームにおいてキャラクターやオブジェクトの変形を行う一般的な手法です。 下の図ではスキニングの主要要素を示し、右側が単一のスキンメッシュ、左側がボーンのスケルトンです。 左: 単一のスキンメッシュ、右: ボーン/ジョイントによるスケルトン Autodesk Character Studio CDの'Rock'モデル OkinoのPolyTrans/NuGrafソフトウェアは、「スムーズスキニング」とも言える、重み付けされたジョイントによるメッシュ変形のすばらしい処理を持っています。主要なキャラクターアニメーションファイルフォーマットとアニメーションソフトウェア間での、スキンされたデータのインポート・維持・プレイバック・検索・最適化・再エクスポート処理のパイプラインとして作られました。
スキニングは、メッシュオブジェクトの特定の頂点をローカル座標でのデフォームとなるようウェイトにしたがって順番に引っ張っていく、1つ以上の「デフォーマー」機構の移動原理をもとに働きます。単一の頂点に複数のデフォーマーオブジェクトを配するのは一般的で、それぞれがデフォームの「強さ」に対する寄与度を持ちますが、強さの合計値は1.0までです。
伝統的なキャラクターアニメーションシステムでは、単一のスキンメッシュオブジェクト(例えば人体全体を1つのメッシュオブジェクトで作成する)と関連付けられたスケルトン1つを使用します。スケルトンはシンプルなNULLノードの構造体として表現されます。いくつかのアニメーションシステム(MAX、Lightwave)ではスケルトンのNULLノードは開始位置と方向からなるボーンとして表現され、他のアニメーションシステム(Maya、Okino)ではスケルトンの接続点の中心とスケルトンの次の接続点の中心とを結ぶ、単純な球からなる関節とボーンとして表現されます。スケルトンはデフォーミーと呼ばれるメッシュオブジェクトをデフォームするものとして振舞います。下の図では、左側にあるスケルトンによって右側の単一スキンメッシュがリアルタイムにデフォームする例です。ボーンの移動によってメッシュオブジェクトのデフォームが行われます。
スケルトンにより単一スキンメッシュのデフォーメーションが行われる
3D編集ソフトウェアでのスキニングの定義は、ボーンやジョイントを選択してメッシュオブジェクトの1つ以上の頂点へデフォーマーとして割り当てることによって行います。これらの頂点・ボーンの割り当て時にウェイトが割り当てられます。0.0の値で引っ張りなしを意味し1.0はボーンが頂点を完全に引っ張ることを意味します。多くの場合、複数のボーンが単一の頂点に割り当てられ(このためスケルトンの複数のパーツがそれぞれのローカル座標でメッシュをコントロールする)、この場合、単一の頂点に割り当てられているウェイトの合計が1.0になるように「ノーマライズ」されます。また、不可欠な処理として、スケルトンが最初にメッシュオブジェクトへ割り当てられる(「バインドされる」)時に、バインド時にワールド座標中のどこにメッシュオブジェクトがあり、どこにスケルトンジョイントがあるかを定義する「バインドポーズ」変換行列がスナップショットされます。これらのバインドポーズ行列はスキニングのプレイバックアルゴリズムがスケルトンがアニメーション/トランスフォームされたことを検知するための静的・固定的な基準を提供し、もっとも単純なスキニングの定義である、スケルトンの位置の変化に応じたバインドされたメッシュオブジェクトの頂点移動の差異を計算することができます。
用語のある使用法として、頂点ごとにボーンが1つあり、そのウェイトが1.0の場合、それはリジッドなスキニングと呼び、そうではなく頂点ごとに複数のボーンがありそれらのウェイトが1.0ではない場合、それはスムーズなスキニングと呼びます。
下の図はスキニングのもっとも単純な例の1つです。ここには2つのボーンによりデフォームされる円柱のメッシュがあり、下のボーンは固定されており上のボーンがアニメーションします。円柱の上端面は上のボーンにのみウェイト設定されており、下端面は下のボーンにのみウェイト設定されているため、上下の端面が不自然にねじれることはありません。しかし、両端面の間にある側面の頂点は上下のボーン間で異なるウェイト設定を行っているため、それらの移動は部分的に上側のボーンの回転によるものと下側のボーンの静的なバインドされたときの位置とで決定されます。
2つのボーンによるシリンダーの変形
スケルトンにより単一スキンメッシュのデフォーメーションが行われる
スキニングはスケルトンの構造を単一のメッシュオブジェクトにバインド(結合)する処理です。1つ以上の影響を与えるジョイント(ボーン)を、メッシュ上の各頂点へ、それぞれ対応するウェイト値でアサインすることで行われます。ウェイト値はデフォーム処理において特定のボーンがどれぐらい頂点にたいして影響を与えるかを決定します。注意:一般的には、メッシュはシーン中にあるデフォーマーとしてのすべてのオブジェクトから影響を受け、スケルトンジョイントとしてタグ付けされたNULLノードのみではありません。基本的には、あらゆるインスタンス・あらゆるNULLノードインスタンス・あらゆるジョイントとしてタグされたインスタンスがメッシュオブジェクトをデフォームするものとして使われます(NULLノードの変換マトリックスのみがデフォーメーションプロセスには必要です)。
メッシュが最初にスケルトンへバインドされるとワールド座標上でメッシュとスケルトンノードの全トランスフォーメーションマトリックスが「バインドポーズ」スナップショットとして採取されます。このバインドポーズ位置マトリックスにより、メッシュとスケルトンがオリジナルのデフォームされていない位置(バインドポーズ、レストポジション、リファレンスポーズなど)を基準として、その影響を与えるボーンのローカル座標上であらゆる頂点を移動させることができます。
スケルトンとメッシュがインポートされスキニングウェイトによりお互いにバインドされていると、次に行われるのはバインドポーズのマトリックスの定義と設定です。これらのマトリックスは、メッシュオブジェクトと、関連するボーン・ジョイントのバインディング時のワールド座標上の位置を定義します。PolyTrans/NuGrafのユーザーインターフェース上では通常、現時点のスケルトンのポーズによる影響下のデフォームされたメッシュが表示されます(スキニングがグローバルに無効にされていないかぎり)。スケルトンを元に戻して、メッシュを最初にバインディングしたときの、デフォーメーションが行われていない状態に戻すには、メッシュインスタンスと全ボーン・ジョイントを「バインドポーズへ戻す(Go to Bind Pose)」必要があります。最終的な結果は下のイメージのようになります(初期バインドポーズは普通は両腕を外に伸ばして手のひらを下に向けます)。
「バインドポーズ」状態のモデル
「バインドポーズ」の説明
バインドポーズは絶対的にもっとも重要で理解すべきコンセプトであるにもかかわらずスキニングAPIのプログラムを学ぶ上でもっとも混乱を招く要素でもあります。「バインドポーズ」はメッシュオブジェクトのポーズであり、スケルトンがメッシュオブジェクトにバインドされた時点の何もデフォームが行われていない状態でのスケルトンとその相対的なオフセット情報です。このポーズは通常上の図のような腕を肩の高さで外へ伸ばし、スケルトンはメッシュオブジェクトの腕に沿った状態で見られます。
今この瞬間に、スケルトンのボーンがメッシュにバインドされ(ボーンと頂点とを対応ウェイト値でアサインすることで)、「(ワールド座標での)バインドポーズマトリックス」と呼ばれるスナップショットマトリックスが全ボーン・ジョイントおよびメッシュ自身(ローカルの変換マトリックスと混同しないでください)に対して採取されます。これらはスキニングにおいて非常にキーとなる重要なマトリックスです。バインドポーズマトリックスはメッシュオブジェクトとスケルトンのボーン・ジョイント(NuGrafツールキットにおいてはボーン・ジョイントは単なるNULLノードで、よく空インスタンスとも呼ばれます)を定義するインスタンス定義に保存されます。
スキニングのデフォーメーションにおいてバインドポーズマトリックスはどのように使われるのでしょうか?理解にあたっての重要なキーポイントです。マトリックスによりメッシュ(ローカル座標系の)元々の頂点列がワールド座標へ変換され、各ボーンのアニメーションが適用される量を各頂点ごとに各ボーンのローカル座標系で決定します(ウェイト値の影響を考慮しながら)。メッシュのバインドポーズはローカル座標系からワールド座標系へと変換するものであり、そして各ボーンのバインドポーズの逆行列によってメッシュの頂点をワールド座標からそのボーンのローカル座標へと変換します。ボーンのローカル座標系への変換後、ボーンの現時点でのアニメーション移動量マトリックスが頂点位置の移動(デフォーム)として使われます。すべてのボーンによる影響度を計算しおわると、頂点はワールド座標系の最終的なデフォーム後の位置になります。別の言葉で言うと、バインドポーズマトリックスは頂点のローカルメッシュ座標における位置と各ボーンのローカル座標系における頂点の相対位置との関係になります。バインドポーズマトリックスを通じてその関係性がはっきりすると、ボーンのアニメーションによりメッシュ頂点をデフォームするのは簡単なことです。
頭の中に入れておかなければいけないことは、メッシュのバインドポーズマトリックスはその頂点列をワールド座標系でもち、バインド時の位置であり、また各ボーンのバインドポーズマトリックスはバインド時のボーンのローカル座標からワールド座標へボーンをとる、ということです。