(57)【要約】【課題】非常に大きな衝撃や外力等がキャラクタに与えられた場合であっても、そのキャラクタの自然な動作をリアルタイムに生成する。【解決手段】キャラクタの基準となる部分および全関節の現在状態を表すデータと複数の動作状態のデータとを滑らかに接続して連続した１の動作データを生成する動作合成手段１２、生成された動作データを目標動作として自然な動作を実現するようにキャラクタの基準となる部分の並進、回転加速度および各関節の角加速度を算出する動作制御手段１３、動作制御手段１３によって生成された動作データを目標動作として自然な動作を実現できるか判定する動作判定手段１４、動作判定手段１４による判定の結果、自然な動作を実現できない場合に動作データに代わる適切なリアクション動作のデータを生成するリアクション動作生成手段１５、キャラクタの動作状態を表すデータを算出する動作演算手段１６を備える。【選択図】　　　　図１
2004030502.tif 000002
【特許請求の範囲】
【請求項１】
動作開始時のキャラクタの基準となる部分および全関節の状態を表すデータと複数の動作データとを滑らかに接続して連続した一つの動作データを生成する動作合成ステップと、
この動作合成ステップにおいて生成された動作データを目標動作として自然な動作を実現するように前記キャラクタの基準となる部分の並進、回転加速度および各関節の回転加速度を算出する動作制御ステップと、
前記キャラクタの基準となる部分および全関節の現在状態を表すデータと前記動作制御ステップにおいて算出されたキャラクタの基準となる部分の並進、回転加速度および各関節の回転加速度とから、前記動作合成ステップにおいて生成された動作データを目標動作として前記動作制御ステップにより自然な動作を実現できるか否かを判定する動作判定ステップと、
前記動作判定ステップにおける判定の結果、前記動作合成ステップにおいて生成された動作データを目標動作とした自然な動作を実現できない場合に、この動作データに代わる適切なリアクション動作の動作データを生成するリアクション動作生成ステップと、
前記キャラクタの基準となる部分および全関節の現在状態を表すデータと前記動作制御ステップにおいて算出されたキャラクタの基準となる部分の並進、回転加速度および各関節の回転加速度とに基づいて、前記キャラクタの基準となる部分および全関節の動作状態を表すデータを算出する動作演算ステップと
を含むシミュレーション方法。
【請求項２】
動作開始時のキャラクタの基準となる部分および全関節の状態を表すデータと複数の動作データとを滑らかに接続して連続した一つの動作データを生成する動作合成手段と、
この動作合成手段により生成された動作データを目標動作として自然な動作を実現するように前記キャラクタの基準となる部分の並進、回転加速度および各関節の回転加速度を算出する動作制御手段と、
前記キャラクタの基準となる部分および全関節の現在状態を表すデータと前記動作制御手段により算出されたキャラクタの基準となる部分の並進、回転加速度および各関節の回転加速度とから、前記動作合成手段により生成された動作データを目標動作として前記動作制御手段により自然な動作を実現できるか否かを判定する動作判定手段と、
前記動作判定手段による判定の結果、前記動作合成手段により生成された動作データを目標動作とした自然な動作を実現できない場合に、この動作データに代わる適切なリアクション動作の動作データを生成するリアクション動作生成手段と、
前記キャラクタの基準となる部分および全関節の現在状態を表すデータと前記動作制御手段により算出されたキャラクタの基準となる部分の並進、回転加速度および各関節の回転加速度とに基づいて、前記キャラクタの基準となる部分および全関節の動作状態を表すデータを算出する動作演算手段と
を備えたシミュレーション装置。
【請求項３】
動作開始時のキャラクタの基準となる部分および全関節の状態を表すデータと複数の動作データとを滑らかに接続して連続した一つの動作データを生成する動作合成手段と、
この動作合成手段により生成された動作データを目標動作として自然な動作を実現するように前記キャラクタの基準となる部分の並進、回転加速度および各関節の回転加速度を算出する動作制御手段と、
前記キャラクタの基準となる部分および全関節の現在状態を表すデータと前記動作制御手段により算出されたキャラクタの基準となる部分の並進、回転加速度および各関節の回転加速度とから、前記動作合成手段により生成された動作データを目標動作として前記動作制御手段により自然な動作を実現できるか否かを判定する動作判定手段と、
前記動作判定手段による判定の結果、前記動作合成手段により生成された動作データを目標動作とした自然な動作を実現できない場合に、この動作データに代わる適切なリアクション動作の動作データを生成するリアクション動作生成手段と、
前記キャラクタの基準となる部分および全関節の現在状態を表すデータと前記動作制御手段により算出されたキャラクタの基準となる部分の並進、回転加速度および各関節の回転加速度とに基づいて、前記キャラクタの基準となる部分および全関節の動作状態を表すデータを算出する動作演算手段と
してコンピュータを機能させるシミュレーションプログラム。
【請求項４】
前記動作合成手段は、互いに接続するデータの前の動作の終わりの部分と次の動作の始まりの部分を混合するものである請求項３記載のシミュレーションプログラム。
【請求項５】
前記動作合成手段は、互いに接続するデータの間に接続のための中間の動作データを挿入し、各データ間を補間するものである請求項３記載のシミュレーションプログラム。
【請求項６】
前記リアクション動作生成手段により生成するリアクション動作は、バランスを保つために足を踏み出す動作、バランスを崩して着地する動作、関節負荷が大きいときに安定した姿勢に戻る動作のいずれかを含むものである請求項３から５のいずれかに記載のシミュレーションプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンピュータゲームなどに登場する人物や動物等の仮想キャラクタの動作をリアルタイムに生成するシミュレーション方法、シミュレーション装置およびシミュレーションプログラムに関する。
【０００２】
【従来の技術】
コンピュータゲームに登場する人物などのキャラクタの動作は、あらかじめ作成しておいた動作データを連続的に再生することによって生成している。そのため、従来のコンピュータゲームでは、一定の動作の繰り返ししか再現できないという制約がある。この制約は、キャラクタが単体で動作している場合にはそれほど問題とならない。しかしながら、キャラクタ同士が衝突したり、外部から力を加えられたりといった、環境からの力学的な変化が加えられた場合には、自然な動作を生成できないという大きな問題が生じる。
【０００３】
例えば、キャラクタが衝突したり押されたりしたときには、バランスを崩してよろめいたり、転倒したりといった動作を再現することが期待される。このような動作は、外部からの衝撃や力が加わる場所や大きさに応じて変化させる必要がある。しかしながら、現在の主なアプローチでは、一定の動作を再生することしかできないため、キャラクタが毎回同じ倒れ方をするといった不自然な動作が再現されてしまう。
【０００４】
本発明者らは、これまでに上記の問題を解決するための動作制御手法（Ｃｏｍｐｕｔｅｒ　Ｇｒａｐｈｉｃｓ　Ｆｏｒｕｍ（ＥＵＲＯＧＲＡＰＨＩＣＳ　２００１）２０，３，１９２−２０２）を提案した。本手法では、あらかじめ作成しておいた動作データを単純に再生するのではなく、与えられた動作データを目標動作として、目標動作に追従するようにキャラクタの関節角加速度を制御し、動力学シミュレーションによって実際の動作を計算する。本動作制御手法では、関節に加わる負荷や全身のバランスを考慮してキャラクタの関節角加速度を制御する。その結果、基本的には既存のシステムと同様にあらかじめ作成された動作データを実現しつつ、衝突や外力などの環境からの力学的な変化が加えられた場合には、それらの力学的な変化に応じた自然な動作を生成できる。
【０００５】
【発明が解決しようとする課題】
ところが、この動作制御手法を上記キャラクタの動作にそのまま単純に使用しただけでは、次のような２つの問題が生じる。
【０００６】
（１）非常に大きな衝撃・外力がキャラクタに与えられたときに自然な動作を生成できない。
上記の動作制御手法では、あくまで入力された動作データを目標動作として追従しながら、自然な動作を実現するように制御を行う。したがって、入力された動作データを実現することが困難になるほどの非常に大きな衝撃等が加えられた場合には、不自然な動作が生成されてしまう。例えば、本手法では、衝撃等によってキャラクタがバランスを崩した場合、そのバランスの大きさに応じて、腕を振ったり腰を動かしたりすることによってバランスを保つような制御を行う。そのため、非常に大きな衝撃等が加わると、それらを強引に打ち消そうとして腕を激しく振り回すといった制御が行われてしまう。実際の人間の動作では、このような場合には、無理に目標動作を実現しようとするのではなく、例えばバランスを保つように足の位置を移動するなどして一旦姿勢を安定させてから、改めて目標動作を開始するといった柔軟な制御が行われる。しかしながら、本手法の角加速度空間での制御だけでは、このような動作を実現することは困難である。
【０００７】
（２）衝撃・外力によって動作が変化したときにうまく次の動作に移ることができない。
本動作制御手法では、一つの動作データをもとに制御を行う。しかし、実際のアプリケーションでは、複数の動作を連続して実現できることが必要となる。現在のコンピュータゲームなどの一般的なアプリケーションでは、キャラクタの連続的な動作を生成するため、あらかじめ多くの短い動作データを用意しておき、状況に応じて適切な動作データを順番に再生することによって一連の動作を実現するというアプローチがとられている。この場合、それぞれの動作データは、基本的には前後の動作同士の間がうまくつながるようにあらかじめ作成されている。例えば、動作Ａの終了時の姿勢と動作Ｂの開始時の姿勢を同一にしておくことで、動作Ａの直後に動作Ｂを実行する場合に、これら二つの動作間を滑らかにつなげることができる。従来のアプリケーションでは、基本的にはあらかじめ作成された動作データを再生するだけであったため、動作データ間の接続には問題は生じなかった。しかし、本動作制御手法を用いてキャラクタを動作させる場合、必ずしも元の動作データがそのまま実行されるとは限らない。そのため、動作制御の結果、衝突や外力などの影響で前の動作の終了姿勢が変化してしまった場合、そのままでは次の動作にうまくつなげることができないという問題が生じる。
【０００８】
そこで、本発明においては、非常に大きな衝撃や外力等がキャラクタに与えられた場合であっても、そのキャラクタの自然な動作をリアルタイムに生成可能なシミュレーション方法、シミュレーション装置およびシミュレーションプログラムを提供する。
【０００９】
【課題を解決するための手段】
本発明のシミュレーション方法は、動作開始時のキャラクタの基準となる部分および全関節の状態を表すデータと複数の動作データとを滑らかに接続して連続した一つの動作データを生成する動作合成ステップと、この動作合成ステップにおいて生成された動作データを目標動作として自然な動作を実現するようにキャラクタの基準となる部分の並進、回転加速度および各関節の回転加速度を算出する動作制御ステップと、キャラクタの基準となる部分および全関節の現在状態を表すデータと動作制御ステップにおいて算出されたキャラクタの基準となる部分の並進、回転加速度および各関節の回転加速度とから、動作合成ステップにおいて生成された動作データを目標動作として動作制御ステップにより自然な動作を実現できるか否かを判定する動作判定ステップと、動作判定ステップにおける判定の結果、動作合成ステップにおいて生成された動作データを目標動作とした自然な動作を実現できない場合に、この動作データに代わる適切なリアクション動作の動作データを生成するリアクション動作生成ステップと、キャラクタの基準となる部分および全関節の現在状態を表すデータと動作制御ステップにおいて算出されたキャラクタの基準となる部分の並進、回転加速度および各関節の回転加速度とに基づいて、キャラクタの基準となる部分および全関節の動作状態を表すデータを算出する動作演算ステップとを含むものである。
【００１０】
本発明によれば、動作開始時のキャラクタの基準となる部分および全関節の状態を表すデータと複数の動作データとから生成した動作データを目標動作としてキャラクタを動作させるに際して、非常に大きな衝撃や外力等がキャラクタに与えられた結果、この動作データを目標動作として動作制御手法を適用しただけでは自然な動作を実現できない場合に、この動作データに代わる適切なリアクション動作の動作データを生成し、このリアクション動作の動作データを目標動作とすることで、そのキャラクタの自然な動作をリアルタイムに生成することが可能となる。
【００１１】
上記本発明のシミュレーション方法は、動作開始時のキャラクタの基準となる部分および全関節の状態を表すデータと複数の動作データとを滑らかに接続して連続した一つの動作データを生成する動作合成手段と、この動作合成手段により生成された動作データを目標動作として自然な動作を実現するようにキャラクタの基準となる部分の並進、回転加速度および各関節の回転加速度を算出する動作制御手段と、キャラクタの基準となる部分および全関節の現在状態を表すデータと動作制御手段により算出されたキャラクタの基準となる部分の並進、回転加速度および各関節の回転加速度とから、動作合成手段により生成された動作データを目標動作として動作制御手段により自然な動作を実現できるか否かを判定する動作判定手段と、動作判定手段による判定の結果、動作合成手段により生成された動作データを目標動作とした自然な動作を実現できない場合に、この動作データに代わる適切なリアクション動作の動作データを生成するリアクション動作生成手段と、キャラクタの基準となる部分および全関節の現在状態を表すデータと動作制御手段により算出されたキャラクタの基準となる部分の並進、回転加速度および各関節の回転加速度とに基づいて、キャラクタの基準となる部分および全関節の動作状態を表すデータを算出する動作演算手段とを備えたシミュレーション装置により実施できる。
【００１２】
また、このシミュレーション装置は、動作開始時のキャラクタの基準となる部分および全関節の状態を表すデータと複数の動作データとを滑らかに接続して連続した一つの動作データを生成する動作合成手段と、この動作合成手段により生成された動作データを目標動作として自然な動作を実現するようにキャラクタの基準となる部分の並進、回転加速度および各関節の回転加速度を算出する動作制御手段と、キャラクタの基準となる部分および全関節の現在状態を表すデータと動作制御手段により算出されたキャラクタの基準となる部分の並進、回転加速度および各関節の回転加速度とから、動作合成手段により生成された動作データを目標動作として動作制御手段により自然な動作を実現できるか否かを判定する動作判定手段と、動作判定手段による判定の結果、動作合成手段により生成された動作データを目標動作とした自然な動作を実現できない場合に、この動作データに代わる適切なリアクション動作の動作データを生成するリアクション動作生成手段と、キャラクタの基準となる部分および全関節の現在状態を表すデータと動作制御手段により算出されたキャラクタの基準となる部分の並進、回転加速度および各関節の回転加速度とに基づいて、キャラクタの基準となる部分および全関節の動作状態を表すデータを算出する動作演算手段としてコンピュータを機能させるシミュレーションプログラムを実行することにより実現可能である。
【００１３】
【発明の実施の形態】
図１は本発明の実施の形態におけるシミュレーション装置の構成を示すブロック図である。
図１において、本実施形態におけるシミュレーション装置は、あらかじめ作成したキャラクタの複数の動作状態を表す動作データを記録した動作データベース（以下「動作ＤＢ」と称す）１１と、動作開始時のキャラクタの状態を表すデータとキャラクタが順番に実行する複数の動作データとを滑らかに接続して連続した一つの動作データを生成する動作合成手段１２と、動作合成手段１２により生成された動作データに基づいてキャラクタの基準となる部分の並進、回転加速度および各関節の角加速度を算出する動作制御手段１３と、動作合成手段１２によって生成された動作データを目標動作として動作制御手段１３により自然な動作を実現できるか判定する動作判定手段１４と、動作データに代わる適切なリアクション動作のデータを生成するリアクション動作生成手段１５と、動作制御手段１３により算出されたキャラクタの基準となる部分の並進、回転加速度および各関節の角加速度に基づいてキャラクタの動作状態を表すデータを算出する動作演算手段１６と、動作演算手段１６により算出されたデータに基づいてキャラクタを描画する描画手段１７とを備える。
【００１４】
ここで、キャラクタの状態を表すデータとは、キャラクタの基準となる部分、本実施形態においては腰の部分（以下「ルート」と称す）の位置ｐ（３自由度）および向きｑ（３自由度）と、そのキャラクタの全関節の関節角度θである。ここで、θはｎ次元のベクトルであり、各要素θｉ（ｉ＝１，…，ｎ）は各関節の関節角度を表す。ｎはキャラクタを多関節体として表現した時の全関節数である。一般的に、人間を多関節体としてモデル化する場合には、最低４０個程度の関節が必要になる。
【００１５】
動作合成手段１２は、動作開始時のキャラクタの状態を表すデータ（ルートの位置・向きおよび全関節の状態のデータ）と、キャラクタが順番に実行する複数の動作データ（動作ＤＢ１１に登録された動作データまたは後述するリアクション動作生成手段１５により生成されたリアクション動作の動作データ）と、それぞれの動作を開始するときの接続方法（「合成モード」または「連結モード」のいずれか）とを入力として受け取り、これらの動作データを滑らかに接続して連続した一つの動作データを生成する。
【００１６】
ここで、動作データとは、キャラクタの全関節の関節角度の時間関数θｉ（ｔ）、ルートの位置および向きの時間関数ｐ（ｔ），ｑ（ｔ）、両手両足のそれぞれの拘束条件（角度拘束、末端の位置・向き拘束、支点拘束の３種類の拘束条件うち一つを取る）の時間変化ｃｌ（ｔ）（ｌ＝｛右足、左足、右手、左手｝）、およびメタ情報（動作全体の時間、開始範囲の時間、終了範囲の時間、キー時刻の配列等）である。
【００１７】
動作制御手段１３は、動作合成手段１２により生成された動作データを目標動作として自然な動作を実現するようにキャラクタのルートの並進、回転加速度および各関節の角加速度を算出する。動作判定手段１４は、この動作制御手段１３により算出されたキャラクタのルートの並進、回転加速度および各関節の角加速度と、キャラクタのルートおよび全関節の現在の状態を表すデータとから、動作合成手段１２により生成された動作データを目標動作とした自然な動作を実現できるか否か、すなわち動作制御手段１３で対応できないほど大きくバランスを崩したり、大きな関節負荷がかかったりしていないかどうかを判定する。動作制御手段１３により算出されたキャラクタのルートの並進、回転加速度および各関節の角加速度は、動作演算手段１６にも入力される。
【００１８】
リアクション動作生成手段１５は、動作判定手段１４による判定の結果、動作合成手段１２により生成された動作データを目標動作とした自然な動作を実現できない場合に、この動作データに代わる適切なリアクション動作の動作データを動的に生成する。リアクション動作生成手段１５により生成されたリアクション動作の動作データは、動作合成手段１２へ入力される。
【００１９】
動作演算手段１６は、キャラクタのルートおよび全関節の現在状態を表すデータと動作制御手段１３において算出されたキャラクタのルートの並進、回転加速度および各関節の角加速度とに基づいて、キャラクタのルートおよび全関節の動作状態を表すデータを算出する。同時に、動作演算手段１６は、キャラクタ同士の衝突、外力などを算出する。動作演算手段１６により算出したデータは、動作合成手段１２へと入力され、次の動作データの演算に用いられるとともに、描画手段１７へと入力される。
【００２０】
描画手段１７は、キャラクタが登場するシーンを描画し、このシーン中に、動作演算手段１６により算出されたデータに基づいてキャラクタを連続的に描画する。
【００２１】
次に、動作制御手段１３における処理の詳細について説明する。
動作制御手段１３は、前述のように、キャラクタの各関節の角加速度を算出する。すなわち、角加速度空間で動作制御を行う。
【００２２】
一般に、コンピュータゲームなどのアニメーションでは、人間のような多関節体の姿勢や動きを表現する方法として、関節角度による姿勢表現が用いられる。例えば、キャラクタがｎ個の関節を持つとすると、そのキャラクタのある時点での姿勢ｘは、ルートの位置と向きｐ，ｑと全関節の関節角度θの組み合わせによって次式で表すことができる。
ｘ＝｛ｐ，ｑ，θ｝　ｐ∈Ｒ３，ｑ∈Ｒ３，θ∈Ｒｎ　…式（１）
ここで、関節角度θはｎ次元のベクトルで、θｉはｉ番目の関節の関節角度を表す。同様に、キャラクタの動作データは、姿勢の時間変化ｘ（ｔ）によって表すことができる。
【００２３】
キャラクタの骨格モデルの例を図２に示す。なお、本実施形態においては、複数の自由度を持つ関節は、内部的に複数の１自由度の回転関節によって表現する（例えば、肩は３自由度（３ＤＯＦ）を持つので、内部的には３つの関節としてモデル化する）。したがって、各関節の回転加速度については、それぞれ１自由度の回転関節の軸を中心とした角加速度によって制御する。
【００２４】
ここで、関節角度・関節角速度・関節角加速度・関節トルクの関係を図３に示す。一般に、人間やロボットが運動を行うときには、まず、筋力やモータの働きによって、関節トルク（関節を回転させようとする力）を発生させる。この関節トルクによって関節角加速度が生じ、関節角加速度の積分によって関節速度・関節角度が変化する、という流れとなる。
【００２５】
一般に、コンピュータ・アニメーションにおいて、単純に動作データを記録・編集・再生するだけの場合には、関節角度空間でのみ動作データは扱われる。このような場合、関節角加速度や関節トルクなどを考慮する必要はない。しかし、衝突や外力などの力学的な影響を考慮して自然な動作を生成しようとすると、関節角加速度や関節トルクを考慮する必要がある。
【００２６】
なお、本手法では、手足の拘束条件を考慮した動作制御を行うため、式（１）の情報に加えて、動作データに手足の拘束条件の情報を持たせている。
ｘ’＝｛ｐ，ｑ，θ，ｃ｝　ｐ∈Ｒ３，ｑ∈Ｒ３，θ∈Ｒｎ，ｃ∈Ｄ４　…式（２）
【００２７】
ここで、ｃはその状態における手足の拘束条件を示す。ｃは、右足・左足・右手・左手のそれぞれについて、｛角度拘束、末端位置・向き拘束、支点拘束｝のうちのいずれかの値を取る。手足の拘束条件として角度拘束が設定されている場合は、動作データの関節角度データに従って制御を行う。手足の拘束条件として位置・向き拘束が設定されている場合は、関節角度よりも手先や足先の位置・向きを優先して制御を行う。手先や足先の位置・向きの時間変化は、もとの動作データから計算される。位置・向き拘束は、例えば落ちている物体を拾い上げる動作など、手足の姿勢よりも手先や足先の位置・向きの方が重要な場合に指定される。また、支点拘束は、位置・向き拘束の特殊な場合で、手足が支点として地面に接触して荷重がかかっている状態を表す。支点拘束が設定されている場合には、手先や足先の位置・向きを固定して動かさないように制御を行う。
【００２８】
本手法では、関節角加速度を２段階の手順によって計算する。
まず、追従制御によって、目標動作に追従するための初期角加速度を計算する。追従制御では、それぞれの関節は独立に制御され、力学的な影響や関節相互の影響は全く考慮しない。単純に目標動作の軌道に滑らかに収束するような関節角加速度を計算する。
【００２９】
次に、ダイナミック制御によって、追従制御で計算した初期角加速度を元に、動作が自然になるように出力角加速度を修正する。具体的には、初期角加速度により動作を行ったときに、キャラクタが全身のバランスを崩したり、ある関節に筋力の範囲を超えた大きな負荷がかかったりしてしまう場合に、それらの影響に応じて角加速度を制御する。これらの問題が発生しない場合には、初期角加速度がそのまま出力角加速度として用いられる。つまり、基本的には目標動作を単純に追従するような動作が行われ、バランスを崩したり大きな関節負荷が加わったりした場合のみ、それらに応じた動作が生成される。
【００３０】
これを数式で表すと、出力角加速度θ’’ｏｕｔｐｕｔは次の式によって計算される。ここで、θ’’ｉｎｉｔは追従制御による初期角加速度、Δθ’’ｄｙｎａｍｉｃはダイナミック制御による修正角加速度である。
θ’’ｏｕｔｐｕｔ＝θ’’ｉｎｉｔ＋Δθ’’ｄｙｎａｍｉｃ　…式（３）
【００３１】
（１）追従制御
〔関節角加速度の制御〕
追従制御では、それぞれの関節を独立に制御する。関節の目標軌道をｐ（ｔ）、現在の関節角度・角速度をθ，θ’としたとき、目標軌道に追従するような初期角加速度θ’’ｉｎｉｔを計算する。追従制御では、目標軌道に近い場合と遠い場合とで２種類の計算方法を用いる。
【００３２】
まず、現在の状態が目標軌道に近い場合（普通に動作を実行している状態）は、単純に目標軌道から得られる目標関節角度・角速度を実現するように出力角加速度を計算する。目標軌道における時刻２ｄｔ後（ｄｔはシミュレーションの刻み幅）の関節角度・角速度をθｇ，θ’ｇとすると、θｇ，θ’ｇを満たすための角加速度は次式によって計算される。
θ’’ｉｎｉｔ＝１／ｄｔ２・（θｇ−θ）−１／ｄｔ・（０．５θ’ｇ−１．５θ’）…式（４）
【００３３】
一方、現在の状態が目標軌道から遠い場合（衝突による速度変化などで一時的に目標軌道に追従できていない状態）は、上の方法で出力角加速度を求めると非常に大きな角加速度が計算され、関節に異常に大きな負荷がかかってしまう。そこで、目標軌道に滑らかに収束するような、適当な関節角加速度を計算する。考え方としては、現在状態から目標軌道の次の極大・極小点に収束する滑らかな軌道を仮定し（図４参照）、この軌道から出力角加速度を計算する。
【００３４】
ここでは、目標動作に収束するための軌道として、２次のＦｅｒｇｕｓｏｎ関数を用いる。Ｆｅｒｇｕｓｏｎ関数は、２点の位置・速度から求められ、両者の間で２次で連続となるような（角加速度が線形で変化するような）関数である。現在の関節角度・角速度を（θ，θ’）、目標軌道の次の極での関節角度・角速度を（θｔ，θ’ｔ）、２点間の時間をＴ、現在時刻をｃｕｒｒｅｎｔ＿ｔｉｍｅとすると、Ｆｅｒｇｕｓｏｎ曲線ｑ（ｓ）は次式で表される。
ｑ（ｓ）＝（２ｓ３−３ｓ２＋１）θ＋（−２ｓ３＋３ｓ２）θｔ＋（ｓ３−２ｓ２＋ｓ）θ’＋（ｓ３−２ｓ２＋ｓ）θ’ｔ　…式（５）
ｓ＝（ｔ−ｃｕｒｒｅｎｔ＿ｔｉｍｅ）／Ｔ　…式（６）
【００３５】
ここで、上式を２階微分して、ｔ＝ｃｕｒｒｅｎｔ＿ｔｉｍｅを代入することで、初期角加速度θ’’ｉｎｉｔが計算される。
θ’’ｉｎｉｔ＝｛６θｔ−６θ−２θ’ｔ−４θ’｝／Ｔ２　…式（７）
追従制御では、まず式（４）によって初期角加速度を計算し、その大きさがあらかじめ決められた一定の範囲を超えた場合には、式（７）を用いて初期角加速度を計算する。
【００３６】
〔ルートの並進・回転加速度の制御〕
ルートの位置（並進加速度）ｐ’’ｒｏｏｔについても同様に、ｘｙｚ軸それぞれについて独立に初期加速度を計算する。ルートの向き（回転加速度）ｑ’’ｒｏｏｔについては、常に式（４）により初期角加速度を計算する。
【００３７】
〔拘束条件のある手足の関節角加速度の制御〕
それぞれの手足（右手、左手、右足、左足）についても、目標動作で位置拘束・支点拘束が設定されている場合は、手足の末端部分（手首・足首）の並進・回転角加速度ｐ’’ｅｎｄ，ｑ’’ｅｎｄを計算する。
【００３８】
目標動作の動作データに設定されている各手足の拘束条件に応じて、手足の関節角加速度の計算方法は異なる。ある手足に角度拘束が設定されている場合は、その手足の関節は自由に制御可能であるため、上記の計算方法によりそれぞれの関節の角加速度を独立に計算する。一方、末端の位置・向き拘束やその特殊なケースである支点拘束のある手足の関節については、それぞれの関節を独立に制御するのではなく、全体で統一して制御する必要がある。例えば、キャラクタが両足で立っている場合（両足に支点拘束が設定されている場合）には、両足が地面から離れないように両足の全ての関節を協調して制御しなければならない。そこで、これらの関節はルート（腰）と手足の末端部の並進・回転角加速度から、逆運動学計算と呼ばれる手法を用いて計算する。
【００３９】
逆運動学計算は、アニメーションツールなどで一般的に用いられている技術であり、手足の末端の位置・向きから関節角度を計算する手法である。ここでは、逆運動学計算を角加速度空間に応用した計算方法を用いる。運動学計算手法による関節角加速度の計算は次式で表される。
ｐ’’ｒｏｏｔ，ｑ’’ｒｏｏｔ，ｐ’’ｅｎｄ，ｑ’’ｅｎｄ→θ’’０．．．ｋ　…式（８）
ｐ’’ｒｏｏｔ，ｑ’’ｒｏｏｔはルートの並進・回転加速度、ｐ’’ｅｎｄ，ｑ’’ｅｎｄはその手足の末端の並進回転加速度、θ’’０．．．ｋはその手足の全関節の角加速度を表している。逆運動学計算の方法としては、一般に、数値的な解法と解析的な解法の２種類の方法が存在する。本実施形態では、それぞれの手足の関節数を７個に固定することでより高速に関節角加速度を計算できる、解析的な逆運動学計算の手法を用いている。
【００４０】
（２）ダイナミック制御
ダイナミック制御は、受動制御・拘束条件のある手足の制御・能動制御・動作速度の制御の複数のステップに分けられる。以下、まずダイナミック制御の基準となる関節負荷とバランスの評価基準について説明し、次にそれぞれの制御ステップについて順番に説明していく。
【００４１】
〔バランス制御と負荷減少制御〕
ダイナミック制御では、制御を行う基準として関節負荷と全身のバランスの２つの要素を考慮する。つまり、追従制御で計算された初期角加速度のままでは関節負荷が大きすぎたり、バランスを崩したりするような場合に、それらを減少するように角加速度を修正する。以下に両者の評価基準について説明する。
【００４２】
関節負荷を行う基準としてキャラクタの筋力モデルを考慮する。ある角加速度θ’’を実現するために必要な関節トルクτ∈Ｒｎは、逆動力学計算と呼ばれる手法により計算することができる。
τ＝Ｈ（θ）θ’’＋Ｃ（θ，θ’）＋Ｆ（θ）＋Ｇ（θ）　…式（９）
θ，θ’は現在の関節角度・角速度、Ｈ（θ）は関節角加速度と関節トルクの間の関係を表す慣性モーメント行列、Ｃ（θ，θ’），Ｆ（θ），Ｇ（θ）はそれぞれコリオリ力・外力・重力による関節トルクへの影響を表すベクトルである。
【００４３】
ここで、筋力モデルとして、それぞれのキャラクタごとに各関節で出力可能なトルクの有効範囲を定めておく。
τｉｍｉｎ＜τｉ＜τｉｍａｘ　…式（１０）
τｉｍｉｎ，τｉｍａｘは筋力モデルにより決まる、関節ｉにおいて出力可能な関節トルクの最小値・最大値である。負荷減少制御では、出力トルクτｉが有効範囲内におさまるように角加速度を制御する。現在、筋力モデルとしては、比較的単純なモデルとして、モーションキャプチャデータから得られたデータをもとにそれぞれの関節のトルクの最小値・最大値をその関節の角度・角速度の２次関数によって表現したものを使用している。
τｉｍｉｎ＝ｆｉｍｉｎ（θｉ，θ’ｉ），　τｉｍａｘ＝ｆｉｍａｘ（θｉ，θ’ｉ）　…式（１１）
【００４４】
次にバランス制御について述べる。バランス制御のための基準として、ロボット工学などで用いられる零モーメント点と呼ばれる概念を使用する。零モーメント点とは、体の全身から地面に対して加わるモーメントが０となる点のことである。図５は零モーメント点を示す図であって、（ａ）はバランスが保たれている状態を示す図、（ｂ）はバランスが保たれていない状態を示す図である。
【００４５】
図５（ａ）に示すように零モーメント点（ＺＭＰ）が、支点面の内部に存在するときには、キャラクタはバランスが取れている。支点面とは、キャラクタと地面の接触面全体を含む最小の凸包面である。一方、図５（ｂ）に示すように零モーメント点が支点面の外部にある場合は、キャラクタのバランスがとれておらず、支点面の内部で零モーメント点に最も近い点（最小モーメント点ＭＭＰ）を中心としてキャラクタが転倒してしまう。このような場合、零モーメント点が支点面の内部に移動するように関節角加速度を制御する。零モーメント点の位置は、全関節の角加速度から計算できる。実際には、全関節の角加速度θ’’∈Ｒｎから、順運動学計算という方法で全体節の並進加速度ｓ’’∈Ｒ３＊ｍ（ｍは全体節の数）を計算し、零モーメント点の位置を計算する。
【００４６】
ここで、ｓ’’ｉ＝｛ｓ’’ｉｘ，ｓ’’ｉｙ，ｓ’’ｉｚ｝を体節ｉの並進加速度とし、地面が水平（ｙ＝０）であると仮定すると、零モーメント点の位置は次式によって計算される。
ＺＭＰｘ＝｛Σｍｉｓｉｘ（ｓ’’ｉｙ−ｇ）−Σｍｉｓｉｙｓ’’ｉｘ｝／｛Σｍｉ（ｓ’’ｉｙ−ｇ）｝，
ＺＭＰｚ＝｛Σｍｉｓｉｚ（ｓ’’ｉｙ−ｇ）−Σｍｉｓｉｙｓ’’ｉｚ｝／｛Σｍｉ（ｓ’’ｉｙ−ｇ）｝　…式（１２）
ｍｉは体節ｉの質量、ｓｉ＝｛ｓｉｘ，ｓｉｙ，ｓｉｚ｝は体節ｉの位置である。
【００４７】
〔受動制御〕
受動制御では、それぞれの関節の関節負荷に応じてその関節の関節角加速度を制御する。例えば、背骨に後ろ向きの負荷が加わっている場合には、背骨の角加速度を、負荷に応じて後ろ向きに加速することでその負荷を減少する。腕や腰の角加速度によって背骨の負荷を減少するといった、他の関節の負荷を考慮した制御は、後述する能動制御で行われる。なお、受動制御では、末端の位置・向き拘束・支点拘束のある手足の関節は制御しない。これらの関節の制御方法については後述する。
【００４８】
受動制御では、２段階の手順で修正角加速度を計算する。一度の手順でそれぞれの関節の角加速度を計算すると、ある関節の初期角加速度が非常に大きい場合に、その影響で全関節の角加速度が必要以上に修正されてしまう。そこで、最初のステップとして、非常に大きな関節角加速度のみを減少する。そして、次のステップで、他の関節からの影響も考慮して、それぞれの関節の角加速度を制御する。
【００４９】
第１ステップでは、それぞれの関節ごとに他の関節からの影響を無視したとき、関節の有効トルク範囲を超えた関節負荷がかかる場合には、関節負荷が有効トルク範囲におさまるように角加速度を修正する。
▲１▼θ’’＝θ’’ｉｎｉｔとする。θ’’ｉｎｉｔは追従制御によって計算された初期角加速度である。
▲２▼それぞれの関節ｉごとに以下の処理を繰り返す。
▲３▼他の関節の角加速度による影響を無視したときの関節ｉの関節トルクを計算する。
τｉ＝Ｈｉｉθ’’ｉ＋Ｃｉ＋Ｆｉ＋Ｇｉ　…式（１３）
▲４▼関節トルクτｉが筋力の範囲を超えていれば、範囲内におさまるように角加速度を修正する。
τｉ＜τｍｉｎのとき、
θ’’ｉ＝θ’’ｉ−（τｉ−τｍｉｎ）／Ｈｉｉ　…式（１４）
τｉ＞τｍｉｎのとき、
θ’’ｉ＝θ’’ｉ−（τｉ−τｍａｘ）／Ｈｉｉ　…式（１５）
【００５０】
第２ステップでは、他の関節からの影響も考慮して、関節負荷が有効トルク範囲におさまるように角加速度を制御する。第２ステップでは、以下の手順で制御を行う。
▲１▼他の関節からの影響も考慮して関節トルクを計算する。
τｉ＝Σｊ＝１ｎＨｉｊθ’’ｊ＋Ｃｉ＋Ｆｉ＋Ｇｉ　…式（１６）
▲２▼有効範囲からの関節トルクの超過量が最も大きい関節ｉから順番に処理する。
▲３▼第１ステップの手順▲４▼と同様に関節ｉの角加速度を修正する。
▲４▼まだ処理していない関節で、関節トルクが有効範囲を超えている他の関節が残っていれば、手順▲１▼に戻り作業を繰り返す。
最終的に、θ’’が受動制御後の出力角加速度となる。なお、この受動制御による角加速度の修正量は、θ’’ｐａｓｓｉｖｅ＝θ’’−θ’’ｉｎｉｔである。
【００５１】
〔拘束条件のある手足の制御〕
〔拘束条件のある手足の関節角加速度の制御〕で述べたように、末端の位置・向き拘束や支点拘束の設定されている手足については、その手足の関節は協調して制御する必要がある。そこで、これらの手足の制御では、基準となる腰の並進加速度のみを制御し、各関節の角加速度は腰の並進・回転加速度と手足の末端の並進・回転加速度から逆運動学計算によって計算する。つまり、これらの手足の関節の角加速度は腰の並進加速度によって間接的に制御され、直接的には制御されない。
【００５２】
腰の並進加速度ｐ’’ｒｏｏｔ∈Ｒ３は、支点拘束のある手足の関節負荷や全身のバランスに応じて制御を行う。しかし、腰の並進加速度の自由度は３であるため、例えば、バランスを崩して、なおかつ複数の関節に大きな負荷がかかっているような場合には、その全てに対応することはできない。そこで、最も大きな条件にのみ注目して腰の並進加速度を制御する。腰の制御だけで全ての制約条件を解決できない場合は、次の能動制御によって対応する。
【００５３】
キャラクタがバランスを崩している場合は、バランス制御を優先的に行う。これは、安定した制御を実現するためには、負荷減少制御に比べてバランス制御の方がより重要なためである。バランスが保たれており、いくつかの関節に有効トルク範囲を超える負荷がかかっている場合には、最大の負荷を受けている関節に対して負荷減少制御を行う。その結果、他のいくつかの関節のトルクを有効範囲内に収めることができなくても無視する。なお、現在の角加速度でバランスも保たれており、どの関節の必要トルクも有効範囲を超えていない場合は、腰の並進加速度は制御せず、追従制御で計算された値をそのまま使用する。
【００５４】
まずは、バランス制御のための腰の並進加速度の修正量Δｐ’’ｒｏｏｔの計算方法について説明する。
▲１▼バランス制御のためにどれだけ零モーメント点を移動させる必要があるかという必要移動量ΔＺＭＰ∈Ｒ２を計算する。まず、現在の角加速度θ’’におけるＺＭＰの位置を計算し、ＺＭＰが支点面の内部にあるかどうかを判定する。ＺＭＰが支点面の内部にあればバランス制御は不要である。ＺＭＰが支点面の外部にあれば、支点面までの最短移動距離ΔＺＭＰ（＝ＺＭＰ−ＭＭＰ）を計算する。
▲２▼Δｐ’’ｒｏｏｔ∈Ｒ３とΔＺＭＰ∈Ｒ２の関係を表すヤコビ行列Ｊ＝∂ＺＭＰ／∂ｐ’’ｒｏｏｔ∈Ｒ２＊３を計算する。∂ＺＭＰ／∂ｐ’’ｒｏｏｔは、腰の並進加速度に応じた上半身全体の重心の移動量から計算できる。
ΔＺＭＰ＝ＪΔｐ’’ｒｏｏｔ　式（１７）
▲３▼ΔＺＭＰを実現するための、Δｐ’’ｒｏｏｔを計算する。ここで、Δｐ’’ｒｏｏｔはΔＺＭＰより自由度が高いため、Δｐ’’ｒｏｏｔの解は無限に存在する。そこで、擬似逆行列という手法を用いて、｜Δｐ’’ｒｏｏｔ｜が最小となるような解Δｐ’’ｒｏｏｔを求める。
Δｐ’’ｒｏｏｔ＝Ｊ＋ΔＺＭＰ，　Ｊ＋＝Ｊ（ＪｔＪ）−１　…式（１８）
ここで、行列Ｊ＋は行列Ｊの擬似逆行列である。
【００５５】
次に、負荷減少制御のための腰の並進加速度の修正量Δｐ’’ｒｏｏｔの計算方法について説明する。
▲１▼末端の位置・向き拘束・支点拘束のある手足に含まれるそれぞれの関節（両足で立っている場合には両足の全ての関節）の負荷を計算し、最も負荷の大きい関節（複合関節）のトルクを有効範囲まで減少するように制御を行う。ここでは、それぞれ単一の関節ではなく、複合関節を対象とする。骨格モデルでは、実際の関節は内部的に複数の関節（最大３つ）に分けられて表現される（図２参照）。例えば、足首の関節は、実際にはｘｙｚを中心とする３つの関節の角度によって表される。負荷減少制御では、それぞれの複合関節（例えば右足首の場合であればτｒ＿ａｎｋｌｅ＝｛τｒ＿ａｎｋｌｅ＿ｘ，τｒ＿ａｎｋｌｅ＿ｙ，τｒ＿ａｎｋｌｅ＿ｚ｝∈Ｒ３のように３次元となる）を対象に制御を行う。対象となる全ての複合関節において、最もトルクの超過量｜Δτｊ｜，Δτｊ∈Ｒ１〜３が大きい関節のトルクを減少するように制御を行う。
【００５６】
▲２▼バランス制御の場合と同様に、Δｐ’’ｒｏｏｔ∈Ｒ３とΔτ∈Ｒ１〜３の関係Ｈ＝∂τ／∂ｐ’’ｒｏｏｔを計算する。Ｈは、逆運動学計算と式（９）の慣性モーメント行列から計算できる。ここで、Δｐ’’ｒｏｏｔの次元数は必ずΔτより大きいか同じであるため、バランス制御の場合と同様に擬似逆行列Ｈ＋を用いてΔｐ’’ｒｏｏｔを計算する。
Δｐ’’ｒｏｏｔ＝Ｈ＋Δτ，　Ｈ＋＝Ｈ（ＨｔＨ）−１　…式（１９）
バランスを大きく崩していたり、関節に大きな負荷がかかったりしている場合には、それに応じてΔｐ’’ｒｏｏｔも大きくなる。しかし、腰の並進加速度があまりに大きくなると不自然になってしまう。そこで、あらかじめ腰の並進加速度の最大値ｐ’’ｒｏｏｔ＿ｍａｘを定めておき、修正後の加速度｜ｐ’’ｒｏｏｔ＋Δｐ’’ｒｏｏｔ｜がｐ’’ｒｏｏｔ＿ｍａｘよりも大きくなった場合は、ｐ’’ｒｏｏｔ＿ｍａｘの範囲におさまるようにスケーリングを行う。
【００５７】
〔能動制御〕
能動制御では、それぞれの関節を単独で制御するのではなく、関節相互の影響を考慮して他の関節や全身の動作を助けるような制御を行う。例えば、腕を振ることによって下肢に加わる負荷を軽減したり、上体を動かすことによって全身のバランスを保ったりといった、能動的な制御を実現する。しかし、人間の全ての関節同士の影響を計算して能動的な制御を行おうとすると膨大な計算量がかかり、また関節同士の間にはそれほど影響のないものもあるので無駄も多い。そこで、本手法では、特に全身の運動に影響に与える重要な関節を選び、体のそれぞれの部位ごとに能動制御を行う。具体的には、図６に示すように、全身を手足、背中、腰の３つの部位に分けてそれぞれ制御する。腰の並進加速度については、前述した方法で制御される。ここでは、残りの手足と背中の制御について述べる。これらの制御方法も、腰の並進加速度の制御方法とほぼ同様である。能動制御では、まず手足、次に背中の順番で制御を行う。
【００５８】
手足の制御では、拘束条件のない自由に動かせる手足のみを使って制御を行う。例えば、両足に支点拘束が指定されて両足で立っているような場合、両足の全関節は〔支点拘束のある手足の制御〕で述べた方法で制御され、両手のみが能動制御に用いられる。
【００５９】
それぞれの手足については、全部の関節を制御するのではなく、全身に対して影響力の多い３つの自由度のみを選んで制御する。図６に示すように、腕の場合は肩のｘ軸方向（前後方向）の回転、肩のｚ軸方向（左右方向）の回転、ひじのｘ軸方向（前後方向）の回転の３自由度を使用する。例えば、肩のｙ軸方向（腕を軸として左右にねじる方向）の回転は、肩の他の軸の回転と比べて全身の関節に与える影響が小さいため、能動的な制御には使用しない。両手両足は協調して制御を行う必要があるため、全手足の制御加速度Δθｌｉｍｂは一度に計算する。Δθｌｉｍｂの次元は、制御可能な手足の数によって変化する。例えば、キャラクタが両足で立っており、両手のみを制御する場合であれば、次元数は３×２＝６、すなわちΔθｌｉｍｂ∈Ｒ６となる。実際の制御加速度Δθｌｉｍｂの計算方法は、〔支点拘束のある手足の制御〕で述べた腰の並進加速度の制御方法とほぼ同じである。▲１▼現在の角加速度θ’’をもとにバランスと関節負荷を計算する。バランスが保たれていない場合は、バランス制御を行う。バランスが保たれていれば、全身で最も負荷の大きい関節（複合関節）に対して負荷減少制御を行う。
Δθ’’ｌｉｍｂ＝Ｊ＋ΔＺＭＰ　もしくは　Δθ’’ｌｉｍｂ＝Ｈ＋Δτ　…式（２０）
▲２▼制御結果を角加速度θ’’に反映する。Ｓｌｉｍｂはθ’’ｌｉｍｂをそれぞれの関節にマップする選択行列である。
θ’’＝θ’’＋　Ｓｌｉｍｂθ’’ｌｉｍｂ　…式（２１）
【００６０】
前述のようにそれぞれの部位の自由度は限定されているため、腰・腕の制御だけでは、必ずしも全身のバランスと全関節の関節負荷の条件を全て満たすように制御できるとは限らない。腕の制御後にまだ制御すべき条件が残っている場合は、次に背中を使って制御を行う。背中では、背骨のｘｙｚ軸方向の３自由度の回転を使って、上半身全体を動かすことによって制御を行う。このとき、Δθｂａｃｋ∈Ｒ３となる。Δθｂａｃｋの計算方法は手足の場合と全く同じである。
Δθ’’ｂａｃｋ＝Ｊ＋ΔＺＭＰ　もしくは　Δθ’’ｂａｃｋ＝Ｈ＋Δτ　…式（２２）
θ’’＝θ’’＋Ｓｂａｃｋθ’’ｂａｃｋ　…式（２３）
【００６１】
〔動作速度の制御〕
関節に加わる負荷が大きい場合は、受動制御によって関節加速度が制限される。例えば、腕に大きな負荷がかかっている場合は、その負荷によって腕を持ち上げるための加速度が小さくなる。このように目標動作を十分に追従できていない場合、目標動作を進める速度を遅らせることによって、目標動作と現在の状態の差が大きくなり過ぎることを防ぐ。例えば、１０秒間の長さを持つ動作データは、普通は１０秒間のシミュレーション内部時間を使用して実行される。しかし、目標動作に追従できていない場合、動作データの再生速度を遅らせることによってなるべく目標動作を実現するように制御を行う。つまり、１０秒間の動作データが１５秒間のシミュレーション内部時間で実行されることがありうる。全体の制御の結果、初期角加速度方向の出力角加速度が実現できない関節が一つでもあれば（θ’’ｉｎｉｔｉ・θ’’ｏｕｔｐｕｔｉ＜０となる関節ｉが一つでもある場合）、次式によって動作速度を計算する。それ以外の場合は、ｓｐｅｅｄ＝１．０とする。
ｓｐｅｅｄ＝（ｔｎｅｘｔ−ｔ）／（ｔｎｅｘｔ−ｔｐｒｅｖ）　…式（２４）
ここで、ｔは現在の時刻、ｔｎｅｘｔ，ｔｐｒｅｖは目標動作の動作データから得られる一つ前のキーフレームと次のキーフレームである。動作においてキーフレームにおける姿勢は特に重要であるため、キーフレームに近づくほど動作速度を遅くして目標動作になるべく追従できるようにする。
【００６２】
〔全体の制御手順〕
全体の制御手順は次のようになる。関節負荷については、能動制御により関節負荷を軽減するような制御を行い、それでも関節負荷を完全に取り除くことができなかった場合に受動制御を行う。バランス制御については、まず受動制御・拘束手足の制御によるバランス制御を計算し、それでもバランスを制御できなかった場合に、能動制御によりバランス制御を行う。これは、バランス制御については、腕や背中の動きよりも、腰の動きが特に重要になるためである。
▲１▼追従制御による初期角加速度θ’’ｉｎｉｔを計算する。
▲２▼初期角加速度θ’’ｉｎｉｔをもとに受動制御・拘束手足の制御によるバランス制御を仮に計算する。次式で、Ｊは逆運動学計算により求まる腰の並進加速度の変化に応じた全身の角加速度の変化を表す行列である。θ’’＝θ’’ｉｎｉｔ＋θ’’ｐａｓｓｉｖｅ＋Ｊθ’’ｒｏｏｔ
▲３▼能動制御を計算する（バランス制御はθ’’を基準、負荷減少制御はθ’’ｉｎｉｔを基準）。θ’’＝θ’’ｉｎｉｔ＋Ｓｌｉｍｂθ’’ｌｉｍｂ＋Ｓｂａｃｋθ’’ｂａｃｋ
▲４▼初期角加速度に能動制御の影響を加えて、受動制御・拘束手足の制御を計算する。θ’’ｏｕｔｐｕｔ＝θ’’＋θ’’ｐａｓｓｉｖｅ＋Ｊθ’’ｒｏｏｔ
▲５▼動作速度ｓｐｅｅｄを計算する。
【００６３】
以上のように、動作制御手段１３は、角加速度空間で制御を行うというアプローチによって、これまでの手法のようにロボット制御の手法をそのまま応用してキャラクタの関節をトルク空間で制御する場合に生じていたさまざまな問題を解決する。その結果、基本的には目標動作をほぼ正確に実現しつつ、必要に応じてバランスや関節負荷に応じた制御を実現できる。なお、本実施形態においては、全身のバランスを保ちつつ、関節にかかる大きな負荷を減らすような動作制御を行っているが、必ずしもこれだけに限る必要はない。
【００６４】
次に、動作合成手段１２における処理の詳細について説明する。
動作合成手段１２は、前述のように、複数の動作データを滑らかに接続し、全体として一つ動作データとして出力する機能を有する。特に、単純な動作補間手法を用いたときに発生してしまう、荷重が掛かっているはずの足が不自然に地面の上をすべるような現象を、動作合成手段１２では回避することが可能である。
【００６５】
複数の動作データを合成して新しい動作データを生成するための手法はこれまでに多く提案されている。しかし、従来のシステムでは基本的に動作データはそのまま再生されるだけであったため、衝突や外力によってキャラクタの姿勢が動作データから外れるといったことは想定されていない。そのため、既存の手法の多くは、基本的に動作データ同士はあらかじめうまくつながるように作成されていると仮定されており、動作間で足の位置が異なるというような状況は考慮していないものが多い。これら既存の手法は、例えば上半身の動作と下半身の動作を組み合わせたり、早く走る動作とゆっくり走る動作を混合して中間の速度で走る動作を生成したりといった、動作のバリエーションを増やすことを目的としたものである。既存の手法の中にも、いくつか支点となる足の問題について扱ったものがある。例えば、１９９５年のＲｏｓｅらの論文（Ｉｎ　Ｐｒｏｃｅｅｄｉｎｇｓ　ｏｆ　ＳＩＧＧＲＡＰＨ９５，　ＡＣＭ　Ｐｒｅｓｓ　／　ＡＣＭ　ＳＩＧＧＲＡＰＨ，　Ｃｏｍｐｕｔｅｒ　Ｇｒａｐｈｉｃｓ　Ｐｒｏｃｅｅｄｉｎｇｓ，　Ａｎｎｕａｌ　Ｃｏｎｆｅｒｅｎｃｅ　Ｓｅｒｉｅｓ，　ＡＣＭ，　１４７−１５４）では、二つの動作の間を補間するときに、軸足を固定するような方法が提案されている。しかし、この手法では、軸足以外の足の位置は単純に補間していたため、両足で立っているときには、やはり片方の足が地面の上をすべるような動作が生成される。このように、両足で立っているような場合であっても、支点となるべき足が不自然にすべるのを防げるような動作合成手法は存在していない。
【００６６】
動作合成手段１２は、上記目的を満たす動作接続手法として、「合成モード」と「連結モード」の２種類の方法を用いる。図７は動作接続手法の説明図であって、（ａ）は合成モードを示す図、（ｂ）は連結モードを示す図である。本実施形態におけるシミュレーション装置では、動作合成手段１２に動作データを入力するときにどちらかの方法を指定することで、状況に応じて適切な接続手法を使い分けることができるようになっている。なお、本実施形態においては、「合成モード」と「連結モード」の２種類の方法を用いるが、必ずしもこれだけに限る必要はない。
【００６７】
ただし、これらの接続方法を用いてもあらゆる種類の動作同士を接続できるというわけではない。例えば、寝ている状態で終わる動作の後に、立った状態で始まる動作を実行しようとすると、二つの動作の間には立ち上がる動作を行う必要がある。このような高度な動作プランニングを含む処理は本手法の適用範囲を超えている。あくまで、元々はうまくつながるように作成されている動作が、外部からの影響によって変化してしまった場合に、うまくそれらをつなぐことが本手法の目的である。
【００６８】
本手法では、二つの動作状態のデータを接続する実際の処理に加えて、二つの動作同士がそもそも接続可能であるかどうか判定する。実際に動作接続を提供する前に、あらかじめ接続可能かどうかを判定することで、別の接続方法や別の動作を選択することができる。
【００６９】
本手法では、特に実際のアプリケーションで多く必要になる、キャラクタが地面の上に立っている状態（特に両足で立っている）で始まる・終わる動作を主に対象としている。しかし、本手法のアルゴリズムは、基本的には座っている状態や寝ている状態にも適用可能なものとなっている。
【００７０】
（１）「合成モード」による接続
「合成モード」では、前の動作の終わりの部分と次の動作の始まりの部分を滑らかに混合することで、二つの動作間を接続する（図８参照）。二つの動作の間で足の位置が異なる場合には、次の動作が始まってからも前の動作の終了時の位置を保存し、次に足を動かすときに滑らかに次の動作と混合する。本接続方法は、二つの動作の姿勢の差が小さい場合や、二つの動作を高速に接続したい場合に適している。なお、本接続方法は、接続前と接続後でルート、両手、両足の制約条件が全て同じ場合（例えば、前の動作で両足が地面に着いている場合には、次の動作の開始時にも必ず両足が着いている必要がある）にのみに適用可能とする。
【００７１】
〔通常の関節の関節角度の計算〕
まず、現在の時刻ｔと、二つの動作Ａ・動作Ｂの開始（予定）時刻ｔｉｎｉｔＡ，ｔｉｎｉｔＢから、それぞれの動作データ内部でのローカル時刻ｔＡ，ｔＢを計算する。
ｔＡ＝ｔ−ｔｉｎｉｔＡ，　ｔＢ＝ｔ−ｔｉｎｉｔＢ　…式（２５）
【００７２】
次に、時刻ｔにおけるそれぞれの動作のウェイトを計算する。
ｗＡ（ｔＡ）＝（ｔＡ−ＴｔｏｔａｌＡ＋ＴｔｅｒｍＡ）／ＴｔｅｒｍＡ，　（ｔＡ＞ＴｔｏｔａｌＡ−ＴｔｅｒｍＡのとき）　…式（２６）
ｗＢ（ｔＢ）＝ｔＢ／ＴｉｎｉｔＢ，　（ｔＢ＜ＴｉｎｉｔＢのとき）　…式（２７）
ここで、Ｔｔｏｔａｌ、Ｔｉｎｉｔ、Ｔｔｅｒｍ、はそれぞれ動作全体の時間、開始範囲の時間、終了範囲の時間である。これらの時間は動作データのメタ情報として、動作データの作成時に付与されている。
【００７３】
最後に、ウェイトに応じて二つの動作の関節角度の関数を混合する。
θｉ（ｔ）＝｛θｉＡ（ｔＡ）・ｗＡ（ｔＡ）＋θｉＢ（ｔＢ）・ｗＢ（ｔＢ）｝／｛ｗＡ（ｔＡ）＋ｗＢ（ｔＢ）｝　…式（２８）
ルート体節の位置・向きも、同様にウェイトに応じてブレンドする。
ｐｒｏｏｔ（ｔ）＝｛ｐｒｏｏｔＡ（ｔＡ）・ｗＡ（ｔＡ）＋ｐｒｏｏｔＢ（ｔＢ）｝／｛ｗＢ（ｔＢ）／ｗＡ（ｔＡ）＋ｗＢ（ｔＢ）｝　…式（２９）
ｑｒｏｏｔ（ｔ）＝｛ｑｒｏｏｔＡ（ｔＡ）・ｗＡ（ｔＡ）＋ｑｒｏｏｔＢ（ｔＢ）｝／｛ｗＢ（ｔＢ）／ｗＡ（ｔＡ）＋ｗＢ（ｔＢ）｝　…式（３０）
【００７４】
〔位置制約のある手足の関節角度〕
関節角度の場合と同様に、手足の末端の位置・向き関数を混合する。
ｐｌ（ｔ）＝｛ｐｌＡ（ｔＡ）・ｗＡ（ｔＡ）＋ｐｌＢ（ｔＢ）｝／｛ｗＢ（ｔＢ）／ｗＡ（ｔＡ）＋ｗＢ（ｔＢ）｝　…式（３１）
ｑｌ（ｔ）＝｛ｑｌＡ（ｔＡ）・ｗＡ（ｔＡ）＋ｑｌＢ（ｔＢ）｝／｛ｗＢ（ｔＢ）／ｗＡ（ｔＡ）＋ｗＢ（ｔＢ）｝　…式（３２）
ルートの位置・向きと手足の末端の位置・向きから逆運動学計算により手足の全ての関節角度を計算する。
ｐｒｏｏｔ，ｑｒｏｏｔ，ｐｌ，ｑｌ→θ０．．．ｋ　…式（３３）
【００７５】
〔支点制約のある手足の関節角度〕
この演算が本手法の主要部である。支点制約のある手足については、動作Ｂが始まってからも動作Ａの終了時の末端位置・向きをそのまま保つようにする。動作Ｂの途中でその手足を移動させることがあれば、そのときに動作Ｂのもとの末端位置・向きの関数と滑らかに混合する。動作Ａの終了時の末端位置をｐｌＡＴｔｅｒｍＡ、動作Ｂにおいて次に足が離れる時刻をＴｌｅａｖｅＢ、ＴｌｅａｖｅＢ以降に足が地面に着く時刻（または動作Ｂの終了時刻）をＴｔｏｕｃｈＢとする。
ｔＢ＜ＴｌｅａｖｅＢのとき
ｐｌ（ｔ）＝ｐｌＡ（ＴｔｅｒｍＡ）　…式（３４）
ＴｌｅａｖｅＢ＜ｔＢ＜ＴｔｏｕｃｈＢのとき
ｐｌ（ｔ）＝｛（ＴｔｏｕｃｈＢ−ｔＢ）ｐｌＡ（ＴｔｅｒｍＡ）＋（ｔＢ−ＴｌｅａｖｅＢ）ｐｌＢ（ｔＢ）｝／（ＴｔｏｕｃｈＢ−ＴｌｅａｖｅＢ）　…式（３５）
ＴｔｏｕｃｈＢ＜ｔＢのとき
ｐｌ（ｔ）＝ｐｌＢ（ｔＢ）　…式（３６）
【００７６】
〔ルート体節の位置・向きの関数〕
上記の方法に従って支点制約のある足の位置をもとの動作での位置から変化させたとき、ルート体節の位置がもとの動作のままでは最終的に生成される動作が不自然になってしまう場合がある。例えば、片足の位置が大きく動いたにも関らず、腰の位置がもとのままであれば、重心が支点面の外側にはみ出してそのままではキャラクタが転倒してしまうような動作が生成されるようなことがありうる。そこで、両足の位置変化に合わせて各キー時刻におけるルート体節の位置を計算する。
【００７７】
まず、もとの動作データにおけるルート体節の水平位置を両足の位置を基準とした（ｕ，ｖ）座標系に変換する（図９参照）。ここで、基準ベクトルｕは左足から右足へのベクトル、基準ベクトルｖは体の正面方向である。この、（ｕ，ｖ）を足の位置修正後の基準ベクトルｕ＊に合わせて移動後のルート体節の水平位置ｐｔ＊を計算する。
ｐｔ→（ｕｔ，ｖｔ），　ｐｔ＊→ｕｔｕ＊＋ｖｔｖ　…式（３７）
【００７８】
（２）「連結モード」による接続
「連結モード」では、二つの動作の間に両者をつなぐ中間動作を挿入することによって、二つの動作の間をなめらかに接続する。二つの動作の間で足の位置が異なる場合には、中間動作中に足を移動させる。本接続方法は、二つの姿勢の差が大きい場合や、それぞれの動作をなるべく正確に実行したい場合に適している。なお、本接続方法は、以下の条件を全て満たす場合のみ適用可能である。
▲１▼接続前と接続後でルート・右手・左手が地面に着いていない（片足か両足で立っている状態）。
▲２▼少なくとも片方の足が接続前と接続後で共に地面に着いている。
【００７９】
〔中間動作の作成〕
前の動作の終了時の姿勢、次の動作の開始時の姿勢からいくつかのキーフレームを作成して、それらの間を滑らかに補間することで中間動作を生成する。二つの姿勢の間で複数の支点の位置が異なっている場合は、中間動作の途中で、より重心に近い方の支点を基準として、他の支点を移動させる。。また、中間動作が速すぎたり遅すぎたりすると不自然になるため、二つの姿勢の間の差、および二つの動作の速度を基準に中間動作の速度（動作時間）を決定する。
【００８０】
〔中間姿勢の計算〕
図１０に示すように、動作Ａと動作Ｂとの間に四つのキーフレーム（中間姿勢）を作成し、それらの間を滑らかに補間する。
中間姿勢１…前の動作の終了時の姿勢をそのまま使用する。
中間姿勢４…次の動作の開始時の姿勢をそのまま使用する。
【００８１】
中間姿勢２…支点以外の足を移動できるように、重心を支点の上に移動する。中間姿勢１におけるルートの位置ｐ１を地面に投影した点をｐ１＊としたとき、中間姿勢２における支点面の内部で最もｐ１＊に近い点をルート体節の水平位置ｐ２ｈとする。ただし、ｐ１＊が支点面の内部に含まれる場合はｐ２ｈ＝ｐ１＊。ここで、支点面とはキャラクタと地面の接触面全体を含む最小の凸包面をいう。ルート体節の垂直位置ｐ２ｖは、中間姿勢１における高さｐ１ｖをそのまま使用する。
ｐ２＝ｐ２ｈ＋ｐ２ｖ　…式（３８）
【００８２】
中間姿勢３…支点以外の足を持ち上げて、移動先に向けての中間地点に移動する。
移動させる足の位置をｆ、支点となる足の位置をｂとする。このとき、中間姿勢４における両者の距離｜ｆ４−ｂｆ｜と中間姿勢３における両者の距離｜ｆ３−ｂ３｜が同じになる位置まで、足の位置をルート方向に移動する。
ｆ３＝ａ（ｐ２−ｆ２）＋ｆ２，　｜ｆ３−ｂ３｜＝｜ｆ４−ｂ４｜　…式（３９）
式（３９）から係数ａを消去することで、ｆ３が求まる。
【００８３】
〔動作時間の計算〕
二つの動作の間の姿勢の差および動作速度に応じて動作全体の速度を計算する。全ての関節において、中間動作の速度がある基準速度を超えないように中間速度の動作時間を計算する。
【００８４】
まず、それぞれの関節ｉについて、基準となる速度を取得する。
・前の動作の終了時の速度θ’ｉＡ（ＴｔｅｒｍＡ）
・次の動作全体での最大速度θ’ｉ＿ｍａｘ＝ｍａｘ｛θ’ｉＢ（ｔ）｝
・全体での最小速度を表す定数θ’ｍｉｎ（上の二つの値が共に小さいときに中間動作の速度が遅くなり過ぎるのを防ぐため）
【００８５】
それぞれの関節ごとに、中間動作の動作時間がＴｉの時の最大の関節速度θ’ｉ＿ｍａｘを取得し、上記の速度のうち最大の速度より速くならないように動作時間Ｔｉ＊を計算する。
θ’ｉ＿ｍａｘ＊＝ｍａｘ｛θ’ｉＡ（ＴｔｅｒｍＡ），θ’ｉ＿ｍａｘＢ，θ’ｍｉｎ｝　…式（４０）
θ’ｉ＿ｍａｘ＞θ’ｉ＿ｍａｘ＊のときＴｉ＊＝θ’ｉ＿ｍａｘ＊Ｔｉ／θ’ｉ＿ｍａｘ　…式（４１）
最後に、全ての関節において最大の動作時間を中間動作の動作時間として採用する。
Ｔ＊＝ｍａｘ｛Ｔ１＊，…，Ｔｎ＊｝　…式（４２）
【００８６】
次に、リアクション動作生成手段１５における処理の詳細について説明する。リアクション動作生成手段１５は、与えられた動作データに従って、動作制御手段１３によりキャラクタの関節角加速度を制御するとき、そのまま動作データに従って制御を続けると不自然な動作が生成されてしまうような場合に、現在の動作データに代わる適切な動作データ（リアクション）を動的に生成して実行する。なお、リアクション動作生成手段１５によるリアクションの生成が必要かどうかの判定は、動作判定手段１４によって行われる。
【００８７】
本実施形態においては、リアクション動作生成手段１５により生成するリアクションの種類として、次の３種類を用意している。
・バランスを保つために足を踏み出す動作
・バランスを崩して着地する動作
・関節負荷が大きいときに安定した姿勢に戻る動作
以下、順番にこれらの開始条件・動作の生成方法について説明する。
【００８８】
（１）バランスを保つために足を踏み出す動作
〔開始条件〕
キャラクタがバランスを崩したときに実行する。キャラクタがバランスを崩したかどうかの判定は、ルート（腰）の瞬間的な水平方向の速度ｐ’・加速度ｐ’’の大きさによって判定する。この判定は、動作判定手段１４で行われる。
０．５＜｜ｐ’｜＜１．０（ｍ／ｓｅｃ）かつ｜ｐ’’｜＞１０．０（ｍ／ｓｅｃ２）　…式（４３）
これらのパラメータは既存の手法や実際の動作データを参考に設定している。
〔リアクションの生成方法〕
バランスを崩したときに足に加わる荷重が小さい足を、倒れそうな方向に踏み出す。まず、足を踏み出して着地したときの姿勢を計算し、動作接続手法で用いた中間動作の計算方法を利用して現在の姿勢から足を踏み出して着地するまでの動作データを生成する。
足を着地するときの腰の位置は、バランスを崩したときの腰の速度の方向に応じて決定する（図１１参照）。
ｐｒｏｏｔ＿ｔｅｒｍ＝ｋｒｏｏｔｐ’＋ｐｒｏｏｔ＿ｉｎｉｔ　…式（４４）
また、足を着地する位置は、支点となる足の位置と腰の位置によって決定する。
ｐｆｌｙｉｎｇ＿ｔｅｒｍ＝ｋｆｏｏｔ（ｐｒｏｏｔ＿ｔｅｒｍ−ｐｂａｓｅ）＋ｐｒｏｏｔ＿ｔｅｒｍ　…式（４５）
ここで、ｋｒｏｏｔ，ｋｆｏｏｔは実験的に調整されたパラメータである。足を着地したときの足以外の関節の関節角度については、実行中のもとの動作データの終了時の姿勢の関節角度を使用する。
【００８９】
（２）バランスを崩して着地する動作
〔開始条件〕
キャラクタが大きくバランスを崩したときに実行する。（１）と同じく、動作判定手段１４によって、ルート（腰）の水平方向の速度・加速度の大きさに基づいて判定される。
｜ｐ’｜＞１．０（ｍ／ｓｅｃ）かつ｜ｐ’’｜＞１０．０（ｍ／ｓｅｃ２）　…式（４６）
〔リアクションの生成方法〕
足を踏み出す動作とは異なり、大きくバランスを崩して倒れてしまうような場合はそれほど着地位置に変化がないため、腰の水平方向の速度に応じて、あらかじめ作成しておいたいくつかの転倒動作データの中から適切なものを選択して使用する。本実施形態においては、前に倒れる動作と後ろに倒れる動作の２種類を用意している。選択した動作データをリアクションを合成モードで実行することで、動作合成手段１２によって、現在の姿勢からバランスを崩した方向へ滑らかに倒れる動作を実現する。
【００９０】
（３）関節負荷が大きいときに安定した姿勢に戻る動作
〔開始条件〕
動作制御手段１３において、関節にかかる負荷が大きく、そのままでは目標の動作データを追従できない場合に実行する。動作制御手段１３では、キャラクタの筋力モデルを考慮して、関節にかかる負荷が筋力の範囲におさまるように制御を行う。そのため、例えば重い荷物を持っている場合などは、その荷重によって与えられた動作データが実現できない場合がある。動作制御手段１３において、ある関節で一定時間の間、もとの動作軌道に追従するための関節角加速度を出力できなかった場合（追従するための関節角加速度と出力された関節角加速度の符号が異なる場合）を動作判定手段１４が判定し、このリアクションを実行する。〔リアクションの生成方法〕
現在の動作の開始時の姿勢を安定姿勢として、現在の状態から安定姿勢に戻る動作を生成する（二つのキーフレームの間を補間して動作データを作成する）。合成モードでリアクションを実行することで、リアクション動作の開始時に足が地面に着いている場合は、リアクション動作の間もその足は支点として地面に固定される。
【００９１】
上記のように、本実施形態においては、リアクションの種類として、バランスを保つために足を踏み出す動作、バランスを崩して着地する動作、関節負荷が大きいときに安定した姿勢に戻る動作、の３種類を用意しているが、必ずしもこれだけに限る必要はない。
【００９２】
【発明の効果】
本発明によれば、動作開始時のキャラクタの基準となる部分および全関節の状態を表すデータと複数の動作データとから生成した一つの動作データを目標動作としてキャラクタの関節角加速度を制御することによりキャラクタを動作させるに際して、動作データを目標動作として動作制御手法を適用しただけでは自然な動作を実現できない場合に、この動作データに代わる適切なリアクション動作の動作データを生成し、このリアクション動作の動作データを合成して目標動作とする構成により、非常に大きな衝撃や外力等がキャラクタに与えられた場合であっても、そのキャラクタの自然な動作をリアルタイムに生成してシミュレーションを行うことができる。
【図面の簡単な説明】
【図１】本発明の実施の形態におけるシミュレーション装置の構成を示すブロック図である。
【図２】キャラクタの骨格モデルの例を示す図である。
【図３】各制御空間の関係を示す図である。
【図４】追従制御に用いる近似関数の例を示す図である。
【図５】零モーメント点を示す図であって、（ａ）はバランスが保たれている状態を示す図、（ｂ）はバランスが保たれていない状態を示す図である。
【図６】能動制御における各部位の制御の例を示す図である。
【図７】動作接続手法の説明図であって、（ａ）は合成モードを示す図、（ｂ）は連結モードを示す図である。
【図８】支点制約を伴う動作合成の例を示す図である。
【図９】ルート体節の位置修正の例を示す図である。
【図１０】支点制約を伴う動作連結の例を示す図である。
【図１１】足を踏み出す動作の生成の例を示す図である。
【符号の説明】
１１　動作データベース（ＤＢ）
１２　動作合成手段
１３　動作制御手段
１４　動作判定手段
１５　リアクション動作生成手段
１６　動作演算手段
１７　描画手段
【図１】
2004030502.tif 000003
【図２】
2004030502.tif 000004
【図３】
2004030502.tif 000005
【図４】
2004030502.tif 000006
【図５】
2004030502.tif 000007
【図６】
2004030502.tif 000008
【図７】
2004030502.tif 000009
【図８】
2004030502.tif 000010
【図９】
2004030502.tif 000011
【図１０】
2004030502.tif 000012
【図１１】
2004030502.tif 000013