以下、本発明の一実施形態について図面に基づき詳細に説明する。
図1は、本発明の一実施形態に係る情報処理システムとして機能するゲーム装置10の構成図である。本実施形態に係るゲーム装置10は、例えば、ゲームコンソール、携帯型ゲーム端末、パーソナルコンピュータ等である。図1に示すように、本実施形態に係るゲーム装置10は、制御部12、記憶部14、操作部16、表示部18、を含んでいる。
制御部12は、ゲーム装置10にインストールされるプログラムに従って動作するCPU等のプログラム制御デバイスである。記憶部14は、ROMやRAM等の記憶素子やハードディスクドライブなどである。操作部16は、キーボードやマウス、あるいは家庭用ゲーム機のコントローラ等であって、ユーザの操作入力を受け付けて、その内容を示す信号を制御部12に出力する。表示部18は、液晶ディスプレイ等の表示デバイスであって、制御部12の指示に従って各種の画像を表示する。
なお、ゲーム装置10は、ネットワークボードなどの通信インタフェース、DVD−ROMやBlu−ray(登録商標)ディスクなどの光ディスクを読み取る光ディスクドライブ、USB(Universal Serial Bus)ポートなどを含んでいてもよい。
本実施形態に係るゲーム装置10は、本発明を適用したプログラムを実行することにより、メモリ上に、図2に例示する仮想空間20を構築するようになっている。同図に示すように、本実施形態に係る仮想空間20は、仮想3次元空間であり、プレイヤオブジェクト22、床オブジェクト24、壁オブジェクト26、樽オブジェクト28、槍オブジェクト30、などの仮想オブジェクトが視点32とともに配置されている。
本実施形態では、仮想オブジェクトは複数のポリゴンにより構成されている。各ポリゴンにはテクスチャがマッピングされている。本実施形態では、ゲーム装置10のユーザは、操作部16を操作することによって、仮想空間20内においてプレイヤオブジェクト22を移動させることができるようになっている。
また、本実施形態に係るゲーム装置10で実行されるプログラムでは、古典力学の法則等の物理法則をシミュレートする物理エンジンの機能が実現されている。
図3は、本実施形態に係るゲーム装置10の機能ブロック図である。図3に示すように、ゲーム装置10は、機能的に、データ記憶部40、操作状態取得部42、オブジェクト配置管理部44、空間画像生成出力部46を含んでいる。データ記憶部40は、記憶部14を主として実現され、その他の要素は制御部12を主として実現される。
これらの機能は、情報処理システムであるゲーム装置10で、本実施形態に係るプログラムが実行されることにより実現される。このプログラムは、コンピュータ通信ネットワーク経由で通信インタフェースを介して他のコンピュータからダウンロードされてもよいし、光ディスク(例えば、CD−ROMやDVD−ROMなど)、USBメモリ等のコンピュータ読み取り可能な情報記憶媒体に格納され、そこから光ディスクドライブやUSB(Universal Serial Bus)ポートなどを介してゲーム装置10にインストールされてもよい。
本実施形態では、予め、データ記憶部40に、仮想空間20の構築に必要な各種データが記憶されている。データ記憶部40には、例えば、仮想空間20に配置されている仮想オブジェクトに関するポリゴンデータやテクスチャデータなどが記憶されている。
また、データ記憶部40には、例えば、図4に示すような、プレイヤオブジェクト22の仮想的なスケルトンを表すスケルトンデータ50が記憶されている。スケルトンデータ50には、例えば、木構造におけるノードに対応するボーン52と、木構造におけるリンクに対応するジョイント54と、が含まれている。すなわち、本実施形態では、ジョイント54は、ボーン52同士を接続するとともに、ボーン52間の親子関係を定義している。また、本実施形態に係るスケルトンデータ50では、例えば、胴体に対応付けられるボーン52が、木構造におけるルートノードとして設定されている。以下、胴体に対応付けられるボーン52をルートボーン52aと呼ぶこととする。そして、本実施形態では、プレイヤオブジェクト22の姿勢は、複数のボーン52によって表されるスケルトンの姿勢に基づいて一意に定まるようになっている。そのため、本実施形態では、各ボーン52の位置及び向きが定まると、各ボーン52の位置及び向きに応じたプレイヤオブジェクト22のポリゴンモデルを生成することができるようになっている。また、本実施形態では、ボーン52及びジョイント54は、不可視の仮想オブジェクトである。
また、本実施形態では、予め、データ記憶部40に、図5に例示するラグドールデータ56も記憶されている。ラグドールデータ56は、物理エンジンによる物理シミュレーション処理の対象となるオブジェクトであるラグドールを示すデータである。また、ラグドールデータ56には、ラグドールパーツ58と、ラグドールパーツ58同士を接続するジョイント60と、を含んでいる。本実施形態では、2つのラグドールパーツ58の間は、2つのジョイント60(物理ジョイント60a及びアニメーションジョイント60b)で接続されている。また、本実施形態では、個々のラグドールパーツ58は、例えば、柱形状、カプセル形状、球形状、あるいは、これらを組み合わせた形状のいずれかをしている。また、本実施形態では、ラグドールパーツ58及びジョイント60は、不可視の仮想オブジェクトである。
また、データ記憶部40には、各ラグドールパーツ58についての物理量(例えば、大きさ、質量、慣性モーメント(本実施形態では、慣性テンソル)、重力をかける程度、摩擦係数、風の影響を受ける程度、速度、角速度、最大速度、最大角速度、インパルス値(力積を表す値)など)を表すパラメータの値、及び、各ラグドールパーツ58の移動タイプの値も記憶されている。そして、これらの値はゲームの進行状況に応じて変更することが可能になっている。ラグドールパーツ58の移動タイプについては後述する。
また、本実施形態では、データ記憶部40に、ラグドールパーツ58間を接続する一対のジョイント60(物理ジョイント60a及びアニメーションジョイント60bの組合せ)に対応付けられる物理量(例えば、力みなど)を表すパラメータの値も記憶されている。これらの値もゲームの進行状況に応じて変更することが可能になっている。
また、本実施形態では、データ記憶部40に、仮想空間20全体に関わる物理量を表すパラメータの値も記憶されている。データ記憶部40には、例えば、仮想空間20内の位置座標に対応付けて、その位置の風速を表すパラメータの値が記憶されている。また、本実施形態では、仮想空間20全体に関わる物理量を表すパラメータの値は、所定の規則に従って、時間経過とともに変化するようになっている。
また、本実施形態では、予め、データ記憶部40に、ボーン52とラグドールパーツ58との対応関係、並びに、スケルトンデータ50に含まれるジョイント54とラグドールデータ56に含まれる一対のジョイント60との対応関係を示すデータも記憶されている。図5に示すように、本実施形態では、ボーン52には、ラグドールパーツ58に対応付けられているものも、対応付けられていないものもある。図5の例では、左上腕、右上腕、左太もも、右太もものそれぞれを表すボーン52に対応付けられるラグドールパーツ58が存在しない。本実施形態では、ルートボーン52aに対応付けられるラグドールパーツ58をルートラグドールパーツ58aと呼ぶこととする。そして、本実施形態では、ラグドールデータ56には、ルートラグドールパーツ58aが必ず含まれている。
また、本実施形態では、図5に示すように、スケルトンデータ50に含まれるジョイント54には、ラグドールデータ56に含まれる一対のジョイント60に対応付けられているものも、対応付けられていないものもある。
また、本実施形態では、予め、データ記憶部40に、スケルトンデータ50をラグドールデータ56に変換する規則を示す変換規則データや、ラグドールデータ56をスケルトンデータ50に変換する規則を示す逆変換規則データも記憶されている。本実施形態では、例えば、データ記憶部40に変換行列Tiを表すデータが記憶されており、変換行列Tiを変換規則データとして用い、変換行列Tiの逆行列を逆変換規則データとして用いる。
また、本実施形態では、予め、データ記憶部40に、ラグドールパーツ58に対応付けられていないボーン52について、その親のボーン52の位置及び向きに基づいて自らの位置及び向きを決定する規則を示すデータ(例えば、その親のボーン52の位置及び向きに対する相対的な位置及び向きを示すデータ)が記憶されている。本実施形態では、このデータは、ボーン52と親のボーン52との親子関係に対応付けられる規則を示していている。なお、このデータは、ボーン52の親子関係について共通にあてはめる規則を示していてもよいし、ボーン52の親子関係毎に異なる規則を示していてもよい。
また、本実施形態では、予め、データ記憶部40に、複数のモーション(例えば、歩く、走る、落下するなど)のそれぞれに対応付けられる、スケルトンの姿勢の変化態様を示すモーションデータも記憶されている。本実施形態では、モーションデータには、例えば、予め設定された複数のキーフレームについての、フレーム番号と、そのフレーム番号に対応付けられる、スケルトンデータ50により表されるスケルトンの姿勢(例えば、各ボーン52のローカル座標系における位置及び向き)との組合せが含まれている。また、本実施形態では、モーションデータには、モーションの識別子、及び、そのモーションに対応付けられる状態(本実施形態では、モーション駆動状態、又は、完全ラグドール状態)を示すデータも含まれている。モーション駆動状態、及び、完全ラグドール状態については後述する。また、本実施形態では、プレイヤオブジェクト22の現在のモーションを示すデータも記憶されている。
また、本実施形態では、予め、データ記憶部40に、例えば、コントローラの入力量が所定値を超えた場合に、「歩く」から「走る」にモーションが変化する、あるいは、プレイヤオブジェクト22に足場がない場合は、現在のモーションがどのモーションであっても「落下する」にモーションが変化する、などといった、モーションが遷移する条件を示す遷移条件データが記憶されている。また、本実施形態では、遷移条件データには、モーションが遷移する際に用いられる設定を示すデータ(例えば、遷移時に遷移前のモーションと遷移後のモーションをどのように補間するかを示すデータ、ダンピング係数(低減率)及びその発動条件を示すデータなど)が関連付けられている。ダンピング係数及びその発動条件については後述する。
本実施形態では、空間画像生成出力部46が、仮想空間20内に配置された視点32から視線方向を見た様子を表す画像(以下、空間フレーム画像と呼ぶ。)を所定時間(例えば、1/60秒)間隔で生成し、表示部18に表示出力する。
ここで、前フレームにおいてプレイヤオブジェクト22のモーションが遷移しなかった場合における、本実施形態に係るゲーム装置10で毎フレーム行われる(例えば、1/60秒間隔で行われる)処理の流れの一例を、図6A及び図6Bに例示するフロー図を参照しながら説明する。なお、本処理例では、予め、実行されているゲームにおけるプレイヤの現在位置(必ずしもプレイヤオブジェクト22が配置されている位置と一致していなくてもよい)と現在の向きが設定されていることとする。
まず、操作状態取得部42が、操作部16の操作状態(具体的には、例えば、押下されているボタンの種類、及び、ボタンの押下量)を取得する(S101)。そして、オブジェクト配置管理部44が、本処理の開始時点におけるスケルトンの姿勢(モーション及びフレーム番号など)、S101に示す処理で取得した操作状態、及び、プレイヤの現在位置及び現在の向き、に基づいて、プレイヤオブジェクト22の仮想空間20内における変化の記述に用いられる各種パラメータの値を決定する(S102)。S102に示す処理では、オブジェクト配置管理部44は、例えば、モーションを再生すべきフレーム番号、プレイヤオブジェクト22のワールド座標系における移動量並びに回転量、及び、発生したイベントの種類、などを決定する。
そして、オブジェクト配置管理部44が、S102に示す処理でイベントが発生していると決定された場合には、そのイベントの種類に応じた処理を実行する(S103)。この処理の詳細については後述する。
また、オブジェクト配置管理部44は、プレイヤオブジェクト22の現在のモーション、及び、S102に示す処理で決定されたフレーム番号に基づいて、各ボーン52のローカル座標系における位置及び向き(すなわち、スケルトンの姿勢)を決定して、その決定に従うよう各ボーン52を配置する(S104)。
オブジェクト配置管理部44は、具体的には、例えば、ルートボーン52aを、プレイヤの現在位置をS102に示す処理で決定された移動量だけ移動させた位置に、プレイヤの現在の向きをS102に示す処理で決定された回転量だけ回転させた向きで配置する。なお、このとき、オブジェクト配置管理部44が、ルートボーン52aの鉛直方向が、床オブジェクト24に対する法線方向に沿うように、各ボーン52の位置や向きを調整するようにしてもよい。そして、オブジェクト配置管理部44は、決定されたフレーム番号の直前、直後のキーフレームのフレーム番号に対応付けられる姿勢データを補間してなるデータに従って各ボーン52のローカル座標系における位置及び向きを決定する。そして、オブジェクト配置管理部44は、決定されるローカル座標系における位置及び向きに従うよう残りのボーン52を配置する。
そして、オブジェクト配置管理部44は、データ記憶部40に記憶されている変換規則データを取得して、配置されたスケルトンと、変換規則データと、に基づいて、ラグドールパーツ58に対応付けられているボーン52について、そのボーン52に対応するラグドールパーツ58に位置及び向きを決定して、その決定に従うよう各ラグドールパーツ58を配置する(S105)。オブジェクト配置管理部44は、具体的には、例えば、配置された各ボーン52の位置及び向きを表す値に対して変換行列Tiを乗じることにより、対応するラグドールパーツ58の位置及び向きの値を決定する。
そして、オブジェクト配置管理部44が、S102に示す処理で決定されたパラメータの値に基づいて基準位置Pb及び基準向きDbを決定する(S106)。このとき、オブジェクト配置管理部44は、例えば、プレイヤの現在位置をS102に示す処理で決定された移動量だけ移動させた位置に対してさらにS102に示す処理で決定されたモーションの種類に基づいて決定されるオフセットだけずらした位置を基準位置Pbとして決定し、プレイヤオブジェクト22の現在の向きをS102に示す処理で決定された回転量だけ回転させた向きに対してさらにS102に示す処理で決定されたモーションの種類に基づいて決定されるオフセットだけずらした向きを基準向きDbとして決定する。
そして、オブジェクト配置管理部44は、代表点の位置が基準位置Pbに一致し、予め設定された前方の向きが基準向きDbに一致するよう、衝突判定用剛体オブジェクト62を仮想空間20内に配置する(S107)。そして、オブジェクト配置管理部44は、それぞれの代表点が基準位置Pb、及び、基準位置Pbに対して上、下、左、右にずらした位置に一致する5つのプロキシオブジェクト64を仮想空間20内に配置する(S108)。図7に、仮想空間20内に衝突判定用剛体オブジェクト62、及び、5つのプロキシオブジェクト64が配置されている様子の一例を示す。図7には、基準位置Pb及び基準向きDbも示されている。この段階で配置されるプロキシオブジェクト64は、あくまでも本処理例におけるプロキシオブジェクト64の候補であり、後述する処理によりこれらのうちの1つが本処理例におけるプロキシオブジェクト64として決定されることとなる。本実施形態では、5つのプロキシオブジェクト64の向きはすべて基準向きDbに一致している。本実施形態では、衝突判定用剛体オブジェクト62、並びに、プロキシオブジェクト64は、仮想空間20内に配置される楕円体形状の不可視の仮想オブジェクトである。また、本実施形態では、衝突判定用剛体オブジェクト62の重心の位置と基準位置Pbに配置されたプロキシオブジェクト64の重心の位置とは一致し、衝突判定用剛体オブジェクト62とプロキシオブジェクト64とは相似形であり、衝突判定用剛体オブジェクト62はプロキシオブジェクト64よりも大きい。
そして、オブジェクト配置管理部44が、プロキシオブジェクト64、衝突判定用剛体オブジェクト62、並びに、ラグドールに対して物理シミュレーション処理を実行する(S109)。このことにより、プロキシオブジェクト64、ラグドール、ラグドールや衝突判定用剛体オブジェクト62に接触している仮想オブジェクトについては、位置や向き、並びに、速度パラメータの値(本実施形態では、速度パラメータの値は3次元ベクトルで表されている。)が変化することがある。例えば、壁オブジェクト26にめりこんでいるプロキシオブジェクト64は、壁オブジェクト26の外に押し戻されることとなる。物理シミュレーション処理の詳細については後述する。
そして、オブジェクト配置管理部44は、プレイヤオブジェクト22の現在のモーションに対応付けられる状態を判定する(S110)。本実施形態では、例えば、「歩く」、「走る」などのモーションはモーション駆動状態に設定され、「落下する」などのモーションは完全ラグドール状態に設定されている。
そして、モーション駆動状態である場合は、オブジェクト配置管理部44は、物理シミュレーション処理の実行後の5つのプロキシオブジェクト64の位置のうち、基準位置Pbまでの距離が最も短いプロキシオブジェクト64を、本処理例におけるプロキシオブジェクト64として決定する(S111)。この時点で、オブジェクト配置管理部44は、残りのプロキシオブジェクト64は仮想空間20から消去する。そして、図8に示すように、前フレームにおいて決定されたレイキャスト始点Rsと、プロキシオブジェクト64の代表点(例えば、重心)の位置、及び、代表点に対して所定の長さだけ前、後、左、右、上、下、にずらした位置に一致する7つのレイキャスト終点Reのそれぞれと、をつなぐ7つの線分上に、壁オブジェクト26等の他の仮想オブジェクトが存在しているか否かを判定する(S112)。7つの線分のすべてが他の仮想オブジェクトと交差する場合は(S112:Y)、プロキシオブジェクト64の位置及び向きを、前フレームにおいて決定されたプロキシオブジェクト64の位置及び向きに変更する(S113)。すなわち、プロキシオブジェクト64の位置及び向きは、前フレームにおいて決定されたプロキシオブジェクト64の位置及び向きに戻ることとなる。よって、プロキシオブジェクト64の位置及び向きは、前フレームにおいて決定されたプロキシオブジェクト64の位置及び向きのまま変更されない。また、この場合は、次フレームにおいてもレイキャスト始点Rsの位置は変わらない。
一方、他の仮想オブジェクトと交差しない線分が存在する場合は(S112:N)、所定の優先順位に関する規則に従って決定されるいずれかのレイキャスト終点Reを、次フレームにおけるレイキャスト始点Rsとして決定する(S114)。この場合は、プロキシオブジェクト64の位置及び向きは、S111に示す処理で決定された位置及び向きのままである。
そして、S113に示す処理又はS114に示す処理が終了すると、オブジェクト配置管理部44は、プロキシオブジェクト64の位置及び向きを、次フレームにおけるプレイヤの現在位置及び現在の向きとして決定する(S115)。
一方、S110に示す処理で完全ラグドール状態であると判定された場合は、物理シミュレーション処理の実行後のルートラグドールパーツ58aの位置及び向きを、次フレームにおけるプレイヤの現在位置及び現在の向きとして決定する(S116)。
そして、S115に示す処理又はS116に示す処理が終了すると、オブジェクト配置管理部44は、物理シミュレーション処理の実行後のラグドールに基づいて、各ラグドールパーツ58に対応するボーン52の位置及び向きを決定して、その決定に従うよう各ボーン52を配置する(S117)。ここで、オブジェクト配置管理部44は、ルートボーン52aから、親のボーン52から子のボーン52への順序で、S117に示す処理を実行する。そして、オブジェクト配置管理部44は、データ記憶部40に記憶されている逆変換規則データを取得して、ラグドールパーツ58が対応付けられているボーン52については、物理シミュレーション処理の実行後のラグドールパーツ58の位置及び向きと、逆変換規則データと、に基づいて、ボーン52の位置及び向きを決定する。オブジェクト配置管理部44は、具体的には、例えば、ラグドールパーツ58の位置及び向きを表す値に対して変換行列Tiの逆行列を乗じることにより、対応するボーン52の位置及び向きの値を決定する。
一方、オブジェクト配置管理部44は、ラグドールパーツ58が対応付けられていないボーン52については、親のボーン52の位置及び向きに対する相対的な位置及び向きを示すデータと、S117に示す処理で決定された親のボーン52の位置及び向きと、に基づいて、ラグドールパーツ58に対応付けられていないボーン52の位置及び向きを決定する。このようにして、ラグドールパーツ58が対応付けられていないボーン52については、親のボーン52の位置又は向きの変化に応じて、自らの位置又は向きが変化することとなる。
そして、オブジェクト配置管理部44は、S117に示す処理で決定された各ボーン52の位置及び向きに基づいて、描画の対象となるプレイヤオブジェクト22を仮想空間20内に配置する(S118)。そして、オブジェクト配置管理部44は、配置後のプレイヤオブジェクト22、及び、S101に示す処理で取得した操作部16の操作状態に基づいて、次フレームにおけるモーションを決定する(S119)。ここでは、例えば、配置後のプレイヤオブジェクト22に基づいて決定される、足場があるか否かを示す情報、足場の傾斜角、各ラグドールに設定されているインパルス値、及び、遷移条件データに基づいて、次フレームにおけるモーションを決定する。
そして、空間画像生成出力部46が、視点32から視線方向を見た様子を表す空間フレーム画像を生成し、表示部18に表示出力する(S120)。
ここで、図9に示す、樽オブジェクト28と衝突判定用剛体オブジェクト62、及び、樽オブジェクト28とプロキシオブジェクト64が衝突する様子を例に、S109に示す物理シミュレーション処理について説明する。
まず、オブジェクト配置管理部44は、衝突していると判定される仮想オブジェクト対を特定する。本実施形態では、図9に示すように、各仮想オブジェクトには、仮想オブジェクトを覆う不可視の衝突判定領域66が設定されており、オブジェクト配置管理部44は、衝突判定領域66が接触している、あるいは、重なっている仮想オブジェクト対を衝突している仮想オブジェクト対として特定する。図9の例では、プロキシオブジェクト64と、樽オブジェクト28と、が衝突しており、衝突判定用剛体オブジェクト62と、樽オブジェクト28と、が衝突していると判定される。なお、本実施形態では、予め、衝突判定用剛体オブジェクト62とプロキシオブジェクト64との衝突判定は行われないように設定されている。
そして、オブジェクト配置管理部44は、図9に示す樽オブジェクト28とプロキシオブジェクト64のそれぞれに設定されている質量パラメータの値、及び、速度パラメータの値、を取得する。そして、オブジェクト配置管理部44は、取得した値、及び、プロキシオブジェクト64が樽オブジェクト28と接触している程度(めりこんでいる程度)を表す指標、に基づいて、プロキシオブジェクト64の速度パラメータの値の変化量を算出する。そして、オブジェクト配置管理部44は、算出された変化量だけ速度パラメータの値を変化させた上で、変化後の速度パラメータの値に基づいて特定される移動量(例えば、変化後の速度パラメータの値を所定倍した移動量)だけプロキシオブジェクト64を移動させる。また、オブジェクト配置管理部44は、図9に示す樽オブジェクト28とプロキシオブジェクト64のそれぞれに設定されている慣性テンソルパラメータの値、角速度パラメータの値を取得する。そして、オブジェクト配置管理部44は、取得した値、及び、プロキシオブジェクト64が樽オブジェクト28に接触している程度(めりこんでいる程度)を表す指標、に基づいて、プロキシオブジェクト64の角速度パラメータの値の変化量を算出する。そして、オブジェクト配置管理部44は、算出された変化量だけ角速度パラメータの値を変化させた上で、変化後の角速度パラメータの値に基づいて特定される回転量(例えば、変化後の角速度パラメータの値を所定倍した回転量)だけプロキシオブジェクト64を回転させる。
また、オブジェクト配置管理部44は、図9に示す樽オブジェクト28と衝突判定用剛体オブジェクト62のそれぞれに設定されている質量パラメータの値、及び、速度パラメータの値を取得する。そして、オブジェクト配置管理部44は、取得した値、及び、衝突判定用剛体オブジェクト62が樽オブジェクト28に接触している程度(めりこんでいる程度)を表す指標、に基づいて、樽オブジェクト28の速度パラメータの値の変化量を算出する。そして、オブジェクト配置管理部44は、算出された変化量だけ速度パラメータの値を変化させた上で、変化後の速度パラメータの値に基づいて特定される移動量(例えば、変化後の速度パラメータの値を所定倍した移動量)だけ樽オブジェクト28を移動させる。また、オブジェクト配置管理部44は、樽オブジェクト28と衝突判定用剛体オブジェクト62のそれぞれに設定されている慣性テンソルパラメータの値、角速度パラメータの値を取得する。そして、オブジェクト配置管理部44は、取得した値、及び、衝突判定用剛体オブジェクト62が樽オブジェクト28に接触している程度(めりこんでいる程度)を表す指標、に基づいて、樽オブジェクト28の角速度パラメータの値の変化量を算出する。そして、オブジェクト配置管理部44は、算出された変化量だけ角速度パラメータの値を変化させた上で、変化後の角速度パラメータの値に基づいて特定される回転量(例えば、変化後の角速度パラメータの値を所定倍した回転量)だけ樽オブジェクト28を回転させる。
本実施形態では、公知の物理エンジンの機能を用いて、上述の変化量の算出を行っている。図10を参照しながら、物理エンジンにおける速度パラメータの値の算出手法の一例を説明する。ここでは、図10に示すように、左の仮想オブジェクト(質量パラメータの値:mA、速度パラメータの値:vA(右向きを正))と、右の仮想オブジェクト(質量パラメータの値:mB、速度パラメータの値:vB(右向きを正))とが衝突した場合を考える。ここでは、仮想オブジェクト同士が接触している程度(めりこんでいる程度)を表す指標として、仮想オブジェクトの重心をつなぐ直線に沿った方向での、仮想オブジェクトが重なっている長さdを用いることとする。
すると、衝突後の左の仮想オブジェクトの速度vA’は、vA’=vA−(mB/(mA+mB))×(α(vA−vB)+βd)という数式により算出され、衝突後の右の仮想オブジェクトの速度vB’は、vB’=vB+(mA/(mA+mB))×(α(vA−vB)+βd)という数式により算出される。ここで、α、βは所定の調整値を表している。
このように、物理エンジンでは、衝突した仮想オブジェクトそれぞれの速度パラメータの値の変化量は、質量パラメータの値の比(質量パラメータの値の和に対する衝突相手の質量パラメータの値の割合)や、相対速度や、仮想オブジェクト同士が接触している程度(めりこんでいる程度)などに基づいて決定されることとなる。同様に、物理エンジンでは、衝突した仮想オブジェクトそれぞれの角速度パラメータの値の変化量は、仮想オブジェクトそれぞれの慣性テンソルの値や、相対角速度や、仮想オブジェクト同士が接触している程度(めりこんでいる程度)などに基づいて決定されることとなる。
図9における仮想オブジェクト同士が接触している程度(めりこんでいる程度)としては、例えば、所定の投影面に投影した際における、仮想オブジェクトの重心の投影点をつなぐ直線に沿った方向での、衝突判定領域66が重なっている長さを用いることが考えられる。そして、本実施形態では、この長さが長ければ長いほど上述の変化量が大きくなるようになっている。例えば、衝突判定用剛体オブジェクト62と樽オブジェクト28との衝突における物理シミュレーション処理では、図9に示されている長さd1が用いられ、プロキシオブジェクト64と樽オブジェクト28との衝突における物理シミュレーション処理では図9に示されている長さd2が用いられる。
また、本実施形態では、衝突判定用剛体オブジェクト62には、ゲームにおいて他の仮想オブジェクトとの関係でプレイヤオブジェクト22として設定するのに妥当な質量パラメータや慣性テンソルパラメータの値が設定される。具体的には、例えば、プレイヤオブジェクト22と他の仮想オブジェクトとの質量比や慣性テンソル比が、ゲームにおけるプレイヤと他のオブジェクトとの質量比や慣性テンソル比と整合する値が設定される。一方、プロキシオブジェクト64には、ゲームにおいて他の仮想オブジェクトとの関係でプレイヤオブジェクト22として設定するのに妥当な質量パラメータや慣性テンソルパラメータの値よりも充分大きな値が質量パラメータや慣性テンソルパラメータの値として設定される。
また、本実施形態では、プロキシオブジェクト64に設定される質量パラメータや慣性テンソルパラメータの値が衝突相手となる仮想オブジェクトの属性に基づいて決定される。本実施形態では、例えば、衝突相手となる仮想オブジェクトに設定されている質量パラメータや慣性テンソルパラメータの値が大きくなればなるほど、質量パラメータや慣性テンソルパラメータの値が大きくなるよう、プロキシオブジェクト64の質量パラメータや慣性テンソルパラメータの値が設定される。例えば、衝突相手となる仮想オブジェクトに設定されている質量パラメータや慣性テンソルパラメータの値に比例した値がプロキシオブジェクト64の質量パラメータや慣性テンソルパラメータの値として設定される。また、例えば、衝突相手となる仮想オブジェクトの種別(例えば、壁オブジェクト26であるのか樽オブジェクト28であるのか、など)に応じて、プロキシオブジェクト64に設定される質量パラメータや慣性テンソルパラメータの値が決定されるようにしてもよい。
本実施形態では、衝突相手の仮想オブジェクトの物理量(速度等)の変化を算出する基礎となる、プレイヤオブジェクト22に対応付けられるパラメータの値(ここでは、衝突判定用剛体オブジェクト62に設定されている質量パラメータや慣性テンソルパラメータの値)と、プレイヤオブジェクト22の物理量(速度等)の変化を算出する基礎となる、プレイヤオブジェクト22に対応付けられるパラメータの値(ここでは、プロキシオブジェクト64に設定されている質量パラメータや慣性テンソルパラメータの値)が異なる。そのため、丸め誤差等の影響によって物理エンジンによる算出結果が不安定にならないよう、パラメータの値を設定することで、物理エンジンによる算出結果を安定させることができることとなり、その結果、衝突する様子の表現のリアリティがなくなってしまう可能性が低減することとなる。
また、本実施形態では、衝突判定用剛体オブジェクト62が、プロキシオブジェクト64よりも大きくなるよう設定されるため、衝突相手の仮想オブジェクトが、衝突判定用剛体オブジェクト62とは衝突するが、プロキシオブジェクト64とは衝突しないということが起こりうる。そして、衝突判定用剛体オブジェクト62には、ゲームにおいて他の仮想オブジェクトとの関係でプレイヤオブジェクト22として設定するのに妥当な質量パラメータや慣性テンソルパラメータの値が設定されるので、衝突相手の仮想オブジェクトが移動する際の表現(例えば、吹き飛ぶような表現)が的確なものとなることが期待される。また、プロキシオブジェクト64には、妥当な質量パラメータや慣性テンソルパラメータの値よりも充分大きな値(例えば、衝突相手の仮想オブジェクトに設定されている質量パラメータや慣性テンソルパラメータの値に比例した値)が質量パラメータや慣性テンソルパラメータの値として設定されるので、質量パラメータや慣性テンソルパラメータの値が大きな仮想オブジェクト(例えば、壁オブジェクト26)とプロキシオブジェクト64が衝突したと判定された場合に、丸め誤差の影響を受けずにプロキシオブジェクト64がきちんと停止するようになることも期待される。
また、本実施形態では、衝突相手となる仮想オブジェクトの属性に応じた、プロキシオブジェクト64の質量パラメータや慣性テンソルパラメータの値が可能であるので、パラメータの値の設定のバリエーションが広がり、仮想空間20内における仮想オブジェクト同士が衝突する様子の表現のバリエーションを広げることができる。
また、本実施形態では、S111に示す処理で、複数のプロキシオブジェクト64の候補のうち、基準位置Pbまでの距離が最も短いプロキシオブジェクト64が、本処理例におけるプロキシオブジェクト64として決定されるので、プレイヤオブジェクト22を進めようとしているところ付近にプレイヤオブジェクト22を進めることができ、細かい凹凸のある壁オブジェクト26にひっかかる、床オブジェクト24に設けられている小さな段差の影響を受け、プレイヤオブジェクト22が思いの外高く飛んでしまう、などといった、リアリティのない画像表現となるおそれを低減することができることとなる。また、さらに、S112〜S114に示す処理で、S111に示す処理で決定されたプロキシオブジェクト64内の所定数の点のそれぞれと、前フレームのプロキシオブジェクト64内の点と、をつなぐ線分上に仮想オブジェクトが存在している場合には、プロキシオブジェクト64が移動しないこととなるので、プロキシオブジェクト64が仮想オブジェクトをすり抜けてしまうおそれを低減することができることとなる。
また、本実施形態では、オブジェクト配置管理部44は、各仮想オブジェクトに設定されている、風の影響を受ける程度を示すパラメータの値と、仮想オブジェクトが配置されている位置に対応付けられている風速パラメータの値と、に基づいて、仮想オブジェクトの位置や向きをさらも変化させる。
ラグドールパーツ58と他の仮想オブジェクトとの衝突についても、ただし、ジョイント60による拘束条件があるなどといった相違点はあるが、基本的には上述と同様の物理シミュレーション処理が行われる。なお、本実施形態では、モーションの種類に基づいて、各ラグドールパーツ58の移動タイプの値が決定される。移動タイプの値としては、例えば、キーフレーム、位置制御、速度制御、ジョイント制御、位置制御(ワンウェイ)、速度制御(ワンウェイ)、ジョイント制御(ワンウェイ)などが挙げられる。移動タイプの値がキーフレームであるラグドールパーツ58は、他の仮想オブジェクトと衝突しても物理シミュレーション処理の結果位置が変化することはない。移動タイプの値が位置制御であるラグドールパーツ58は、モーションの種類とフレーム番号との組合せに基づいて決定される位置に配置された上で物理シミュレーション処理が実行されることとなる。移動タイプの値が速度制御であるラグドールパーツ58は、モーションの種類とフレーム番号との組合せに基づいて決定される位置と現在位置との差分に基づいてラグドールパーツ58の速度パラメータの値が設定された上で物理シミュレーション処理が実行されることとなる。また、移動タイプが上述のワンウェイに該当するものについては、衝突相手から影響を受けるが、衝突相手に影響を与えないこととなる。
移動タイプの値がジョイント制御であるラグドールパーツ58は、モーションの種類とフレーム番号との組合せに基づいて決定される、親のラグドールパーツ58との間の角度がアニメーションジョイント60bの角度として設定される。また、移動タイプの値がジョイント制御であるラグドールパーツ58は、所定の物理的制約条件が物理ジョイント60aに設定される。そして、このようなジョイント60の設定がされた上で、物理シミュレーション処理が実行されることとなる。ここで、物理シミュレーション処理では、アニメーションジョイント60bの角度は変化せず、物理ジョイント60aの角度は物理的制約条件を満たす範囲で可変となる。そして、本実施形態では、ジョイント60に設定されている力みパラメータの値に応じた比率でアニメーションジョイント60bでの物理シミュレーション処理の結果と物理ジョイント60aでの物理シミュレーション処理の結果とがブレンド(例えば、力みパラメータの値が100%であれば、アニメーションジョイント60bの比率が100%となり、力みパラメータの値が0%であれば、物理ジョイント60aの比率が100%となる。)された結果が、物理シミュレーション処理の最終結果として取り扱われることとなる。
そして、上述のS117の示す処理で説明したように、本実施形態では、物理シミュレーション処理の実行後のラグドールパーツ58については、逆変換規則データに基づいて対応するボーン52に変換される。一方、一部のボーン52については、対応するラグドールパーツ58が設定されておらず、親のボーン52の位置及び向きに応じてボーン52の位置及び向きが設定される。このように、本実施形態では、物理シミュレーション処理の対象となるラグドールパーツ58の総数は、ボーン52の総数よりも少なくなっている。よって、すべてのボーン52について対応するラグドールパーツ58が存在する場合と比較して、本実施形態では、S109に示す物理シミュレーション処理でのゲーム装置10の計算負荷を低減することができることとなる。
また、例えば、S119に示す処理でモーションが変化した際に、データ記憶部40に記憶されているデータが示す設定に従って、プレイヤオブジェクト22の位置や向きの決定が行われるようにしてもよい。具体的には、例えば、遷移前のモーションにおける上述のS118に示す処理の結果と、遷移前のモーションにおける上述のS118に示す処理の結果と、を補間することによって得られる結果が、描画の対象となるプレイヤオブジェクト22の配置が決定されるようにしてもよい。
本実施形態では、モーションが遷移した場合には、遷移条件データに関連付けられているデータが示す設定に応じた修正が、上述のS101〜S120に示す処理に加えられることとなる。例えば、数フレームにわたって、遷移前のモーションでの処理の結果と、遷移後のモーションでの処理の結果とを、遷移条件データに関連付けられているデータが示す設定に応じたブレンド比率で補間した処理結果が、最終的な処理結果として取り扱われる。また、本実施形態では、数フレームの間に、徐々に、遷移前のモーションでの処理の結果が占めるブレンド比率が低くなり、遷移後のモーションでの処理の結果が占めるブレンド比率が高くなるようになっている。
また、本実施形態では、前フレームまでモーション駆動状態であった仮想オブジェクトが、完全ラグドール状態に遷移するということが考えられる。この場合、本実施形態では、オブジェクト配置管理部44は、モーション駆動状態での処理結果の速度パラメータの値を用いて、完全ラグドール状態での物理シミュレーション処理を行うこととなる。このとき、本実施形態では、モーションの遷移に対応付けられている上述の発動条件を満足する場合(例えば、速度パラメータの値の、仮想空間20に設定された鉛直方向上向きの成分が所定値以上である場合)には、完全ラグドール状態になった際の物理シミュレーション処理後の速度パラメータの値に対して、さらに、予め、仮想空間20に設定された鉛直方向上向き成分について、モーションの遷移に対応付けられている上述のダンピング係数の値(例えば、設定されている値は0から1までの間のいずれかの実数)を乗じることで、最終的な速度パラメータの値を決定する。こうすれば、最終的な速度パラメータの値であるベクトルの向きが、ダンピング係数の値が乗じられる前の速度パラメータの値であるベクトルの向きに対して鉛直方向下向きにずれることととなる。例えば、2つ前のフレームにおけるプレイヤの現在位置から1つ前のフレームにおけるプレイヤの現在位置に向かう向きに速度パラメータが表す速度ベクトルが設定されている場合に、その向きよりも鉛直方向下向きに速度パラメータが表す速度ベクトルが変更されることとなる。そのため、完全ラグドール状態に遷移した際に、リアリティがない事態が発生すること(例えば、プレイヤオブジェクト22が上方に吹っ飛んでしまうこと)を防ぐことができることとなる。
ここで、上述のS103に示す処理における、発生したイベントの種類に応じた処理の一例について図11を参照しながら説明する。ここでは、例えば、プレイヤオブジェクト22が槍オブジェクト30を所持するというイベントが発生したこととする。そして、図11は、上述のイベントが発生した際の、衝突判定用剛体オブジェクト62やプロキシオブジェクト64などをプレイヤオブジェクト22の上方から見た様子の一例を示す図である。
図11に示すように、上述のイベントが発生した際には、オブジェクト配置管理部44は、プロキシオブジェクト64の大きさを、プレイヤオブジェクト22と槍オブジェクト30の両方を包含する形状になるよう大きくするとともに、槍オブジェクト30に設定されていた衝突判定領域66を消去する。そして、オブジェクト配置管理部44は、大きくなったプロキシオブジェクト64を覆う衝突判定領域66を、プロキシオブジェクト64と槍オブジェクト30の両方に対応付けられる衝突判定領域66として設定する。このようにして、プレイヤオブジェクト22と槍オブジェクト30の両方を包含する閉領域が、プロキシオブジェクト64と槍オブジェクト30の両方に対応付けられる衝突判定領域66として設定されることとなる。また、本実施形態では、図11に示すように、プロキシオブジェクト64の形状の変化に伴い、変化後のプロキシオブジェクト64を包含する形状となるよう衝突判定用剛体オブジェクト62、及び、衝突判定用剛体オブジェクト62を覆う衝突判定領域66の形状も変化する。
そして、本実施形態では、プロキシオブジェクト64を覆う衝突判定領域66が、他の仮想オブジェクトの衝突判定領域66と接触した(あるいは、重なった)際には、他の仮想オブジェクトと、プロキシオブジェクト64と、が衝突したと判定される。また、衝突判定用剛体オブジェクト62を覆う衝突判定領域66が、他の仮想オブジェクトの衝突判定領域66と接触した(あるいは、重なった)際には、他の仮想オブジェクトと、衝突判定用剛体オブジェクト62と、が衝突したと判定される。なお、ここでは、プロキシオブジェクト64や衝突判定用剛体オブジェクト62の衝突判定領域66が、他の仮想オブジェクトの衝突判定領域66と接触した(あるいは、重なった)際に、プロキシオブジェクト64や衝突判定用剛体オブジェクト62が、他の仮想オブジェクトと衝突したと判定される代わりに、他の仮想オブジェクトと槍オブジェクト30とが衝突したと判定されるようにしても、他の仮想オブジェクトとプレイヤオブジェクト22とが衝突したと判定されるようにしてもよい。
このようにして、本実施形態では、プレイヤオブジェクト22が槍オブジェクト30を所持するというイベントが発生した時期以降については、プレイヤオブジェクト22と槍オブジェクト30との間での衝突判定処理が実行されないようにすることができる。
また、オブジェクト配置管理部44は、図11に示すように、プロキシオブジェクト64を、その一部に扇形柱を含む形状となるようにしてもよい。オブジェクト配置管理部44は、この扇形柱の断面の扇形の中心角θをプレイヤオブジェクト22に設定されている角速度パラメータの値に基づいて決定する。具体的には、例えば、角速度パラメータの値に1フレームの時間間隔を乗じた値が扇形の中心角θの値として設定される。図11の例では2つの扇形柱が示されており、それぞれの扇形柱の断面の扇形の中心は、プレイヤオブジェクト22と槍オブジェクト30位置関係に基づいて決定される位置(例えば、プレイヤオブジェクト22の近傍)に設定されている。また、それぞれの扇形柱の断面の扇形について、扇形の中心と槍オブジェクト30の先端までの線分と、その線分をプレイヤオブジェクト22の回転方向後方だけ上述の回転角θだけ回転させた線分と、が扇形の半径となっている。
このようにして、例えば、槍オブジェクト30のような細長い仮想オブジェクトを振り回すような動作が仮想空間20内で行われるような場面でも、図11に示すように、1フレームで移動する槍オブジェクト30の軌跡上に壁オブジェクト26等の仮想オブジェクトが存在するような場面でも、プロキシオブジェクト64と壁オブジェクト26とが衝突し、衝突判定用剛体オブジェクト62と壁オブジェクト26とが衝突したと判定することができることとなる。
なお、オブジェクト配置管理部44は、プロキシオブジェクト64を、仮想空間20内をプレイヤオブジェクト22及び槍オブジェクト30が所定時間内に移動する長さ(例えば、1フレームにおいて移動する長さ)を奥行きとする、その一部に直方体を含むその一部に含む形状となるようにしてもよい。
また、オブジェクト配置管理部44は、例えば、プレイヤオブジェクト22が槍オブジェクト30を所持するというイベントの発生以降、プロキシオブジェクト64、及び、プロキシオブジェクト64を覆う衝突判定領域66の形状を徐々に大きくするようにしてもよい。
なお、本発明は上述の実施形態に限定されるものではない。
例えば、オブジェクト配置管理部44は、モーションの遷移に対応付けられている上述の発動条件を満足する場合に、仮想空間20に設定された鉛直方向上向き成分以外の速度成分についても、速度パラメータの値に、所定の値を乗じることで、最終的な速度パラメータの値を低減したり、角速度パラメータの値に所定の値を乗じることで、最終的な角速度パラメータの値を低減したりするようにしてもよい。
また、例えば、上述のS112に示す処理において、前フレームにおいて決定されたレイキャスト始点Rsと、プロキシオブジェクト64の代表点に対して所定の長さだけ前、又は、上にずらした位置に一致するレイキャスト終点のそれぞれと、をつなぐ2つの線分については、線分上に他の仮想オブジェクトが存在しているか否かの判定を行わないようにしてもよい。
また、例えば、衝突判定用剛体オブジェクト62の大きさが、衝突していると判定される仮想オブジェクトの種別に応じて変わるようにしてもよい。例えば、衝突相手の仮想オブジェクトが吹き飛ばした方がよりよい仮想オブジェクトであればあるほど、衝突判定用剛体オブジェクト62の大きさを大きくするようにしてもよい。
また、上述のS111に示す処理において、物理シミュレーション処理の実行後の5つのプロキシオブジェクト64の位置のうち、特定方向の座標値(例えば、鉛直方向の座標値)が、基準位置Pbの特定方向の座標値(例えば、鉛直方向の座標値)に最も近いプロキシオブジェクト64を、上述の処理例におけるプロキシオブジェクト64として決定してもよい。
また、本実施形態では、衝突した仮想オブジェクトそれぞれの速度パラメータの値を用いて、物理シミュレーション処理を実行しているが、衝突した仮想オブジェクトそれぞれの速度パラメータの値の代わりに、一方の仮想オブジェクトに対する他方の仮想オブジェクトの相対速度、などのような、2つの仮想オブジェクトの移動速度の関係に関する他の情報を用いて、物理シミュレーション処理を実行しても構わない。
また、本実施形態をゲーム装置10以外の情報処理システム(例えば、シミュレーションシステムや画像処理システムなど)に応用してもよい。また、上記の具体的な数値や文字列や図面中の具体的な数値や文字列は例示であり、これらの数値や文字列には限定されない。