(57)【特許請求の範囲】
【請求項１】
関節角度制御情報を持つ標準スケルトンモデルの各々の部位と制御対象スケルトンモデルの各々の部位との間の部位間対応関係が定義されたスケルトンモデルにおいて，前記制御対象スケルトンモデルのポーズ又は動きをコンピュータが制御する方法であって，
前記標準スケルトンモデルに対するポーズ又は動きの変更の指示を受け入れるステップと，
前記指示に基づいて，前記関節角度制御情報を適用して，前記標準スケルトンモデルのポーズ又は動きを決定するステップと，
前記部位間対応関係を用いることによって，前記決定された標準スケルトンモデルのポーズ又は動きに前記制御対象スケルトンモデルのポーズ又は動きを追従させるステップと，
を有する方法。
【請求項２】
前記指示を受け入れるステップは，
オペレータからの前記制御対象スケルトンモデルに対するポーズ又は動きの変更の指示を前記標準スケルトンモデルへのポーズ又は動きの変更の指示として受け入れるか，又は，前記標準スケルトンモデルへのポーズ又は動きの変更の指示に変換するステップ，
を有する請求項１記載の方法。
【請求項３】
前記スケルトンモデルは，関節により接続された複数のボーンを含み，
前記部位は，１つ以上のボーンを有する，
請求項１又は２記載の方法。
【請求項４】
前記追従させるステップは，
ボーンのグループの向きを複写するステップと，
前記ボーンのグループに含まれる１つ以上の各々の前記ボーンの向きを複写するステップと，
を有する請求項１ないし３のうちいずれか１項記載の方法。
【請求項５】
前期関節角度制御情報は，関節の可動範囲を設定する情報，又は関節の曲がりにくさの情報を含む，
請求項１ないし４のうちいずれか１項記載の方法。
【請求項６】
前記制御対象スケルトンモデルの初期状態におけるポーズ又は動きに基づいて，前記標準スケルトンモデルのポーズ又は動きを変更するステップ，
を更に有する請求項１ないし５のうちいずれか１項記載の方法。
【請求項７】
前記部位が複数のボーンを有する場合，前記複数のボーンの初端と終端に存在する関節の角度情報に基づいて，前記複数のボーンの各々を接続する関節の角度情報を決定する，
請求項１ないし６のうちいずれか１項記載の方法。
【請求項８】
前記標準スケルトンモデルと，前記制御対象スケルトンモデルの，スケルトン構造を探索し，又はオペレータから該対応関係の指定を受け取り，前記部位間対応関係を作成するステップ，
を更に有する，請求項１ないし７のうちいずれか１項記載の方法。
【請求項９】
前記探索は，パターン認識の手法を用いる請求項８記載の方法。
【請求項１０】
制御入力スケルトンモデルの各々のボーングループと制御対象スケルトンモデルの各々のボーングループとの間の対応が定義されたスケルトンモデルにおいて，前記制御対象スケルトンモデルのポーズ又は動きをコンピュータが決定する方法であって，前記ボーングループは１つ以上のボーンを含み，
前記制御入力スケルトンモデルのボーングループの向きに基づいて，対応する前記制御対象スケルトンモデルのボーングループの向きを決定するステップと，
前記向きが決定されたボーングループの向きに基づいて，前記向きが決定されたボーングループに含まれる各々のボーンの向きを決定するステップと，
を有し，
前記制御入力スケルトンモデルの少なくとも１つのボーングループに含まれるボーンの数と，対応する前記制御対象スケルトンモデルのボーングループに含まれるボーンの数とが異なる，
方法。
【請求項１１】
制御入力スケルトンモデルの各々のボーングループと制御対象スケルトンモデルの各々のボーングループとの間の対応が定義されたスケルトンモデルにおいて，前記制御対象スケルトンモデルのポーズ又は動きをコンピュータが決定する方法であって，前記ボーングループは１つ以上のボーンを含み，
前記制御入力スケルトンモデルのボーングループの向きに基づいて，対応する前記制御対象スケルトンモデルのボーングループの向きを決定するステップと，
前記向きが決定されたボーングループの向きに基づいて，前記向きが決定されたボーングループに含まれる各々のボーンの向きを決定するステップと，
を有し，
前記制御入力スケルトンモデルの少なくとも１つのボーングループに含まれるボーンの座標系と，対応する前記制御対象スケルトンモデルのボーングループに含まれるボーンの座標系とが異なる，
方法。
【請求項１２】
制御入力スケルトンモデルの各々のボーングループと制御対象スケルトンモデルの各々のボーングループとの間の対応が定義されたスケルトンモデルにおいて，前記制御対象スケルトンモデルのポーズ又は動きをコンピュータが決定する方法であって，前記ボーングループは１つ以上のボーンを含み，
前記制御入力スケルトンモデルのボーングループの向きに基づいて，対応する前記制御対象スケルトンモデルのボーングループの向きを決定するステップと，
前記向きが決定されたボーングループの向きに基づいて，前記向きが決定されたボーングループに含まれる各々のボーンの向きを決定するステップと，
を有し，
前記制御入力スケルトンモデル及び前記制御対象スケルトンモデルは初期状態を有し，前記初期状態において，前記制御入力スケルトンモデルの少なくとも１つのボーングループの向きと，対応する前記制御対象スケルトンモデルのボーングループの向きとが異なる，
方法。
【請求項１３】
制御入力スケルトンモデルの各々のボーングループと制御対象スケルトンモデルの各々のボーングループとの間の対応が定義されたスケルトンモデルにおいて，前記制御対象スケルトンモデルのポーズ又は動きをコンピュータが決定する方法であって，前記ボーングループは１つ以上のボーンを含み，
前記制御入力スケルトンモデルのボーングループの向きに基づいて，対応する前記制御対象スケルトンモデルのボーングループの向きを決定するステップと，
前記向きが決定されたボーングループの向きに基づいて，前記向きが決定されたボーングループに含まれる各々のボーンの向きを決定するステップと，
を有し，
前記制御入力スケルトンモデルにおける第１のボーングループの長さと第２のボーングループの長さとの比は，前記第１のボーングループに対応する前記制御対象スケルトンモデルにおけるボーングループの長さと前記第２のボーングループに対応する前記制御対象スケルトンモデルにおけるボーングループの長さとの比と異なる，
方法。
【請求項１４】
請求項１ないし１３のうちいずれか１項記載の方法をコンピュータに実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，スケルトンモデルのボーン（骨）の角度すなわち回転（曲げ，捻り等）の制御に関する。
【背景技術】
【０００２】
ＣＧキャラクタ等を動かしてポーズやアニメーションを作る際に，複数のボーン（骨）を関節で繋いだスケルトンモデル（骨格モデル）（図１（ａ））が使われる場合がある。このようなスケルトンモデルは，仮想空間ばかりでなく，ロボット制御等の実空間における対象物を制御する場合にも用いられ得る。
【０００３】
本願明細書で扱うモデルは，図１（ｂ）のように親子関係で繋がったノードで構成される。関節の回転（曲げ，捻り）の状態は，親ノードを基準とした子ノードの向きで表すことができる。ノードの向きを表すために，各々のノードに対して図１（ｂ）のように座標系が定められる。親子関係にあるノードの原点どうしを結ぶ線分，あるいはノード自体がボーンとなる。
【０００４】
三次元（３Ｄ）仮想空間又は実空間上で人体モデル，動物，構造物等の姿勢（ポーズ，動き等）を制御する際に用いられるこのようなスケルトンモデルにおいては，図１（ａ）に示す各々のボーンおよび関節の位置，角度，回転（曲げ，捻り）等を意図したとおりに制御することが必要となる。図１（ａ）に示されるスケルトンモデルでは，各々のボーンは関節で結合されており，各々のボーンの動きが他のボーンの動きに影響を与える。従来から，スケルトンをモデル化し，スケルトンモデルを制御する手法として，種々のものが提案されている。
【０００５】
例示として，図１（ａ）のスケルトンモデルを用いた場合を想定する。このスケルトンモデルは，人体の構造をスケルトンモデル化したものである。したがって，例えば，肘から先の腕の可動範囲には，一定の制限がある。この制限を超えた角度（曲げ，捻り）に腕を曲げるポーズを取らせることは，現実の人間に対するモデルからかけ離れたものになる。人間として自然なポーズを取るスケルトンモデルを形成するためには，たとえば肘の関節から先のボーン（骨）の可動範囲に対して，一定の制限を課すことが必要となる。
【０００６】
従来では，特許文献１に開示されるように，たとえば親骨（親ボーン）に対する子骨（子ボーン）の向きを親骨の座標系を基準とした３軸（ｘ，ｙ，ｚ）の各軸回りの回転角度で表現するものがある。
【０００７】
特許文献２には，関節を中心点とする球面上の所与の点を焦点とし，関節に対応する中心点と焦点とを結ぶ軸に直交する平面を射影面とし，関節の可動範囲を，射影面上において設定する技術が開示されている。
【０００８】
特許文献３及び特許文献４には，子骨の向きが，予め定められた可動範囲内に収まっていない場合には，可動範囲の形状に応じた条件を満たすように，前記親骨に対する前記子骨の向きを補正する発明が開示されている。
【０００９】
また，特許文献５は，モノポーラ座標系を用いて，多関節スケルトンモデルをリアルタイムで動かす場合に，計算量を軽減した発明が開示されている。
【００１０】
特許文献６は，多関節モデルの関節の曲がりにくさを制御する発明が開示されている。
【００１１】
特許文献1ないし特許文献６においては，新規に作成したスケルトンモデルに対して，個々の関節に角度制限や曲がりにくさを設定しなければならない。この設定は，ユーザにとって煩雑な作業である。また，リアルな動ポーズを取らせるためのこれらの設定には，ある程度の知識と経験が必要とされる。
【先行技術文献】
【特許文献】
【００１２】
【特許文献１】特開２０００−３０６１１６号公報
【特許文献２】特開２００９−０７０３４０号公報
【特許文献３】特開２０１０−１７０２７９号公報
【特許文献４】米国特許公開公報２０１０１８２３２９号明細書
【特許文献５】特願２０１１−０２４４４９号
【特許文献６】特願２０１１−０２５３６１号
【発明の概要】
【発明が解決しようとする課題】
【００１３】
本発明の実施例に係る方法は，作成した個々のスケルトンモデルにおける，関節の角度制限や，関節の曲がりにくさ等の設定に対する煩雑さを軽減させることを目的とする。
【課題を解決するための手段】
【００１４】
本実施例の方法は，関節角度制御情報を持つ標準スケルトンモデルの各々の部位と，制御対象スケルトンモデルの各々の部位との間の部位間対応関係が定義されたスケルトンモデルにおいて，前記制御対象スケルトンモデルのポーズ又は動きをコンピュータが制御する方法であって，前記標準スケルトンモデルに対するポーズ又は動きの変更の指示を受け入れるステップと，前記指示に基づいて，前記関節角度制御情報を適用して，前記標準スケルトンモデルのポーズ又は動きを決定するステップと，前記部位間対応関係を用いることによって，前記決定された標準スケルトンモデルの前記ポーズ又は動きから前記制御対象モデルのポーズ又は動きを決定するステップと，を有する方法を提供する。
【発明の効果】
【００１５】
スケルトンモデルのポーズ又は動きを，簡便な手法で制御することができる。
【図面の簡単な説明】
【００１６】
【図１】スケルトンモデルを示す図である。
【図２】本発明の一実施例に係るテンプレートとキャラクタを示した図である。
【図３】本発明の一実施例に従ったボーングループの対応付けを示す図である。
【図４】一実施例におけるボーングループの対応付けを示す図である。
【図５】ボーンの回転を示す図である。
【図６】座標系調整マトリクスの算出手順を示す図である。
【図７】一実施例の方法のフローを示す図である。
【図８】一実施例のハードウエア構成を示す図である。
【図９】キャラクタとテンプレートの対応する２つのボーングループを示す図である。
【図１０】重なり状態を得るための回転マトリクスを得る操作を示す図である。
【図１１】座標系を比較する２つの座標系を示す図である。
【図１２】ボーングループ内でのボーンの状態の決定を示す図である。
【図１３】ボーングループ座標系における，カレントのキャラクタボーンの配置を示す図である。
【図１４】キャラクタのポーズが確定する処理を示す図である。
【図１５】テンプレートモデルとキャラクタモデルの初期状態の例を示す図である。
【図１６】軸合わせ単純回転を示す図である。
【図１７】補間の方法を示す図である。
【図１８】ボーン軸ベクトルの調整を示す図である。
【図１９】単純回転を示す図である。
【図２０】第1の実施例と第２の実施例のスケルトンモデルの差を示す図である。
【図２１】第1の実施例と第２の実施例のスケルトンモデルの差を示す図である。
【発明を実施するための形態】
【００１７】
本明細書，特許請求の範囲，及び図面においては，以下の用語を用いる。これらの詳細は後述する。
（１）スケルトン：骨格を意味する。
（２）ノード： モデルを構成する各部位を意味する。
（３）ボーン： 親子関係にある２個のノードの原点どうしを結んだ線分，またはノードそのものを意味する。
（４）オブジェクト：ポーズ又は動きの指示の対処となっているスケルトンモデルを意味する。最も親のノード（ルートノード）の座標系をオブジェクト座標系と呼ぶ。
（５）ローカル座標系：親ボーンまたは親ボーングループの座標系に関して用いる。
（６）テンプレート：関節角度制御情報を有するスケルトンモデル（標準モデル）を意味する。
（７）キャラクタ：関節角度制御情報を持たないスケルトンモデルを意味する。
（８）ボーングループ：直鎖状に繋がった１本以上のボーンの集合を意味する。
【００１８】
その他の用語については，その用語を用いているところで定義する。
【００１９】
図２は，本発明の一実施例に係るテンプレートとキャラクタを示した図である。図２（ａ）は，テンプレートであり，スケルトンモデルに関節の制御情報が既に設定されている。本明細書において，テンプレート（標準モデル）は，予め用意されたスケルトンモデルであり，図２（ｂ）に示されるキャラクタのポーズ又は動きに制限を加え，不自然なポーズや動きを抑制する機能を果たす。
【００２０】
図２（ｂ）は，上述のようにキャラクタ（制御対象モデル）と呼ばれるものであり，スケルトン構造（ボーン）は有するが，関節の制御情報を含まないモデルである。
【００２１】
オペレータは，キャラクタ（図２（ｂ））に関して，ユーザインターフェースを介して，ポーズ又は動きの指示を与える。本発明の実施例においては，その指示を図２（ａ）のテンプレートに対して適用する。テンプレートには，上述のように関節の制御情報が含まれているために，不自然なポーズや動きをとることがない。そして，テンプレートのポーズ又は動きをキャラクタにコピーする。そして，キャラクタに対する新たなポーズ又は動きが表示される。
【００２２】
以上の一連の動作において，画面上には，テンプレートは表示しなくてもよい。すなわち，オペレータは，キャラクタの画像だけを見ながら，ポーズ又は動きの指示を与えてもよい。このようなユーザインターフェースとすることによって，オペレータは，テンプレートの存在を意識することなく，キャラクタの自然なポーズ又は動きを指示することができる。なお，本発明は，上記の構成に限定されるものではなく，テンプレートを表示させるようにしてもよい。また，オペレータが，テンプレートを操作するようなユーザインターフェースとしてもよい。
【実施例】
【００２３】
図３は，本発明の一実施例に従ったボーングループの対応付けを示す図である。
【００２４】
図３（ａ）は，図２（ａ）で示したテンプレートのスケルトンモデルの複数のボーンの接続状況を示している。図３（ｂ）は，図２（ｂ）で示したキャラクタのスケルトンモデルを示している。
【００２５】
そして，図３（ａ）のボーングループＡ'と，図３（ｂ）のボーングループＡが対応している。また，図３（ａ）のボーングループＢ'と，図３（ｂ）のボーングループＢが対応している。このように，ボーングループどうしを対応付ける理由は，それぞれのスケルトンモデルにおいて，構成されるボーンの数が必ずしも一致しないためである。
【００２６】
この対応付けは，既知のパターン認識の技術を用いて，両者のスケルトンモデルから対応するボーングループのペアを見つけ出してもよい。あるいは，オペレータが予めボーングループの対応付けを指定してもよい。または，パターン認識で対応付けられたボーングループのペアに対して，オペレータが修正を行ってもよい。
【００２７】
図３（ａ）のテンプレートは，予め複数用意されていてもよい。そして，人間，動物など複数の異なる対象物のテンプレートが用意されていてもよい。複数のテンプレートから，オペレータが適切な（または，類似した）テンプレートを選択してもよい。あるいは，既知のパターン認識技術を用いて，与えられたキャラクタに基づいて，最適なテンプレートを選択してもよい。
【００２８】
このようにしてテンプレートの選択と，ボーングループの対応付けがなされる。
【００２９】
そして，オペレータは，適切なユーザインターフェースを用いて，キャラクタのポーズ又は動きを変更する指示を行う。システムは，その指示を受けて，キャラクタではなく，テンプレートのポーズ又は動きを変更する。テンプレートには関節の制御情報が設定されているため，不自然なポーズや動きになることがない。そして，システムは，テンプレートのポーズ又は動きをキャラクタにコピーする。そして，適切な時間間隔で，キャラクタのポーズ又は動きを表示する。
【００３０】
なお，キャラクタのスケルトンに複数ボーンからなるボーングループが含まれている場合には，ボーングループの前後のノードの状態に基づいて，ボーングループを構成している複数のボーンが滑らかな形で曲がるようにしてもよい。
【００３１】
本発明の更に詳細な実施例は，以下に述べる。
［ボーンの対応付け］
まず，オペレータがキャラクタを作成し，そのキャラクタに対応するテンプレートが指定されたとする。この場合，まず必要な操作は，キャラクタとテンプレートにおけるボーングループの作成と対応付けである。
【００３２】
ボーングループのペアを決定する処理は，例えば以下の通りである。
【００３３】
図４は，一実施例におけるボーングループの対応付けを示している。
【００３４】
Ｓ４０２において，テンプレートのボーンの各々と，キャラクタのボーンの各々から，既知のパターン認識の技術を用いて，１対１の対応関係を見つけ，それぞれのボーンからボーングループを作り，ボーングループどうしを対応付ける。
【００３５】
Ｓ４０４において，テンプレートとキャラクタのボーンの全てがボーングループに属しているかをチェックする。全てがボーングループに属していれば，対応付けは終了する。ボーングループに属していないボーンがある場合には，Ｓ４０６に移る。
【００３６】
Ｓ４０６において，ボーングループに属していないボーンの１つを選択する。
【００３７】
Ｓ４０８において，連結する前後にボーングループがあるかチェックする。ボーングループが隣にある場合には，そのボーンをボーングループに加える。両隣にボーンにグループがある場合には，いずれのボーンにグループに加えるかを，既知のパターン認識技術を用いて選択してもよい。両隣のいずれにもボーンにグループがない場合には，このボーンのグループ化は，一時的に保留する。そしてＳ４０４に戻る。
【００３８】
以上の処理を行うことにより，ボーングループの作成と対応付けが完了し，全てのボーンが対応付けられる。なお，この対応付けに対して，オペレータが修正を加えてもよい。あるいは，オペレータが全てのボーンの対応付けを指示してもよい。なお，本発明は，ボーングループの対応付けに関し，上記の実施例に限定されるものではない。
［マトリクスによる座標系の計算について］
図５は，ボーンの回転を示している。三次元座標系ｘｙｚにおいて，原点Ｐを中心として，ボーンＰＡの長さを変えずボーンの一端ＡをＡ’の位置に回転する場合，Ａの座標を（ｘ0，ｙ0，ｚ0）とし，Ａ’の座標を（ｘ0',ｙ0'，ｚ0'）とすると，以下のようにマトリクスＭを用いることにより，ボーンの回転を一般的に表現できる。
【００３９】
【数１】
0005490080.tif 000002
上記の例では，ボーンの回転を例に挙げたが，２つの座標系の相対的な関係をマトリクスMで表現することもできる。ボーン毎に固有の座標系を持たせてもよい。本発明の実施例では，ボーン毎に別個の座標系が存在する（図１（ｂ）参照）。例えば，一方の座標系のｘ軸，y軸，z軸方向の単位ベクトルを，それぞれ他方の座標系のｘ軸，y軸，z軸方向の単位ベクトルに変換するマトリクスＭａを求めれば，Ｍａは，両者の座標系の関係を表現するマトリクスとなる。本明細書では，これを座標変換マトリクスと呼ぶ。
【００４０】
さらに一般的に，ボーンＰＡの長さを変えつつボーンの一端ＡをＡ''の位置に回転する場合を考える。この場合，Ａの座標を（ｘ0，ｙ0，ｚ0）とし，Ａ''の座標を（ｘ0'',ｙ0''，ｚ0''）とすると，以下のようにマトリクスＭｔを用いることにより，ボーンの長さを変えつつ回転を行うことを，以下の式によって一般的に表現できる。
【００４１】
【数２】
0005490080.tif 000003
本明細書では，上記の式のa,b,cを，マトリクスMtのtrans部と呼ぶ。trans部は，ボーンの移動量を意味する。マトリクスがローカルマトリクスの場合，親からの移動量，すなわちボーンの長さを表す。これに対して，ｍ00ないしｍ22は，ボーンの回転のみに寄与する部分であり，本明細書では，rotate部と呼ぶ。
［ポーズのコピー］
ポーズのコピーは，対応するボーングループどうしで行う。そして，本明細書では，ポーズのコピーに関し２つの実施例を挙げて説明するが，本発明はこの実施例に限定されるものではない。
【００４２】
ポーズのコピーの詳細については，後述するが，その概要は以下の通りである。
（１）座標系調整マトリクスの算出
ボーングループの座標系はボーンの座標系と同様に，テンプレートとキャラクタとで異なっている。そのため，まず，初期状態のキャラクタボーングループとテンプレートボーングループの情報から，両者の座標系の関係を表す「座標系調整マトリクス」を求める。この処理は最初に1回だけ行えばよい。この操作の手順の概要は以下の通りである。
【００４３】
図６は，座標系調整マトリクスの算出手順を示している。
（ａ）重なり状態の作成
座標系調整マトリクスを求めるためには，キャラクタとテンプレートのボーングループ軸を一旦同じ向きにする必要がある。そのために，以下にようにして「重なり状態」を作る。
【００４４】
ボーングループの始点から終点に向かう有向線分を，「ボーングループの軸」とする。
まず，初期状態のキャラクタとテンプレートを使って，キャラクタのボーングループ軸をテンプレートのボーングループ軸に合わせる。
【００４５】
図６（ａ）は，テンプレートの一部を示しており，図６（ｂ）は，キャラクタの一部を示している。図においては，ボーングループＢとＢ’がペアを組んでいる。ボーングループＢは，軸α，座標系ｅを持っている。ボーングループＢ’は，軸β，座標系ｅ’を持っている。
【００４６】
まず，軸βを軸αの向きに合わせるためのマトリクスＭ１を求める。そして，実際にボーングループＢ’を図６（ｂ’）に示すように回転させる。これによって，軸αとβ’の方向が一致した。
（ｂ）座標系調整マトリクスの導出
キャラクタボーンの重なり状態とテンプレートボーンの初期状態では，ボーングループの軸の向きはそろったが，ボーングループの座標系（すなわち座標系ｅと座標系ｅ’’）は違っている。そこで，これらの座標系の違いを変換するマトリクスＭ２を求める。
【００４７】
これらの操作で求めたマトリクスＭ２が，座標系調整マトリクスである。この求め方の詳細については後述する。
（２）ポーズ又は動きの指定とそのコピー
まず，キャラクタのポーズ又は動きを変化させるオペレータからの指示を受け取る。
【００４８】
そして，システムは，テンプレートのポーズ又は動きを変化させる。テンプレートのポーズに対して，座標系調整マトリクスを用いて，キャラクタのポーズを決定する。必要に応じて，ボーングループ内の状態を調整する。以上の処理によって，キャラクタにテンプレートのポーズ又は動きがコピーされる。
［処理フローの概要］
図７は，一実施例の方法のフローを示している。
【００４９】
Ｓ７０２において，関節角度制御情報を持つテンプレートの各々のボーングループと，キャラクタの各々のボーングループとの間の部位間対応関係を探索する。又は，オペレータから部位間対応関係の指定を受け取る。
【００５０】
Ｓ７０４において，テンプレートに対するポーズ又は動きの変更の指示を受け入れる。
【００５１】
Ｓ７０６において，指示に基づいて，前記関節角度制御情報を適用して，テンプレートのポーズ又は動きを決定する
Ｓ７０８において，部位間対応関係を用いて，決定されたテンプレートのポーズ又は動きからキャラクタのポーズ又は動きを決定する
以上の処理において，所定のポーズ又は動きを持つキャラクタが最終的に表示される。
【００５２】
図８は，一実施例のハードウエア構成図を示す。
【００５３】
一実施例では，ＣＰＵ８０１，メモリ８０２，入出力装置８０３，表示装置８０４，プリンタ８０５を備えている。
［第1の実施例及び第２実施例の概要］
第１の実施例と第２の実施例を比較すると，以下の通りである。
（１）第１の実施例
テンプレートとキャラクタがどの状態で同一ポーズなのかという情報は与えられない。そのため，キャラクタのボーンおよびボーングループの軸の向きとテンプレートのボーンおよびボーングループの軸の向きを一致させた状態が，両者が同一ポーズとなった状態である，として扱うことにより，キャラクタのポーズをテンプレートに合わせる操作を行う。
（２）第２の実施例
テンプレートとキャラクタが同一ポーズとなっている状態が，初期状態として与えられる。そこで，初期状態におけるキャラクタのボーンおよびボーングループの軸の向きとテンプレートのボーンおよびボーングループの軸の向きの相対的な関係を維持しながら，キャラクタのポーズをテンプレートに合わせる操作を行う。
［第1の実施例及び第２の実施例の詳細］
以下詳細に，第１実施例と第２実施例とを説明するが，以下の点に留意すべきである。
【００５４】
モデルの身体の各部位は，親子関係で繋がっている。この各部位をノードと呼ぶ。親子関係にある２個のノードの原点どうしを結んだものが１本のボーンとなる。親側を始点，子側を終点と呼ぶことにする。例えば，ノードnの子がノードn+1で，この２つを結んで作られたボーンがボーンmであるとする。このとき，ボーンmの始点ノードはノードnで，終点ノードはノードn+1である。始点から終点に向かう有向線分を，「ボーンの軸」とする。
【００５５】
ノードの親子関係と同様に，ボーンにも親子関係を付ける。上記の例では，ノードnを終点とするボーンは，ボーンmの親になる。ノードn+1を始点とするボーンは，ボーンmの子になる。
【００５６】
実施例１では，ボーンの終点ノードの座標系を「ボーンの座標系」とする(ボーンの付随物は親のボーンの座標系で記述される)。これに対して，第２実施例では，ボーンの始点ノードの座標系を「ボーンの座標系」とする(ボーンの付随物は自身のボーンの座標系で記述される)。
【００５７】
図２０（ａ）は，ある基準となる座標系Oと，その子ノードの座標系C1，さらにその子ノードの座標系C2を示したものである。ノードが２個あるので，ボーンも２本存在することになる。２本のボーンの座標系はそれぞれC1, C2である。第１実施例では，図２０（ａ）のように親側から順に１本目，２本目と，２本のボーンを捉える。ボーンの座標系は，そのボーンの終点位置にある。図２０（ｂ）は，図２０（ａ）と全く同じ状態であるが，ノードの座標系だけでなくノードの実体(モデルの身体部位)を重ねて表示したものである。ノード１の座標系がC1で，ノード２の座標系がC2である。第２実施例では，ノードの実体に沿った見方をし，図２０（ｃ）のように親側から順に１本目，２本目と，２本のボーンを捉える。ボーンの座標系は，そのボーンの始点位置にある。
【００５８】
両者の違いがどのように表れるかを，モデルの腕を例にとって示したものが図２１である。上腕ノードの原点は肩，前腕ノードの原点は肘，手ノードの原点は手首となっている。図のように肩〜肘をボーン１，肘〜手首をボーン２とする。実施例１では，ボーン１の座標系は，肘を原点とする前腕ノードの座標系となり，ボーン２の座標系は，手首を原点とする手ノードの座標系となる。実施例２では，ボーン１の座標系は，肩を原点とする上腕ノードの座標系となり，ボーン２の座標系は，肘を原点とする前腕ノードの座標系となる。
【００５９】
以下の第1の実施例と第２の実施例の詳細な説明を理解する際には，上記の点に留意すべきである。
１．第1の実施例の詳細
１．１．ノードとボーン，ボーングループ
１．１．１．ノードとボーン
上述のように，ボーンの終点ノードの座標系を「ボーンの座標系」とする(ボーンの付随物は親のボーンの座標系で記述される)。
１．１．２．ボーングループ
直鎖状に連なる1本以上のボーンの集合をボーングループとする。ただし，2本のボーンのボーンどうしの接続部は，一方のボーンの始点でかつ他方のボーンの終点となっていなければならない。ボーングループの両端のうち，親側の端を「ボーングループの始点」，子側の端を「ボーングループの終点」とする。
【００６０】
ボーンの親子関係を使って，ボーングループにも親子関係を付ける。
【００６１】
ボーングループの座標系は，終点ボーンの座標系を使うことにする。
【００６２】
テンプレートのn番目ボーングループとキャラクタのn番目のボーングループは，相互に対応する部位となっている。このキャラクタボーングループとテンプレートボーングループの対をボーングループペアと呼ぶ。
１．２．記号，基本式等の定義
１．２．１．共通記号
「'」付きはテンプレートボーンに関するもの，なしはキャラクタボーンに関するものを表す。
【００６３】
「(ini)」付きはボーンの初期状態(初期ポーズ)に関するもの，なしはカレント(現在のポーズ)に関するものを表す。
【００６４】
「G」付きはボーングループに関するものを表す。
１．２．２．キャラクタおよびテンプレートのボーンについて
キャラクタのn番目のボーンをCBnとし，CBnの親ボーンがCBn-1であるとする。
【００６５】
Ln：CBnのローカルマトリクス。
【００６６】
CBn-1座標系における，CBnの位置(trans)，回転(rotate)を表すマトリクス。
【００６７】
Mn：CBnのオブジェクトマトリクス。
【００６８】
オブジェクト座標系(=ノード0原点)における，CBnの位置(trans)，回転(rotate)を表すマトリクス。
【００６９】
Mn=LnLn-1…L1
=LnMn-1
Ln(ini)：キャラクタ初期ポーズにおけるLn。
【００７０】
Mn(ini)：キャラクタ初期ポーズにおけるMn。
【００７１】
Mn(ini)=Ln(ini)Ln-1(ini)…L1(ini)
=Ln(ini)Mn-1(ini)
テンプレートのn番目のボーンをTBnとし，TBnの親ボーンがTBn-1であるとする。
【００７２】
L'n：TBnのローカルマトリクス。
【００７３】
TBn-1座標系における，TBnの位置(trans)，回転(rotate)を表すマトリクス。
【００７４】
M'n：TBnのオブジェクトマトリクス。
【００７５】
オブジェクト座標系(=ノード0原点)における，TBnの位置(trans)，回転(rotate)を表すマトリクス。
【００７６】
M'n=L'nL'n-1…L'1
=L'nM'n-1
L'n(ini)：テンプレート初期ポーズにおけるL'n。
【００７７】
M'n(ini)：テンプレート初期ポーズにおけるM'n。
【００７８】
M'n(ini)=L'n(ini)L'n-1(ini)…L'1(ini) 
=L'n(ini)M'n-1(ini)
１．２．３．キャラクタおよびテンプレートのボーングループについて
キャラクタのn番目のボーングループをCBGnとし，CBGnの親ボーングループがCBGn-1であるとし，以下のように定義する。
【００７９】
LGn：CBGnのローカルマトリクス。
【００８０】
CBGn-1座標系における，CBGnの終点の位置(trans)，回転(rotate)を表すマトリクス。CBGnを構成するボーンを親側から順にCBm”,…,CBm-1,CBmとすると，次式のようになる。
【００８１】
LGn=LmLm-1…Lm”
MGn：CBGnのオブジェクトマトリクス。
【００８２】
オブジェクト座標系(=ノード0原点)における，CBGnの終点の位置(trans)，回転(rotate)を表すマトリクス。
【００８３】
MGn=LGnLGn-1…LG1
=LGnMGn-1
=LmLm-1…Lm”Mm”-1
=Mm
LGn(ini)：キャラクタ初期ポーズにおけるLGn。
【００８４】
LGn(ini)=Lm(ini)Lm-1(ini)…Lm”(ini)
MGn(ini)：キャラクタ初期ポーズにおけるMGn。
【００８５】
MGn(ini)=LGn(ini)LGn-1(ini)…LG1(ini)
=LGn(ini)MGn-1(ini)
=Lm(ini)Lm-1(ini)…Lm”(ini)Mm”-1(ini)
=Mm(ini)
テンプレートのn番目のボーングループをTBGnとし，TBGnの親ボーングループがTBGn-1であるとする。
【００８６】
LG'n：TBGnのローカルマトリクス。
【００８７】
TBGn-1座標系における，TBGnの終点の位置(trans)，回転(rotate)を表すマトリクス。TBGnを構成するボーンを親側から順にTBk”,…,TBk-1,TBkとすると，次式のようになる。
【００８８】
LG'n=L'kL'k-1…L'k”
MG'n：TBGnのオブジェクトマトリクス。
【００８９】
オブジェクト座標系における，TBGnの終点の位置(trans)，回転(rotate)を表すマトリクス。
【００９０】
MG'n=LG'nLG'n-1…LG'1
=LG'nMG'n-1
=L'kL'k-1…L'k”M'k”-1
=M'k
LG'n(ini)：テンプレート初期ポーズにおけるLG'n。
【００９１】
LG'n(ini)=L'k(ini)L'k-1(ini)…L'k”(ini)
MG'n(ini)：テンプレート初期ポーズにおけるMG'n。
【００９２】
MG'n(ini)=LG'n(ini)LG'n-1(ini)…LG'1(ini)
=LG'n(ini)MG'n-1(ini)
=L'k(ini)L'k-1(ini)…L'k”(ini)M'k”-1(ini)
=M'k(ini)
図９に，キャラクタとテンプレートの対応する２つのボーングループを示す。
１．３．ポーズコピーの概要
ポーズコピー処理では，最初に以下の情報が与えられる。
・キャラクタボーンの初期ポーズ
・テンプレートボーンの初期ポーズ
ただし両者の初期ポーズは同じポーズとは限らない。
【００９３】
その後，テンプレートボーンのポーズ(カレントポーズ)が逐次与えられ，これと同じポーズのキャラクタの状態(各ボーンのマトリクス)を求める。
【００９４】
手順としては，まず，テンプレートのボーングループの向きを元に，キャラクタのボーングループの向きを求める。次に，ボーングループ内のボーンの向きを求める。
１．４．座標系調整マトリクス
ボーングループの座標系は，テンプレートとキャラクタとで異なっている。そのため，まず，初期状態のキャラクタボーングループとテンプレートボーングループの情報から，両者の座標系の関係を表す「座標系調整マトリクス」を求める。この処理は最初に1回だけ行えばよい。なお，座標系調整マトリクスは，ボーンの長さ位置を変更しない回転マトリクスである(trans部は特に使用しない)。
１．４．１．重なり状態の作成
座標系調整マトリクスを求めるためには，キャラクタとテンプレートを一旦同じポーズにする必要がある。そのために，以下のようにして「重なり状態」を作る。
【００９５】
ボーングループの始点から終点に向かう有向線分を，「ボーングループの軸」とする。
まず，初期状態のキャラクタとテンプレートを使って，キャラクタのポーズをテンプレートのポーズに合わせる。
【００９６】
ボーングループごとに，CBGnの軸が初期状態TBGnの軸と同じ向きになるように，初期状態CBGnを回転させる(後述の単純回転を使う)。この処理によりテンプレート初期状態と同じポーズになったキャラクタの状態を「重なり状態(overlap)」とよび，このときのボーングループのローカルおよびオブジェクトマトリクスをそれぞれLGn(ovl)，MGn(ovl)と表わすことにする。
【００９７】
重なり状態は以下のように再帰的に求めることができる。いま，グループのn-1番目までLGn-1(ovl)，MGn-1(ovl)が求まっている(CBGnとTBGnとが軸の向きがそろっている)とする。このとき，CBGn座標系において，キャラクタボーンCBGn+1の軸のベクトルをvecとする。また，同様にCBGn座標系において，テンプレートボーンTBGn+1の軸のベクトルをvecToTemplateとすると，以下のように書ける。
【００９８】
ベクトルvec：LGn+1(ini)のtrans部      …(101)
ベクトルvecToTemplate：=(MG'n+1(ini)‐MG'n(ini))(LGn(ini)MGn-1(ovl))-1のtrans部  …(102)
ここで以下のように「単純回転」を定義する。
【００９９】
始点を共有する任意の単位ベクトルva,vbに対して，次の条件を満たす回転を，vaからvbへの単純回転と定める。
・va,vbのなす平面に垂直な軸の回りの回転。
・回転によりvaはvbに重なる。
【０１００】
vaとvbが同じ向きの場合は無回転とする(回転マトリクスで表すと単位行列)。
【０１０１】
vaとvbが反対向きの場合は定義不能とする。
【０１０２】
これを用いて，ボーングループペアBGn+1の重なり状態を得るための回転マトリクスHnを次のように作る(図１０参照)。
【０１０３】
Hn：vecからvecToTemplateへの単純回転。      …(103)
HnはCBGn座標系における回転マトリクスである。
【０１０４】
Hnを使うことにより，次式のようにLGn(ovl)が求まる。
【０１０５】
LGn(ovl)=Hn(LGn(ini)の回転)(LGn(ini)のtrans)
=HnLGn(ini)      …(104)
さらに，MGn(ovl)は以下のようになる。
【０１０６】
MG1(ovl)=LG1(ovl)      …(105) 
MGn(ovl)=LGn(ovl)LGn-1(ovl)…LG1(ovl)      …(106)
これで重なり状態LGn(ovl)，MGn(ovl)が得られた。
１．４．２．座標系調整マトリクスの算出
図１１に座標系を比較する２つの座標系を示す。
【０１０７】
キャラクタボーンの重なり状態LGn(ovl)，MGn(ovl)とテンプレートボーンの初期状態LG'n(ini),MG'n(ini)では，ボーングループの軸の向きはそろった(同じポーズとなった)が，ボーングループの座標系は違っている。そこで，これらの座標系の違いを変換するマトリクスRnを求める(図１１参照)。このRnが「座標系調整マトリクス」である。なお，このセクションの式のマトリクスはすべてtrans部を削除した行列とする。
MG'n(ini)=RnMGn(ovl)      …(107)
このとき，式(107)の右辺の積算部を一つ分解すると次式が得られる。
MG'n(ini)=RnLGn(ovl)MGn-1(ovl)      …(108)
また，式(107)のnにn-1を代入しMGn-1(ovl)を求めると次式が得られる。
MGn-1(ovl)=(Rn-1)-1MG'n-1(ini)      …(109)
式(108),(109)より，
MG'n(ini)=RnLGn(ovl)(Rn-1)-1MG'n-1(ini)      …(110)
一方で，MG'n(ini)は積算行列を一つ分解してMG'n(ini)=LG'n(ini)MG'n-1(ini)であるので，次式が得られる。
LG'n(ini)=RnLGn(ovl)(Rn-1)-1      …(111)
このことから，Rnは以下のように再帰的に求めることができる。
R1=(LG'n(ini)の回転)(LG1(ovl))-1      …(112)
Rn=(LG'n(ini)Rn-1)の回転(LGn(ovl))-1      …(113)
１．５．キャラクタの状態の決定
以上の処理によって，キャラクタとテンプレートの関係を表す座標系調整マトリクス
が得られた。そこで，これを用いて，逐次与えられるテンプレートボーンのポーズ(カレント状態)(rotate,trans)に対して，これと同じポーズになるキャラクタボーンの状態を求める。
【０１０８】
まず，ボーングループの状態を求め，次にボーングループ内のボーンの状態を求める。
１．５．１．CBGnのカレント状態決定処理
まず，ボーングループごとにキャラクタのカレント状態を求める。その際に，座標系調整マトリクスRnを用いる。
【０１０９】
カレントのCBGnのローカルマトリクスは，カレントのTBGnのローカルマトリクスを使って，以下のように求められる。
LGnの回転=(Rn)-1(LG'nの回転)Rn-1      …(114)
１．５．２．CBGn内のキャラクタボーンのカレント状態決定処理
キャラクタのボーングループのカレント状態が決定されたので，次はボーングループ内でのボーンの状態を決定する。
【０１１０】
図１２にボーングループ内でのボーンの状態の決定を示す。
【０１１１】
この処理には，各ボーンの長さの比を利用する。このため，初期状態における，ボーングループ内でのキャラクタボーン，テンプレートボーンの位置換算用の係数dm，および積算長を計算しておく。
【０１１２】
グループのボーンの長さの総和が1になるように正規化した，キャラクタボーンCBmの長さをlm，テンプレートボーンTBkの長さをl'kとする(図１２参照)。テンプレートボーンの積算長からキャラクタボーンの積算長が容易に計算できるように，以下のように長さの端数の比dmを求めておく。
【０１１３】
Σ(i=1~m)li=Σ(i=1~k-1)l'i+dm*lk      …(115)
図１３に，ボーングループ座標系における，カレントのキャラクタボーンの配置を示す。
【０１１４】
次に，積算長に関する端数の比dmを用いて，カレントのテンプレートボーンの全長をキャラクタボーンの長さの比に分割していく(図１３参照)。ボーングループ座標系における，カレントのキャラクタボーンの位置がこれにより求まる。
【０１１５】
ボーングループ内の，テンプレートボーンの長さの総和と，キャラクタボーンの長さの総和との比をratioとする。L'kのtrans部にratioを乗算したものをあらたにL''kとする。
【０１１６】
前述のように，グループ単位でのマトリクスには
LGnの回転=(Rn)-1(LG'nの回転)Rn-1      …(116)
の関係があるので，この関係を使って，次のようにLGnを求める。
LGn=(Rn)-1L''kL''k-1…Rn-1      …(117)
さらにキャラクタボーンの終点位置を一旦配置するために，まず，L'''kを以下のように定める。
L'''k=L''kL''k-1…Rn-1      …(118)
L'''k-1=L''k-1…Rn-1
…
このとき，ボーングループ座標系におけるカレントのキャラクタボーンCBmの終点位置Pntmは，L'''k-1とL'''kのtransをdmで補間して，以下のようになる。
Pntm=((1-dm)*L'''k-1+dm*L'''k)のtrans      …(119)
図１３に，CBmを確定する処理を示す。
【０１１７】
以上の処理により，CBmの軸の方向は確定したが，軸まわりの「ひねり」は未定である。そこで，初期状態の軸方向(initVec)から，確定した軸方向(currentVec)への単純回転Qmを使って，CBmを確定する(図１３参照)。
【０１１８】
つまりCBm-1座標系において表すと次のようになる。
ベクトルinitVec：(Lm+1(ini)のtrans)(Lm(ini)の回転)      …(120)
ベクトルcurrentVec：(Pntm+1‐Pntm)(Wm`-1)-1のtrans      … (121)
ただしWm`は以下のようなボーングループ内の積算行列である。
Wm`=Lm`Lm`-1…Lm      …(122)
Wm`=Lm`Wm`-1となるので，Lmから順に再帰的に求めることができる。
ただし，グループ内の最後部のボーンLm`だけは，LGn=Lm`Lm`-1…Lmが成り立つように，LGnから逆算して求める。
L1=回転はL1(ini)Q1でtransはPnt1      …(123)
W1=L1      …(124)
Lm=回転はLm(ini)QnでtransはPntm(Wm`-1)-1      …(125)
Wm`=Lm`Wm`-1      …(126)
ただし，m=m`の場合(ボーングループの終点のボーン)のみ，
Lm`=LGn(Wm`-1)-1      …(127)
以上により，キャラクタの各ボーンのローカルマトリクスが得られ，キャラクタのポーズが確定する。
【０１１９】
図１４に，キャラクタのポーズが確定する処理を示す。
２．第２の実施例の詳細
２．１．モデルの構成
２．１．１．ノード，ボーン
モデルの身体の各部位は，親子関係で繋がっている。この各部位をノードと呼ぶ。ボーンとはノードのことであり，そのノードの原点をボーンの始点，子ノード(のうちの一つ)の原点をボーンの終点と呼ぶことにする。始点から終点へ向かう有向線分を，「ボーンの軸」とする。ボーンの軸を表すベクトルをボーンの軸ベクトルとし，このベクトルを大きさ1に正規化したものを，ボーンの単位軸ベクトルとする。ボーンの軸ベクトルの大きさを，ボーンの長さとする。
２．１．２．テンプレートとキャラクタ
あるモデルから別のモデルにポーズをコピーする際に，コピー元のモデルを「テンプレート」，コピー先のモデルを「キャラクタ」と呼ぶ。テンプレートを構成するノードの個数と，キャラクタを構成するノードの個数とは，一般に異なったものになっている。また，ノードが持つ座標系の向きについても特にルールはなく，それぞれ異なる方向を向いている。
２．１．３．ボーングループ
1本以上のボーンが親子関係で直鎖状に繋がったものをボーングループとする。ただし，ボーングループを一方の端から他方の端へと辿ると，全て「親→子」(あるいは全て「子→親」)となっていなければならない。
ボーングループの両端のうち，親側を始点，子側を終点とする。より正確に表現すると，ボーングループの最も親側のボーンの始点が，ボーングループの始点である。同様に，ボーングループの最も子側のボーンの終点が，ボーングループの終点である。
ボーングループの始点から終点へ向かう有向線分を，「ボーングループの軸」とする。ボーングループの軸を表すベクトルを，ボーングループの軸ベクトルとし，このベクトルを大きさ1に正規化したものを，ボーングループの単位軸ベクトルとする。
モデルを構成するボーンを，複数のボーングループに分ける。ただし，ボーングループがボーンを共有してはならない。ボーングループの親子関係は，ボーンの親子関係に準ずる。
テンプレートからキャラクタにポーズをコピーする際に，前もってそれぞれのモデルにボーングループを構成し，両モデルの似通った部位にあるボーングループどうしに，1対1の対応関係を付けておく。
ポーズをコピーする際には，まずテンプレートのボーングループの向きに基づいて，キャラクタのボーングループの向きを決定し，次にボーングループ内のボーンの向きを決める。
２．２．座標系
２．２．１．ボーンの座標系
ノードはそれぞれ自分の座標系を持っている。ボーンの座標系は，そのボーンに相当するノードの座標系とする。
前述のように，ボーンの座標系の向きについてはルールがない。そのため，ボーン軸の方向をそのボーンの座標系で表したベクトルも，ボーン毎に違ったものになる。例えば，あるボーンでは，ボーン軸がそのボーンのx軸方向となっているが，別のあるボーンでは，ボーン軸がそのボーンのy軸方向になっていることがある。
２．２．２．ボーングループの座標系
ボーングループの1本目(最も親側)のボーンの座標系に対して，「1本目のボーンの軸からボーングループの軸への単純回転」を掛けたものを，ボーングループの座標系とする。単純回転については付録Aを参照。
２．２．３．オブジェクト座標系
ボーンの座標系の向きについてはルールがないが，最も親のボーンだけは例外とする。それぞれのモデルの最も親のノードを，そのモデルの「ルートノード」と呼ぶ。ルートノードの座標系だけは，モデルによらず同じ方向を向いている。例えば，z軸がモデルの正面方向，y軸がモデルの上方向といった具合である。ルートノード(ルートボーン)の座標系を「オブジェクト座標系」と呼ぶ。
２．２．４．オブジェクトマトリクス，ローカルマトリクス
ボーンの向き(姿勢や回転)をマトリクスで表すには，ボーン自身の座標系だけでなく，基準となる座標系が必要である。基準座標系としてオブジェクト座標系を使った場合のマトリクスを，そのボーンのオブジェクトマトリクスという。基準座標系として親ボーンの座標系を使った場合のマトリクスを，そのボーンのローカルマトリクスという。ボーングループについても同様の呼び方をする。
２．３．記号，基本式
以下のように記号を定義する。TBGn：n番のテンプレートボーングループ。
【０１２０】
CBGn：n番のキャラクタボーングループ。
【０１２１】
BGn：n番のボーングループ。TBGnとCBGnを合わせたものを表す。ボーングループペア。
【０１２２】
MGn'：TBGnのオブジェクトマトリクス。
【０１２３】
LGn'：TBGnのローカルマトリクス。
【０１２４】
MGn：CBGnのオブジェクトマトリクス。
【０１２５】
LGn：CBGnのローカルマトリクス。
【０１２６】
TBk：k番のテンプレートボーン。
【０１２７】
Mk'：TBkのオブジェクトマトリクス。
【０１２８】
Lk'：TBkのローカルマトリクス。
【０１２９】
CBm：m番のキャラクタボーン。
【０１３０】
Mm：CBmのオブジェクトマトリクス。
【０１３１】
Lm：CBmのローカルマトリクス。
【０１３２】
以上のように，テンプレートに関するものには「'」を付ける。また，初期状態に関するものには「(ini)」を付ける。特に断りのない限り，番号(添え字)は親から子へと進むごとに1ずつ増えるものとする。なお，マトリクスは3行3列とし，要素の並びは行ベクトルに右からマトリクスを掛ける方式によるものとする。
オブジェクトマトリクスとローカルマトリクスの間には，次のような関係がある。
【０１３３】
MGn=LGnLGn-1LGn-2      …(201)
=LGnMGn-1      …(202)
テンプレートボーングループについても，同様の関係が成り立つ。また，ボーンのオブジェクトマトリクスとローカルマトリクスについても同様である。
２．４．ポーズコピー処理の概要
２．４．１．初期状態
予めテンプレートモデルとキャラクタモデルの初期状態が与えられ，この初期状態では，両モデルが同じポーズになっているものとする。ただし，「同じポーズ」とは，両モデルのボーン(あるいはボーングループ)の向きが同じという意味ではないので，注意が必要である。図１５は，テンプレートモデルとキャラクタモデルの初期状態の例である。両モデルは同じポーズをとっているが，両者の鎖骨の向きを比べると，明らかに異なっている。
２．４．２．ポーズのコピー
ポーズのコピーとは，テンプレートのあるポーズ(カレントポーズ)が与えられ，これと同じキャラクタのポーズを求めることである。与えられる情報はテンプレートの全ボーンのオブジェクトマトリクスMk'で，求めるべき値はキャラクタの全ボーンのオブジェクトマトリクスMmである。
ポーズをコピーする際には，まずテンプレートのボーングループの向きに基づいて，キャラクタのボーングループの向きを決定し，次にボーングループ内のボーンの向きを決める。
２．４．３．向き決めの手順
ボーンの座標系がボーン毎に異なるのと同様に，ボーングループの座標系もボーングループ毎に異なる。そこで，「テンプレートボーングループの座標系から，対応するキャラクタボーングループの座標系への変換」を行なう座標系調整マトリクスを，最初に求めておく。
【０１３４】
カレントのテンプレートのボーングループの向きから，キャラクタのボーングループの向きを決める際には，上記の座標系調整マトリクスを使う。それだけでなく，初期ポーズにおけるテンプレートとキャラクタのボーングループの向きの違いを考慮する必要がある。
【０１３５】
以下，向き決め手順の詳細について述べる。
２．５．座標系調整マトリクス
まず，座標系調整マトリクスを求める。この計算は，テンプレートとキャラクタの初期ポーズが与えられた時点で，1回だけ行なえば良い。
２．５．１．補正初期状態
図１６は，軸合わせ単純回転を示す。
【０１３６】
TBGnの初期軸方向からCBGnの初期軸方向への単純回転を，BGnの「軸合わせ単純回転」と呼ぶことにする(図１６参照)。TBGnの初期状態に対して軸合わせ単純回転を施した状態を，TBGnの補正初期状態とする。以下のようにして，TBGn-1座標系で，補正初期状態の向きを表すマトリクスを求める。
【０１３７】
BGnの軸合わせ単純回転を，オブジェクト座標系で表したマトリクスをSGn*とし，同回転をTBGn初期座標系で表したものをSGnとする。
【０１３８】
SGn=MGn'(ini)SGn*MGn'(ini)-1      …(203)
TBGnの補正初期状態の向きをTBGn-1の初期座標系で表したものをLGn'(mod)とする。
【０１３９】
LGn'(mod)=SGnLGn'(ini)      …(204)
=MGn'(ini)SGn*MGn'(ini)-1LGn'(ini)      …(205)
=MGn'(ini)SGn*MGn-1'(ini)-1      …(206)
LGn'(mod)は以下のようにして求めることもできる。
【０１４０】
BGnの軸合わせ単純回転を，TBGn-1初期座標系で表したものをSGn-1とする。
【０１４１】
SGn-1=MGn-1'(ini)SGn*MGn-1'(ini)-1      …(207)
LGn'(mod)=LGn'(ini)SGn-1      …(208)
=LGn'(ini)MGn-1'(ini)SGn*MGn-1'(ini)-1      …(209)
=MGn'(ini)SGn*MGn-1'(ini)-1      …(210)
２．５．２．座標系調整マトリクスの算出
TBGnの補正初期状態とCBGnの初期状態との間の，座標軸の違いを調整するマトリクスを求める。オブジェクト座標系で表すと，前者の向きはLGn'(mod)MGn-1'(ini)で，後者の向きはMGn(ini)である。両者の間の変換をTBGn補正初期座標系で表したマトリクスをAGnとする。これが，求めるべき座標系調整マトリクスである。AGnは，次式により得られる。
【０１４２】
AGn=MGn(ini)(LGn'(mod)MGn-1'(ini))-1      …(211)
=MGn(ini)MGn-1'(ini)-1LGn'(mod)-1      …(212)
=MGn(ini)MGn-1'(ini)-1MGn-1'(ini)SGn*-1MGn'(ini)-1      …(213)
=MGn(ini)SGn*-1MGn'(ini)-1      …(214)
AGnは以下のようにして求めることもできる。
【０１４３】
まず，オブジェクト座標系での変換マトリクスAGn*を，次式のようにして求める。
【０１４４】
LGn'(mod)MGn-1'(ini)AGn*=MGn(ini)      …(215)
∴AGn*=MGn-1'(ini)-1LGn'(mod)-1MGn(ini)      …(216)
AGn*をTBGnの補正初期座標系に変換し，AGnを求める。
【０１４５】
AGn=(LGn'(mod)MGn-1'(ini))AGn*(LGn'(mod)MGn-1'(ini))-1      …(217)
=LGn'(mod)MGn-1'(ini)MGn-1'(ini)-1LGn'(mod)-1MGn(ini)MGn-1'(ini)-1LGn'(mod)-1      …(218)
=MGn(ini)MGn-1'(ini)-1LGn'(mod)-1      …(219)
=MGn(ini)SGn*-1MGn'(ini)-1      …(220)
２．６．ボーングループの向き決め
与えられたテンプレートのカレントポーズから，キャラクタのポーズを求めるために，最初にキャラクタのボーングループの向き(姿勢や回転)を求める。
【０１４６】
まず，LGn'(ini)からLGn'への回転を求める。これは，テンプレートのカレント状態全体をまとめて動かして，TBGn-1の向きが合うように初期状態に重ね，その状態でTBGnの向きを比較することに相当する。
【０１４７】
TBGnの，初期状態からカレント状態への回転を，TBGnの初期座標系で表したマトリクスをDnとする。Dnは次式により得られる。
【０１４８】
Dn=LGn'LGn'(ini)-1      …(221)
Dnを曲げマトリクスDBnと捻りマトリクスDTnに分解する。
【０１４９】
Dn=DTnDBn      …(222)
曲げマトリクスDBnには，必要に応じて曲げ量にスケールを掛けて，DBn(adj)とし，これを使って次式のようにDn(adj)を再合成する。(詳細については次節参照。)
Dn(adj)=DTnDBn(adj)      …(223)
この回転をTBGnの補正初期状態に対して掛けて，その向きLGn(1)'を求める。
【０１５０】
LGn(1)'=Dn(adj)LGn'(mod)      …(224)
=Dn(adj)MGn'(ini)SGn*MGn-1'(ini)-1      …(225)
MGn-1'を掛けて，TBGn-1座標系からオブジェクト座標系に変換する。
【０１５１】
MGn(1)'=LGn(1)'MGn-1'      …(226)
=Dn(adj)MGn'(ini)SGn*MGn-1'(ini)-1MGn-1'      …(227)
AGnを掛けて，TBGnとCBGnの座標系の違いを調整して，MGnを求める。
【０１５２】
MGn=AGnMGn(1)'      …(228)
=AGnDn(adj)MGn'(ini)SGn*MGn-1'(ini)-1MGn-1'      …(229)
なお，右辺中のMGn'(ini)SGn*MGn-1'(ini)-1の部分は，初期ポーズだけから求められるので，最初に1回だけ計算しておけば良い。
（参考）
曲げ量の調整をしない場合は，以下のようになる。
【０１５３】
MGn=AGnLGn'LGn'(ini)-1MGn'(ini)SGn*MGn-1'(ini)-1MGn-1'      …(230)
=AGnLGn'MGn-1'(ini)SGn*MGn-1'(ini)-1MGn-1'      …(231)
２．７．曲げ捻り分解と曲げ量調整
２．７．１．曲げ量の調整の必要性
テンプレートからキャラクタにポーズをコピーする際に，ボーングループの向きよりも両端の相対位置を重視したい場合がある。このような場合には，ボーン(ボーングループ)の長さに応じた調整が必要となる。例えばTBGnの両端距離に比べてCBGnの両端距離が長い場合，TBGnとの回転と同じ角度だけCBGnを回転させると，両端点の相対変位量はCBGnのほうが大きくなってしまう。これを調整するには，CBGnの回転のうち，曲げ成分だけを小さくし，捻り成分の大きさは維持する必要がある。
２．７．２．曲げ捻りの分解
TBGnの，初期状態からカレント状態への回転を，TBGnの初期座標系で表したマトリクスをDnとする。このDnを次式のように，曲げマトリクスDBnと捻りマトリクスDTnに分解するものとする。
【０１５４】
Dn=DTnDBn      …(232)
カレント状態のTBGn軸を，オブジェクト座標系で表したベクトルをvGnとし，これをTBGnの初期座標系に変換したベクトルをvGn(2)とする。vGnからvGn(2)を求める式は次のようになる。
【０１５５】
vGn(2)=vGnMGn-1'LGn'(ini)-1      …(233)
一方，TBGn軸を，自分自身(TBGn)の座標系で表したベクトルをvGn(self)とする。前述の曲げマトリクスDBnはvGn(self)からvGn(2)への単純回転として得られる。このDBnを使って，捻りマトリクスDTnは次式により得られる。
【０１５６】
DTn=DnDBn-1      …(234)
２．7.3．曲げの調整と曲げ捻り再合成
TBGnの両端距離とCBGnの両端距離との比をrnとする。曲げマトリクスDBnの曲げ角をrn倍にしたマトリクスをDBn(adj)とする。これを使って，次式のように曲げと捻りを再合成し，調整済みのマトリクスDn(adj)を得る。
【０１５７】
Dn(adj)=DTnDBn(adj)      …(235)
２．８．ボーングループ内のボーンの向き決め
テンプレートボーングループTBG(ボーングループの番号は省略する)内のテンプレートボーンの配置状態から，対応するキャラクタボーングループCBG内のキャラクタボーンの配置を求める。
２．８．１．共通化座標系
既に述べたように，TBGの座標系は，TB1の座標系に対して，TB1軸からTBG軸への単純回転を掛けたものである。ここで新たに，各ボーンTBk(k=1,2,…)の「共通化座標系」を以下のように設定する。
【０１５８】
テンプレートの初期状態において，TBG座標系に対して，TBG軸からTBk軸への単純回転を掛けたものをTBkの共通化座標系とする。TB1の共通化座標系は，TB1本来の座標系に一致する。
【０１５９】
キャラクタのボーンについても，テンプレートのボーンと同様にして共通化座標系を設定するが，前述のボーングループどうしの座標系調整マトリクスAGによる調整を加える。キャラクタの初期状態において，CBG座標系をAGで調整したものに対して，CBG軸からCBm軸への単純回転を掛けたものをCBmの共通化座標系とする。
【０１６０】
ボーンの共通化座標系には次のような特長がある。各ボーンが持っている本来の座標系の向きは，ボーン毎にさまざまである。そのため，TBkの軸をTBk座標系で表した単位軸ベクトルは，一般にボーン毎に異なった値になる。一方，TBkの軸をTBk共通化座標系で表した単位軸ベクトルは，そのボーングループ内のボーンについては，全て同じ値になる。同様に，ボーンTBkの捻り回転(ボーン軸回りの回転)をTBk座標系で表すと，ボーン毎に異なるマトリクスになるが，TBk共通化座標系で表すと全て同じマトリクスになる。キャラクタボーンについても同様である。ボーンの向き(姿勢や回転)を補間する際に，この特長が生かされる。
【０１６１】
ボーンの共通化座標系の向きをオブジェクト座標系で表したマトリクスをΩjとする。また，ボーンの共通化座標系の向きをボーングループ座標系で表したマトリクスをΛjとする。添え字jはボーンの番号である。テンプレートボーンについては「'」を付け，初期状態については「(ini)」を付けて区別する。
２．８．１．１．テンプレートボーンの共通化座標系
テンプレートの初期状態を使って，以下の方法で，各ボーンの本来の座標系と共通化座標系との間の変換マトリクスを求めておく。
【０１６２】
TBGの軸をオブジェクト座標系で表したベクトルをvG'(ini)とする。また，TBkの軸をオブジェクト座標系で表したベクトルをvk'(ini)とする。vG'(ini)からvk'(ini)への単純回転をSk'とする。
【０１６３】
TBkの共通化座標系の向きを，オブジェクト座標系で表したマトリクスを，Ωk'(ini)とする。TBGの向きをオブジェクト座標系で表したマトリクスがMG'(ini)なので，これにSk'を掛けることにより，次式のようにΩk'(ini)が得られる。
【０１６４】
Ωk'(ini)=MG'(ini)Sk'      …(236)
一方，TBkの本来の座標系の向きをオブジェクト座標系で表したマトリクスはMk'(ini)である。両者の間の変換マトリクスを求めておく。具体的には，Mk'(ini)からΩk'(ini)への変換を，TBk本来の座標系で表したマトリクスをΦk'とする。これは次式により得られる。
【０１６５】
Φk'=Ωk'(ini)Mk'(ini)-1      …(237)
=MG'(ini)Sk'Mk'(ini)-1      …(238)
TBkの共通化座標系の向きを，TBG座標系で表したマトリクスを，Λk'(ini)とする。これは次式により得られる。
【０１６６】
Λk'(ini)=Ωk'(ini)MG'(ini)-1      …(239)
=MG'(ini)Sk'MG'(ini)-1      …(240)
Φk'とΛk'(ini)は，初期ポーズだけから求められるので，最初に1回だけ計算しておけば良い。
２．８．１．２．キャラクタボーンの共通化座標系
キャラクタの初期状態を使って，以下のような方法で，各ボーンの本来の座標系と共通化座標系との間の変換マトリクスを求めておく。
【０１６７】
CBGの軸をオブジェクト座標系で表したベクトルをvG(ini)とする。また，CBmの軸をオブジェクト座標系で表したベクトルをvm(ini)とする。vG(ini)からvm(ini)への単純回転をSmとする。
【０１６８】
CBmの共通化座標系の向きを，オブジェクト座標系で表したマトリクスを，Ωm(ini)とする。CBGの向きをオブジェクト座標系で表したマトリクスがMG(ini)なので，これをTBG座標系に変換し，更にSmを掛けることにより，次式のようにΩm(ini)が得られる。
【０１６９】
Ωm(ini)=AG-1MG(ini)Sm      …(241)
一方，CBmの本来の座標系の向きをオブジェクト座標系で表したマトリクスはMm(ini)である。両者の間の変換マトリクスを求めておく。具体的には，Mm(ini)からΩm(ini)への変換を，CBm本来の座標系で表したマトリクスをΦmとする。これは次式により得られる。
【０１７０】
Φm=Ωm(ini)Mm(ini)-1      …(242)
=AG-1MG(ini)SmMm(ini)-1      …(243)
CBmの共通化座標系の向きを，CBG座標系で表したマトリクスを，Λm(ini)とする。これは次式により得られる。
【０１７１】
Λm(ini)=Ωm(ini)MG(ini)-1      …(244)
=AG-1MG(ini)SnMG(ini)-1      …(245)
ΦmとΛm(ini)は，初期ポーズだけから求められるので，最初に1回だけ計算しておけば良い。
２．８．２．初期状態からの向きの変化
テンプレートのカレント状態からキャラクタのカレント状態を求める。まず，以下のようにして，カレント状態におけるTBk共通化座標系の向きを求める。
【０１７２】
TBkの共通化座標系の向きを，オブジェクト座標系で表したマトリクスを，Ωk'とする。Ωk'は，変換マトリクスΦk'を使って，次式のように得られる。
【０１７３】
Ωk'=Φk'Mk'      …(246)
TBkの共通化座標系の向きをTBG座標系で表したマトリクスをΛk'とする。これは次式により得られる。
【０１７４】
Λk'=Ωk'MG'-1      …(247)
=Φk'Mk'MG'-1      …(248)
TBkの向きの，初期状態からの変化を，次式のようにUk'で表す。
【０１７５】
Uk'=Λk'Λk'(ini)-1      …(249)
２．８．３．向き変化量の補間
一般に，テンプレートとキャラクタでは，ボーングループ内のボーンの数が異なる。また，ボーングループ内の個々のボーンの長さも，同じ長さとは限らない。そのため，テンプレートボーンについて求めた前述のUk'を，そのままキャラクタボーンの向き変化として使うことはできない。
【０１７６】
そこで，Uk'を補間したものを，キャラクタボーンの向き変化量Umとする。図１７に補間の方法を示す。この図１７は，ある1つのボーングループのペアを表したもので，テンプレートボーングループはTB1,TB2,TB3の3本のボーンで構成され，キャラクタボーングループはCB1,CB2,CB3,CB4の4本のボーンで構成されている。
【０１７７】
テンプレートとキャラクタのそれぞれについて，ボーングループを構成するボーンを一直線に並べて，更にボーングループの全長(ボーン長さの総和)が1になるようにスケールを掛けてある。テンプレートボーンの中点を使って，全長をA1〜A4の4つの領域に分ける。
【０１７８】
Umは，CBmの中点がどの領域に位置するかによって変える。位置する領域がAkであれば，UmはUk-1'とUk'を補間して求める(領域Akの左端でUk-1'，右端でUk'になるようにする)。ただし，領域A1ではUm=U1'とし，領域A4ではUm=U3'とする。
【０１７９】
補間方法としては，以下のように幾つかの方法が挙げられる。
・マトリクスから四元数(quaternion)に変換し，球面線形補間し，再びマトリクスに戻す。
・マトリクスの要素を補間し，Gram-Schmidtの直交化を使ってマトリクスの歪みを除去する。
・マトリクスを曲げと捻りに分解し，それぞれを補間し，再合成する。
【０１８０】
また，両端の領域A1,A4で，隣接するボーン(ボーングループ)の捻りを使って捻り回転を補間すれば，ボーングループ境界で捻りの連続性を実現できる。
２．８．４．キャラクタボーンの向き決定
補間によって得られた各Umを使って，以下の手順で各CBmの向きを決める。
【０１８１】
まず，CBmの共通化座標系の向きをCBG座標系で表したマトリクスΛmを，次式により求める。
【０１８２】
Λm=UmΛm(ini)      …(250)
次に，CBmの共通化座標系の向きをオブジェクト座標系で表したマトリクスΩmを，次式により求める。
【０１８３】
Ωm=ΛmMG      …(251)
=UmΛm(ini)MG      …(252)
最後に，Φmを使って，CBmの共通化座標系からCBm本来の座標系に変換し，次式のようにMmを得る。
【０１８４】
Mm=Φm-1Ωm      …(253)
=Φm-1UmΛm(ini)MG      …(254)
２．８．５．ボーングループの向き修正
以上の方法でボーングループ内のボーンの向きを決めると，ボーングループの軸方向が変わってしまう。そこで最後に，変化後のボーングループ軸から変化前のボーングループ軸への単純回転を使って，ボーングループ全体を回転させ，ボーングループ軸の方向を元に戻す。
２．９．長さ０のボーンへの対応
２．９．１．ボーン長さと単純回転
以上で述べたポーズコピー手法では，計算の随所でボーン軸を使った単純回転を利用している。そのため，長さが0のボーンがあると，単純回転を定義不能となり処理を実行できなくなる。また，ボーン長さが0でなくとも極端に短い場合には，計算精度上の問題が起こり得る。そこでボーン長さの最小値ebを決め，これよりも短いボーンは計算時にボーンの長さ(ボーンの軸)を調整する。
【０１８５】
最小値ebの値としては，ポーズに与える影響が外観上問題ない程度に小さく，かつ計算精度上問題を生じない程度に大きい値であればよい(一例としてはモデルの身長の0.001倍)。
２．９．２．ボーン軸ベクトルの調整
ボーンの長さ調整は以下のように行なう。初期状態において，ボーングループ及び各ボーンを親から子へと順に辿りボーン長さを調べ，eb未満のボーンB(zero)が見つかった場合，以下のように処理する。
【０１８６】
まず，同一ボーングループ内のボーンを子側に辿り長さeb以上のボーンを探し，最初に見つかったボーンをB(len)とする。B(zero)の軸ベクトルを，長さはebにし，方向はB(len)の軸方向に修正する。なお，ボーンの座標系については元のままとする。
【０１８７】
図１８にボーン軸ベクトルの調整を示す。
【０１８８】
例えば図１８(a)のように，ボーンB2の長さがeb未満であった場合，この修正により図１８(b)のようになる。
【０１８９】
子側に辿っても長さeb以上のボーンが見つからなかった場合は，同一ボーングループ内の親ボーンを上記B(len)として使う。ボーングループ内の全ボーンの長さがeb未満の場合は，上記B(len)軸の替わりに，親ボーングループの軸を使う。親ボーングループが存在しない場合は，予め決めておいた既定のベクトルを使う。
【０１９０】
ただし，この修正されたボーン軸は，一連の向き決め処理で使うだけで，最終的にキャラクタのポーズを更新する際には，各ノードの向き(回転)のみを更新し，ボーンの長さは一切変更しない。
２．１０．付録A単純回転
図１９に単純回転を示す。
【０１９１】
以下のように「単純回転」を定義する(図１９参照)。始点を共有する任意の2つのベクトル(あるいは有向線分)va,vbに対して，次の条件を満たす回転を，vaからvbへの単純回転と定める。
・va,vbのなす平面に垂直な軸の回りの回転。
・回転によりvaはvbに重なる。
vaとvbが同じ向き(即ちva=kvb,k>0)の場合は無回転とする(回転マトリクスで表すと単位行列)。
vaとvbが反対向き(即ちva=kvb,k<0)の場合は定義不能とする。
【図１】
0005490080.tif 000004
【図２】
0005490080.tif 000005
【図４】
0005490080.tif 000006
【図５】
0005490080.tif 000007
【図６】
0005490080.tif 000008
【図７】
0005490080.tif 000009
【図８】
0005490080.tif 000010
【図９】
0005490080.tif 000011
【図１０】
0005490080.tif 000012
【図１１】
0005490080.tif 000013
【図１２】
0005490080.tif 000014
【図１３】
0005490080.tif 000015
【図１４】
0005490080.tif 000016
【図１６】
0005490080.tif 000017
【図１７】
0005490080.tif 000018
【図１８】
0005490080.tif 000019
【図１９】
0005490080.tif 000020
【図２０】
0005490080.tif 000021
【図２１】
0005490080.tif 000022
【図３】
0005490080.tif 000023
【図１５】
0005490080.tif 000024