(57)【要約】【課題】複数のノードで構成されるオブジェクトの姿勢を、少ない計算量で、かつ自然な姿勢となるように制御することが可能な情報処理プログラムおよび情報処理装置を提供すること。【解決手段】ＣＰＵは、オブジェクトに対して所定の動作を行わせ、当該所定の動作に応じて複数のノードのうちの注目ノードと、当該注目ノードに接続された１以上の接続ノードのそれぞれとの間で生じる引力または斥力を算出する。さらにＣＰＵは、仮想空間内の各基準軸方向において、１以上の接続ノードとの間で生じる引力または斥力の最大値及び最小値を算出し、算出された基準軸方向別の最大値及び最小値を用いて修正ベクトルを算出し、算出された修正ベクトルに基づき注目ノードを制御する。【選択図】図４６Ａ
2011008445.tif 000002
【特許請求の範囲】
【請求項１】
仮想空間内において、複数のノードが接続されることにより構成されるオブジェクトを表示装置に表示するための情報処理を行う情報処理装置のコンピュータにおいて実行される情報処理プログラムであって、
前記コンピュータを、
前記オブジェクトに対して所定の動作を行わせるオブジェクト動作手段と、
前記所定の動作に応じて前記複数のノードのうちの所定のノード（以下、注目ノードと称す）と当該注目ノードに接続された各ノード（以下、接続ノードと称す）との間で生じる引力または斥力を算出する作用力算出手段と、
各基準軸方向ごとに、前記注目ノードと前記各接続ノードとの間で生じる引力または斥力の当該基準軸方向の成分についての最大値及び最小値を算出する最大最小算出手段と、
前記最大最小算出手段で算出された前記基準軸方向別の最大値及び最小値を用いて修正ベクトルを算出する修正ベクトル算出手段と、
前記修正ベクトル算出手段で算出された修正ベクトルに基づき前記注目ノードを制御するノード制御手段と、
前記ノード制御手段の制御結果を反映した前記オブジェクトの画像を生成して前記表示装置に表示する表示制御手段として機能させる、情報処理プログラム。
【請求項２】
前記修正ベクトル算出手段は、
前記基準軸方向別に前記最大最小算出手段で算出された最大値及び最小値の合計値を基準軸方向別に算出する合計値算出手段を含み、
前記合計値算出手段で算出された前記基準軸方向別の合計値を用いて前記修正ベクトルを算出する、請求項１に記載の情報処理プログラム。
【請求項３】
前記修正ベクトル算出手段は、前記合計値算出手段で算出された前記基準軸方向別の合計値を、前記修正ベクトルの各基準軸方向の成分としてそれぞれ利用する、請求項２に記載の情報処理プログラム。
【請求項４】
前記修正ベクトル算出手段は、
前記基準軸方向別に前記最大最小算出手段で算出された最大値及び最小値の合計値に所定の係数を乗じた合成値を基準軸方向別に算出する合成値算出手段を含み、
前記合成値算出手段で算出された前記基準軸方向別の合成値を用いて前記修正ベクトルを算出する、請求項１に記載の情報処理プログラム。
【請求項５】
前記修正ベクトル算出手段は、前記合成値算出手段で算出された前記基準軸方向別の合成値を、前記修正ベクトルの各基準軸方向の成分としてそれぞれ利用する、請求項４に記載の情報処理プログラム。
【請求項６】
前記作用力算出手段は、
前記注目ノードと前記接続ノードとの間のノード間距離が所定距離以上か否かを判定するノード間距離判定手段を含み、
前記ノード間距離が前記所定距離以上離れていると判定された場合に、前記所定の動作に応じて前記注目ノードと前記接続ノードとの間で生じる引力を算出する、請求項１に記載の情報処理プログラム。
【請求項７】
前記所定距離は、互いに接続されるノード対毎に予め個別に設定されている、請求項６に記載の情報処理プログラム。
【請求項８】
前記情報処理プログラムは、前記コンピュータを、
予め定められた複数のノード対毎に、当該ノード対のノード間距離と前記所定距離との差分を算出する差分算出手段と、
前記差分算出手段で算出された全てのノード対の前記差分の合計を算出する差分合計算出手段と、
前記差分合計算出手段で算出された前記全てのノード対の前記差分の合計が所定値を超えたか否かを判定する差分上限判定手段として、更に機能させ、
前記差分上限判定手段で、前記全てのノード対の前記差分の合計が前記所定値を超えたと判定される間は、前記作用力算出手段、前記最大最小算出手段、前記修正ベクトル算出手段および前記ノード制御手段の一連の処理を前記コンピュータに繰り返し実行させ、
前記表示制御手段は、前記一連の処理を繰り返した結果を反映した前記オブジェクトの画像を生成して前記表示装置に表示する、請求項６に記載の情報処理プログラム。
【請求項９】
前記差分上限判定手段で、前記全てのノード対の前記差分の合計が前記所定値を超えたと判定される間は、所定の回数を上限として、前記一連の処理を前記コンピュータに繰り返し実行させる、請求項８に記載の情報処理プログラム。
【請求項１０】
前記情報処理プログラムは、前記コンピュータを、
前記複数のノードのうち所定のノードを前記注目ノードとして設定し、当該注目ノードに接続された各ノードを前記接続ノードとして設定するノード設定手段として、更に機能させ、
前記情報処理プログラムは、前記ノード設定手段において設定される前記注目ノードを順次変更しながら、当該ノード設定手段、前記作用力算出手段、前記最大最少算出手段、前記修正ベクトル算出手段および前記ノード制御手段の一連の処理を前記コンピュータに繰り返し実行させ、
前記表示制御手段は、前記一連の処理を繰り返した結果を反映した前記オブジェクトの画像を生成して前記表示装置に表示する、請求項１に記載の情報処理プログラム。
【請求項１１】
前記オブジェクト動作手段は、前記複数のノードのうちの少なくとも一つのノードを動かすことにより、前記オブジェクトに対して所定の動作を行わせる、請求項１に記載の情報処理プログラム。
【請求項１２】
仮想空間内において、複数のノードが接続されることにより構成されるオブジェクトを表示装置に表示するための情報処理を行う情報処理装置であって、
前記オブジェクトに対して所定の動作を行わせるオブジェクト動作手段と、
前記所定の動作に応じて前記複数のノードのうちの所定のノード（以下、注目ノードと称す）と当該注目ノードに接続された各ノード（以下、接続ノードと称す）との間でそれぞれ生じる引力または斥力を算出する作用力算出手段と、
各基準軸方向ごとに、前記注目ノードと前記各接続ノードとの間で生じる引力または斥力の当該基準軸方向の成分についての最大値及び最小値を算出する最大最小算出手段と、
前記最大最小算出手段で算出された前記基準軸方向別の最大値及び最小値を用いて修正ベクトルを算出する修正ベクトル算出手段と、
前記修正ベクトル算出手段で算出された修正ベクトルに基づき前記注目ノードを制御するノード制御手段と、
前記ノード制御手段の制御結果を反映した前記オブジェクトの画像を生成して前記表示装置に表示する表示制御手段とを備える情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理プログラムおよび情報処理装置に関し、より特定的には、仮想空間内のオブジェクトの姿勢を制御する情報処理プログラムおよび情報処理装置に関する。
【背景技術】
【０００２】
特許文献１では、インバース・キネマティクス（ＩＫ）を用いてキャラクタのモーション制御を行っている。キャラクタの足がゲームフィールド面に接地している場合には、足を接地位置に固定して、膝等の関節の位置をインバース・キネマティクスにより求めている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平１１−３０６３８８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
インバース・キネマティクスでは、末端部分の位置（足、手等）を先に決め、その後、その末端部分の位置に応じて、親となる関節（膝、肘等）の位置や向きを決定する。しかし、インバース・キネマティクスを用いて決定されるキャラクタの姿勢がより自然になるようにするためには、関節の可動範囲等の様々なパラメータを予め多数用意した上で、複雑な計算処理を行う必要があった。
【０００５】
それ故に、本発明の目的は、複数のノードで構成されるオブジェクトの姿勢を、少ない計算量で、かつ自然な姿勢となるように制御することが可能な情報処理プログラムおよび情報処理装置を提供することである。
【課題を解決するための手段】
【０００６】
上記の目的を達成するために、本発明は以下の構成を採用した。
【０００７】
本発明の情報処理プログラムは、仮想空間内において、複数のノードが接続されることにより構成されるオブジェクトを表示装置に表示するための情報処理を行う情報処理装置のコンピュータにおいて実行される情報処理プログラムである。
上記情報処理プログラムは、上記コンピュータを、オブジェクト動作手段、作用力算出手段、最大最小算出手段、修正ベクトル算出手段、ノード制御手段および表示制御手段として機能させる。
上記オブジェクト動作手段は、上記オブジェクトに対して所定の動作を行わせる。
上記作用力算出手段は、上記所定の動作に応じて上記複数のノードのうちの所定のノード（以下、注目ノードと称す）と当該注目ノードに接続された各ノード（以下、接続ノードと称す）との間で生じる引力または斥力を算出する。
上記最大最小算出手段は、各基準軸方向ごとに、上記注目ノードと上記各接続ノードとの間で生じる引力または斥力の当該基準軸方向の成分についての最大値及び最小値を算出する。
上記修正ベクトル算出手段は、上記最大最小算出手段で算出された上記基準軸方向別の最大値及び最小値を用いて修正ベクトルを算出する。
ノード制御手段は、上記修正ベクトル算出手段で算出された修正ベクトルに基づき上記注目ノードを制御する。
上記表示制御手段は、上記ノード制御手段の制御結果を反映した上記オブジェクトの画像を生成して上記表示装置に表示する。
【０００８】
なお、上記修正ベクトル算出手段は、上記基準軸方向別に上記最大最小算出手段で算出された最大値及び最小値の合計値を基準軸方向別に算出する合計値算出手段を含み、上記合計値算出手段で算出された上記基準軸方向別の合計値を用いて上記修正ベクトルを算出してもよい。
【０００９】
また、上記修正ベクトル算出手段は、上記合計値算出手段で算出された上記基準軸方向別の合計値を、上記修正ベクトルの各基準軸方向の成分としてそれぞれ利用してもよい。
【００１０】
また、上記修正ベクトル算出手段は、上記基準軸方向別に上記最大最小算出手段で算出された最大値及び最小値の合計値に所定の係数を乗じた合成値を基準軸方向別に算出する合成値算出手段を含み、上記合成値算出手段で算出された上記基準軸方向別の合成値を用いて上記修正ベクトルを算出してもよい。
【００１１】
また、上記修正ベクトル算出手段は、上記合計値算出手段で算出された上記基準軸方向別の合成値を、上記修正ベクトルの各基準軸方向の成分としてそれぞれ利用してもよい。
【００１２】
また、上記作用力算出手段は、上記注目ノードと上記接続ノードとの間のノード間距離が所定距離以上か否かを判定するノード間距離判定手段を含み、上記ノード間距離が上記所定距離以上離れていると判定された場合に、上記所定の動作に応じて上記注目ノードと上記接続ノードとの間で生じる引力を算出してもよい。
【００１３】
また、上記所定距離は、互いに接続されるノード対毎に予め個別に設定されていてもよい。
【００１４】
また、上記情報処理プログラムは、上記コンピュータを、予め定められた複数のノード対毎に、当該ノード対のノード間距離と上記所定距離との差分を算出する差分算出手段と、上記差分算出手段で算出された全てのノード対の上記差分の合計を算出する差分合計算出手段と、上記差分合計算出手段で算出された上記全てのノード対の上記差分の合計が所定値を超えたか否かを判定する差分上限判定手段として、更に機能させ、上記差分上限判定手段で、上記全てのノード対の上記差分の合計が上記所定値を超えたと判定される間は、上記作用力算出手段、上記最大最小算出手段、上記修正ベクトル算出手段および上記ノード制御手段の一連の処理を上記コンピュータに繰り返し実行させ、上記表示制御手段は、上記一連の処理を繰り返した結果を反映した上記オブジェクトの画像を生成して上記表示装置に表示してもよい。
【００１５】
また、上記情報処理プログラムは、上記差分上限判定手段で、上記全てのノード対の上記差分の合計が上記所定値を超えたと判定される間は、所定の回数を上限として、上記一連の処理を上記コンピュータに繰り返し実行させてもよい。
【００１６】
また、上記情報処理プログラムは、上記コンピュータを、上記複数のノードのうち所定のノードを上記注目ノードとして設定し、当該注目ノードに接続された各ノードを上記接続ノードとして設定するノード設定手段として、更に機能させ、上記情報処理プログラムは、上記ノード設定手段において設定される上記注目ノードを順次変更しながら、当該ノード設定手段、上記作用力算出手段、上記最大最少算出手段、上記修正ベクトル算出手段および上記ノード制御手段の一連の処理を上記コンピュータに繰り返し実行させ、上記表示制御手段は、上記一連の処理を繰り返した結果を反映した上記オブジェクトの画像を生成して上記表示装置に表示してもよい。
【００１７】
また、上記オブジェクト動作手段は、上記複数のノードのうちの少なくとも一つのノードを動かすことにより、上記オブジェクトに対して所定の動作を行わせてもよい。
【００１８】
なお、上記情報処理プログラムは、コンピュータ読み取り可能な記憶媒体（例えば、フレキシブルディスク、ハードディスク、光ディスク、光磁気ディスク、ＣＤ−ＲＯＭ、ＣＤ−Ｒ、磁気テープ、不揮発性の半導体メモリカード、ＲＯＭなど）に格納されてもよい。
【００１９】
本発明の情報処理装置は、仮想空間内において、複数のノードが接続されることにより構成されるオブジェクトを表示装置に表示するための情報処理を行う情報処理装置であって、上記オブジェクトに対して所定の動作を行わせるオブジェクト動作手段と、上記所定の動作に応じて上記複数のノードのうちの所定のノード（以下、注目ノードと称す）と当該注目ノードに接続された各ノード（以下、接続ノードと称す）との間でそれぞれ生じる引力または斥力を算出する作用力算出手段と、各基準軸方向ごとに、上記注目ノードと上記各接続ノードとの間で生じる引力または斥力の当該基準軸方向の成分についての最大値及び最小値を算出する最大最小算出手段と、上記最大最小算出手段で算出された上記基準軸方向別の最大値及び最小値を用いて修正ベクトルを算出する修正ベクトル算出手段と、上記修正ベクトル算出手段で算出された修正ベクトルに基づき上記注目ノードを制御するノード制御手段と、上記ノード制御手段の制御結果を反映した上記オブジェクトの画像を生成して上記表示装置に表示する表示制御手段とを備える。
【発明の効果】
【００２０】
本発明によれば、複数のノードで構成されるオブジェクトの姿勢を、少ない計算量で、かつ自然な姿勢となるように制御することが可能となる。
【図面の簡単な説明】
【００２１】
【図１】ゲームシステムの外観図
【図２】ゲーム装置の機能ブロック図
【図３】入力装置の外観構成を示す斜視図
【図４】コントローラの外観構成を示す斜視図
【図５】コントローラの内部構造を示す図
【図６】コントローラの内部構造を示す図
【図７】入力装置の構成を示すブロック図
【図８】入力装置を用いてゲーム操作するときの状態を概説する図
【図９】テレビの画面に表示されるゲーム画像の一例
【図１０Ａ】入力装置を用いた操作方法の一例を示す図
【図１０Ｂ】入力装置を用いた操作方法の一例を示す図
【図１０Ｃ】入力装置を用いた操作方法の一例を示す図
【図１１Ａ】キャラクタオブジェクトの姿勢の一例を示す図
【図１１Ｂ】キャラクタオブジェクトの姿勢の一例を示す図
【図１１Ｃ】キャラクタオブジェクトの姿勢の一例を示す図
【図１２】キャラクタオブジェクトの姿勢の一例を示す図
【図１３】キャラクタオブジェクトの姿勢の一例を示す図
【図１４】キャラクタオブジェクトの外観を示す図
【図１５】キャラクタオブジェクトのノード構造を示す図
【図１６Ａ】キャラクタオブジェクトの姿勢の変化の様子を示す図
【図１６Ｂ】キャラクタオブジェクトの姿勢の変化の様子を示す図
【図１６Ｃ】キャラクタオブジェクトの姿勢の変化の様子を示す図
【図１７Ａ】キャラクタオブジェクトの姿勢の変化の様子を示す図
【図１７Ｂ】キャラクタオブジェクトの姿勢の変化の様子を示す図
【図１７Ｃ】キャラクタオブジェクトの姿勢の変化の様子を示す図
【図１８】基準姿勢（外観）の一例を示す図
【図１９】基準姿勢（ノード構造）の一例を示す図
【図２０】時間経過に応じて変化する基準姿勢の一例を示す図
【図２１】基準姿勢の他の例を示す図
【図２２】基準姿勢のさらに他の例を示す図
【図２３】メインノード間に設けられるバネを示す図
【図２４】基準姿勢の一例を示す図
【図２５Ａ】メインノードの制御方法を示す図
【図２５Ｂ】メインノードの制御方法を示す図
【図２６Ａ】メインノードの制御方法を示す図
【図２６Ｂ】メインノードの制御方法を示す図
【図２７】メインノードの制御方法を示す図
【図２８】基準姿勢の一例を示す図
【図２９Ａ】サブノードの制御方法を示す図
【図２９Ｂ】サブノードの制御方法を示す図
【図２９Ｃ】サブノードの制御方法を示す図
【図２９Ｄ】サブノードの制御方法を示す図
【図３０】外部メインメモリのメモリマップを示す図
【図３１】メインノードデータの詳細を示す図
【図３２】サブノードデータの詳細を示す図
【図３３】基準姿勢情報の詳細を示す図
【図３４】バネ情報の詳細を示す図
【図３５】ゲームプログラムに基づくメイン処理の流れを示すフローチャート
【図３６】姿勢制御処理の詳細を示すフローチャート
【図３７】メインノード処理の詳細を示すフローチャート
【図３８】バネ演算処理の詳細を示すフローチャート
【図３９】補正処理の詳細を示すフローチャート
【図４０】サブノード処理の詳細を示すフローチャート
【図４１】第２タイプサブノード処理の詳細を示すフローチャート
【図４２Ａ】仮想空間におけるノードＡの基準向きを示す図
【図４２Ｂ】バネがノードＡに及ぼすトルクを示す図
【図４３Ａ】キャラクタオブジェクトの状態の一例を示す図
【図４３Ｂ】補正処理による補正前のキャラクタオブジェクトの状態の一例を示す図
【図４３Ｃ】補正処理による補正後のキャラクタオブジェクトの状態の一例を示す図
【図４４Ａ】補正処理の原理を説明するための図
【図４４Ｂ】補正処理の原理を説明するための図
【図４５】補正処理の原理を説明するための図
【図４６Ａ】補正処理の原理を説明するための図
【図４６Ｂ】補正処理の原理を説明するための図
【図４７】第２タイプサブノードの制御方法を示す図
【図４８】第２タイプサブノードの制御方法を示す図
【発明を実施するための形態】
【００２２】
［ゲームシステムの全体構成］
図１を参照して、本発明の一実施形態に係るゲーム装置を含むゲームシステム１について説明する。図１は、ゲームシステム１の外観図である。以下、据置型のゲーム装置を一例にして、本実施形態のゲーム装置及びゲームプログラムについて説明する。図１において、ゲームシステム１は、テレビジョン受像器（以下、単に「テレビ」と記載する）２、ゲーム装置３、光ディスク４、入力装置８、及びマーカ部６を含む。本システムは、入力装置８を用いたゲーム操作に基づいてゲーム装置３でゲーム処理を実行するものである。
【００２３】
ゲーム装置３には、当該ゲーム装置３に対して交換可能に用いられる情報記憶媒体の一例である光ディスク４が脱着可能に挿入される。光ディスク４には、ゲーム装置３において実行されるためのゲームプログラムが記憶されている。ゲーム装置３の前面には光ディスク４の挿入口が設けられている。ゲーム装置３は、挿入口に挿入された光ディスク４に記憶されているゲームプログラムを読み出して実行することによってゲーム処理を実行する。
【００２４】
ゲーム装置３には、表示装置の一例であるテレビ２が接続コードを介して接続される。テレビ２は、ゲーム装置３において実行されるゲーム処理の結果得られるゲーム画像を表示する。また、テレビ２の画面の周辺（図１では画面の上側）には、マーカ部６が設置される。マーカ部６は、その両端に２つのマーカ６Ｒ及び６Ｌを備えている。マーカ６Ｒ（マーカ６Ｌも同様）は、具体的には１以上の赤外ＬＥＤであり、テレビ２の前方に向かって赤外光を出力する。マーカ部６はゲーム装置３に接続されており、ゲーム装置３はマーカ部６が備える各赤外ＬＥＤの点灯を制御することが可能である。
【００２５】
入力装置８は、自機に対して行われた操作の内容を示す操作データをゲーム装置３に与えるものである。本実施形態では、入力装置８はコントローラ５とジャイロセンサユニット７とを含む。詳細は後述するが、入力装置８は、コントローラ５に対してジャイロセンサユニット７が着脱可能に接続されている構成である。コントローラ５とゲーム装置３とは無線通信によって接続される。本実施形態では、コントローラ５とゲーム装置３との間の無線通信には例えばＢｌｕｅｔｏｏｔｈ（ブルートゥース）（登録商標）の技術が用いられる。なお、他の実施形態においてはコントローラ５とゲーム装置３とは有線で接続されてもよい。
【００２６】
［ゲーム装置３の内部構成］
次に、図２を参照して、ゲーム装置３の内部構成について説明する。図２は、ゲーム装置３の構成を示すブロック図である。ゲーム装置３は、ＣＰＵ１０、システムＬＳＩ１１、外部メインメモリ１２、ＲＯＭ／ＲＴＣ１３、ディスクドライブ１４、及びＡＶ−ＩＣ１５等を有する。
【００２７】
ＣＰＵ１０は、光ディスク４に記憶されたゲームプログラムを実行することによってゲーム処理を実行するものであり、ゲームプロセッサとして機能する。ＣＰＵ１０は、システムＬＳＩ１１に接続される。システムＬＳＩ１１には、ＣＰＵ１０の他、外部メインメモリ１２、ＲＯＭ／ＲＴＣ１３、ディスクドライブ１４及びＡＶ−ＩＣ１５が接続される。システムＬＳＩ１１は、それに接続される各構成要素間のデータ転送の制御、表示すべき画像の生成、外部装置からのデータの取得等の処理を行う。システムＬＳＩ１１の内部構成については後述する。揮発性の外部メインメモリ１２は、光ディスク４から読み出されたゲームプログラムや、フラッシュメモリ１７から読み出されたゲームプログラム等のプログラムを記憶したり、各種データを記憶したりするものであり、ＣＰＵ１０のワーク領域やバッファ領域として用いられる。ＲＯＭ／ＲＴＣ１３は、ゲーム装置３の起動用のプログラムが組み込まれるＲＯＭ（いわゆるブートＲＯＭ）と、時間をカウントするクロック回路（ＲＴＣ：Ｒｅａｌ  Ｔｉｍｅ  Ｃｌｏｃｋ）とを有する。ディスクドライブ１４は、光ディスク４からプログラムデータやテクスチャデータ等を読み出し、後述する内部メインメモリ１１ｅ又は外部メインメモリ１２に読み出したデータを書き込む。
【００２８】
また、システムＬＳＩ１１には、入出力プロセッサ（Ｉ／Ｏプロセッサ）１１ａ、ＧＰＵ（Ｇｒａｐｈｉｃｓ  Ｐｒｏｃｅｓｓｏｒ  Ｕｎｉｔ）１１ｂ、ＤＳＰ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒ）１１ｃ、ＶＲＡＭ１１ｄ、及び内部メインメモリ１１ｅが設けられる。図示は省略するが、これらの構成要素１１ａ〜１１ｅは内部バスによって互いに接続される。
【００２９】
ＧＰＵ１１ｂは、描画手段の一部を形成し、ＣＰＵ１０からのグラフィクスコマンド（作画命令）に従って画像を生成する。ＶＲＡＭ１１ｄは、ＧＰＵ１１ｂがグラフィクスコマンドを実行するために必要なデータ（ポリゴンデータやテクスチャデータ等のデータ）を記憶する。画像が生成される際には、ＧＰＵ１１ｂは、ＶＲＡＭ１１ｄに記憶されたデータを用いて画像データを作成する。
【００３０】
ＤＳＰ１１ｃは、オーディオプロセッサとして機能し、内部メインメモリ１１ｅや外部メインメモリ１２に記憶されるサウンドデータや音波形（音色）データを用いて、音声データを生成する。
【００３１】
上述のように生成された画像データ及び音声データは、ＡＶ−ＩＣ１５によって読み出される。ＡＶ−ＩＣ１５は、読み出した画像データをＡＶコネクタ１６を介してテレビ２に出力するとともに、読み出した音声データを、テレビ２に内蔵されるスピーカ２ａに出力する。これによって、画像がテレビ２に表示されるとともに音がスピーカ２ａから出力される。
【００３２】
入出力プロセッサ１１ａは、それに接続される構成要素との間でデータの送受信を実行したり、外部装置からのデータのダウンロードを実行したりする。入出力プロセッサ１１ａは、フラッシュメモリ１７、無線通信モジュール１８、無線コントローラモジュール１９、拡張コネクタ２０、及びメモリカード用コネクタ２１に接続される。無線通信モジュール１８にはアンテナ２２が接続され、無線コントローラモジュール１９にはアンテナ２３が接続される。
【００３３】
入出力プロセッサ１１ａは、無線通信モジュール１８及びアンテナ２２を介してネットワークに接続し、ネットワークに接続される他のゲーム装置や各種サーバと通信することができる。入出力プロセッサ１１ａは、定期的にフラッシュメモリ１７にアクセスし、ネットワークへ送信する必要があるデータの有無を検出し、当該データが有る場合には、無線通信モジュール１８及びアンテナ２２を介してネットワークに送信する。また、入出力プロセッサ１１ａは、他のゲーム装置から送信されてくるデータやダウンロードサーバからダウンロードしたデータを、ネットワーク、アンテナ２２及び無線通信モジュール１８を介して受信し、受信したデータをフラッシュメモリ１７に記憶する。ＣＰＵ１０はゲームプログラムを実行することにより、フラッシュメモリ１７に記憶されたデータを読み出してゲームプログラムで利用する。フラッシュメモリ１７には、ゲーム装置３と他のゲーム装置や各種サーバとの間で送受信されるデータの他、ゲーム装置３を利用してプレイしたゲームのセーブデータ（ゲームの結果データ又は途中データ）が記憶されてもよい。
【００３４】
また、入出力プロセッサ１１ａは、コントローラ５から送信される操作データをアンテナ２３及び無線コントローラモジュール１９を介して受信し、内部メインメモリ１１ｅ又は外部メインメモリ１２のバッファ領域に記憶（一時記憶）する。
【００３５】
さらに、入出力プロセッサ１１ａには、拡張コネクタ２０及びメモリカード用コネクタ２１が接続される。拡張コネクタ２０は、ＵＳＢやＳＣＳＩのようなインターフェースのためのコネクタであり、外部記憶媒体のようなメディアを接続したり、他のコントローラのような周辺機器を接続したり、有線の通信用コネクタを接続することによって無線通信モジュール１８に替えてネットワークとの通信を行ったりすることができる。メモリカード用コネクタ２１は、メモリカードのような外部記憶媒体を接続するためのコネクタである。例えば、入出力プロセッサ１１ａは、拡張コネクタ２０やメモリカード用コネクタ２１を介して外部記憶媒体にアクセスし、外部記憶媒体にデータを保存したり、外部記憶媒体からデータを読み出したりすることができる。
【００３６】
ゲーム装置３には、電源ボタン２４、リセットボタン２５、及びイジェクトボタン２６が設けられる。電源ボタン２４及びリセットボタン２５は、システムＬＳＩ１１に接続される。電源ボタン２４がオンされると、ゲーム装置３の各構成要素に対して、図示しないＡＣアダプタを経て電源が供給される。リセットボタン２５が押されると、システムＬＳＩ１１は、ゲーム装置３の起動プログラムを再起動する。イジェクトボタン２６は、ディスクドライブ１４に接続される。イジェクトボタン２６が押されると、ディスクドライブ１４から光ディスク４が排出される。
【００３７】
［入力装置８の構成］
次に、図３〜図６を参照して、入力装置８について説明する。図３は、入力装置８の外観構成を示す斜視図である。図４は、コントローラ５の外観構成を示す斜視図である。図３は、コントローラ５の上側後方から見た斜視図であり、図４は、コントローラ５を下側前方から見た斜視図である。
【００３８】
図３及び図４において、コントローラ５は、例えばプラスチック成型によって形成されたハウジング３１を有している。ハウジング３１は、その前後方向（図３に示すＺ軸方向）を長手方向とした略直方体形状を有しており、全体として大人や子供の片手で把持可能な大きさである。プレイヤは、コントローラ５に設けられたボタンを押下すること、及び、コントローラ５自体を動かしてその位置や姿勢を変えることによってゲーム操作を行うことができる。
【００３９】
ハウジング３１には、複数の操作ボタンが設けられる。図３に示すように、ハウジング３１の上面には、十字ボタン３２ａ、１番ボタン３２ｂ、２番ボタン３２ｃ、Ａボタン３２ｄ、マイナスボタン３２ｅ、ホームボタン３２ｆ、プラスボタン３２ｇ、及び電源ボタン３２ｈが設けられる。一方、図４に示すように、ハウジング３１の下面には凹部が形成されており、当該凹部の後面側傾斜面にはＢボタン３２ｉが設けられる。これらの各操作ボタン３２ａ〜３２ｉには、ゲーム装置３が実行するゲームプログラムに応じた機能が適宜割り当てられる。また、電源ボタン３２ｈは遠隔からゲーム装置３本体の電源をオン／オフするためのものである。ホームボタン３２ｆ及び電源ボタン３２ｈは、その上面がハウジング３１の上面に埋没している。これによって、プレイヤがホームボタン３２ｆ又は電源ボタン３２ｈを誤って押下することを防止することができる。
【００４０】
ハウジング３１の後面にはコネクタ３３が設けられている。コネクタ３３は、コントローラ５に他の機器（例えば、ジャイロセンサユニット７や他のコントローラ）を接続するために利用される。また、ハウジング３１の後面におけるコネクタ３３の両側には、上記他の機器が容易に離脱することを防止するために係止穴３３ａが設けられている。
【００４１】
ハウジング３１上面の後方には複数（図３では４つ）のＬＥＤ３４ａ〜３４ｄが設けられる。ここで、コントローラ５には、他のメインコントローラと区別するためにコントローラ種別（番号）が付与される。各ＬＥＤ３４ａ〜３４ｄは、コントローラ５に現在設定されている上記コントローラ種別をプレイヤに通知したり、コントローラ５の電池残量をプレイヤに通知したりする等の目的で用いられる。具体的には、コントローラ５を用いてゲーム操作が行われる際、上記コントローラ種別に応じて複数のＬＥＤ３４ａ〜３４ｄのいずれか１つが点灯する。
【００４２】
また、コントローラ５は撮像情報演算部３５（図７）を有しており、図４に示すように、ハウジング３１前面には撮像情報演算部３５の光入射面３５ａが設けられる。光入射面３５ａは、マーカ６Ｒ及び６Ｌからの赤外光を少なくとも透過する材質で構成される。
【００４３】
ハウジング３１上面における１番ボタン３２ｂとホームボタン３２ｆとの間には、コントローラ５に内蔵されるスピーカ４９（図５）からの音を外部に放出するための音抜き孔３１ａが形成されている。
【００４４】
次に、図５及び図６を参照して、コントローラ５の内部構造について説明する。図５及び図６は、コントローラ５の内部構造を示す図である。なお、図５は、コントローラ５の上筐体（ハウジング３１の一部）を外した状態を示す斜視図である。図６は、コントローラ５の下筐体（ハウジング３１の一部）を外した状態を示す斜視図である。図６に示す斜視図は、図５に示す基板３０を裏面から見た斜視図となっている。
【００４５】
図５において、ハウジング３１の内部には基板３０が固設されており、当該基板３０の上主面上に各操作ボタン３２ａ〜３２ｈ、各ＬＥＤ３４ａ〜３４ｄ、加速度センサ３７、アンテナ４５、及びスピーカ４９等が設けられる。これらは、基板３０等に形成された配線（図示せず）によってマイクロコンピュータ（Ｍｉｃｒｏ  Ｃｏｍｐｕｔｅｒ：マイコン）４２（図６参照）に接続される。本実施形態では、加速度センサ３７は、Ｘ軸方向に関してコントローラ５の中心からずれた位置に配置されている。これによって、コントローラ５をＺ軸回りに回転させたときのコントローラ５の動きが算出しやすくなる。また、加速度センサ３７は、長手方向（Ｚ軸方向）に関してコントローラ５の中心よりも前方に配置されている。また、無線モジュール４４（図７）及びアンテナ４５によって、コントローラ５がワイヤレスコントローラとして機能する。
【００４６】
一方、図６において、基板３０の下主面上の前端縁に撮像情報演算部３５が設けられる。撮像情報演算部３５は、コントローラ５の前方から順に赤外線フィルタ３８、レンズ３９、撮像素子４０、及び画像処理回路４１を備えている。これらの部材３８〜４１はそれぞれ基板３０の下主面に取り付けられる。
【００４７】
さらに、基板３０の下主面上には、上記マイコン４２及びバイブレータ４８が設けられている。バイブレータ４８は、例えば振動モータやソレノイドであり、基板３０等に形成された配線によってマイコン４２と接続される。マイコン４２の指示によりバイブレータ４８が作動することによってコントローラ５に振動が発生する。これによって、コントローラ５を把持しているプレイヤの手にその振動が伝達される、いわゆる振動対応ゲームを実現することができる。本実施形態では、バイブレータ４８は、ハウジング３１のやや前方寄りに配置される。つまり、バイブレータ４８がコントローラ５の中心よりも端側に配置することによって、バイブレータ４８の振動によりコントローラ５全体を大きく振動させることができる。また、コネクタ３３は、基板３０の下主面上の後端縁に取り付けられる。なお、図５及び図６に示す他、コントローラ５は、マイコン４２の基本クロックを生成する水晶振動子、スピーカ４９に音声信号を出力するアンプ等を備えている。
【００４８】
また、ジャイロセンサユニット７は、３軸回りの角速度を検知するジャイロセンサ（図７に示すジャイロセンサ５５及び５６）を有する。ジャイロセンサユニット７は、コントローラ５のコネクタ３３に着脱可能に装着される。ジャイロセンサユニット７の前端（図３に示すＺ軸正方向側の端部）には、コネクタ３３に接続可能なプラグ（図７に示すプラグ５３）が設けられる。さらに、プラグ５３の両側にはフック（図示せず）が設けられる。ジャイロセンサユニット７がコントローラ５に対して装着される状態では、プラグ５３がコネクタ３３に接続されるとともに、上記フックがコントローラ５の係止穴３３ａに係止する。これによって、コントローラ５とジャイロセンサユニット７とがしっかりと固定される。また、ジャイロセンサユニット７は側面（図３に示すＸ軸方向の面）にボタン５１を有している。ボタン５１は、それを押下すれば上記フックの係止穴３３ａに対する係止状態を解除することができるように構成されている。したがって、ボタン５１を押下しながらプラグ５３をコネクタ３３から抜くことによって、ジャイロセンサユニット７をコントローラ５から離脱することができる。
【００４９】
また、ジャイロセンサユニット７の後端には、上記コネクタ３３と同形状のコネクタが設けられる。したがって、コントローラ５（のコネクタ３３）に対して装着可能な他の機器は、ジャイロセンサユニット７のコネクタに対しても装着可能である。なお、図３においては、当該コネクタに対してカバー５２が着脱可能に装着されている。
【００５０】
なお、図３〜図６に示したコントローラ５及びジャイロセンサユニット７の形状や、各操作ボタンの形状、加速度センサやバイブレータの数及び設置位置等は単なる一例に過ぎず、他の形状、数、及び設置位置であってもよい。また、本実施形態では、撮像手段による撮像方向はＺ軸正方向であるが、撮像方向はいずれの方向であってもよい。すなわち、コントローラ５における撮像情報演算部３５の位置（撮像情報演算部３５の光入射面３５ａ）は、ハウジング３１の前面でなくてもよく、ハウジング３１の外部から光を取り入れることができれば他の面に設けられてもかまわない。
【００５１】
図７は、入力装置８（コントローラ５及びジャイロセンサユニット７）の構成を示すブロック図である。コントローラ５は、操作部３２（各操作ボタン３２ａ〜３２ｉ）、コネクタ３３、撮像情報演算部３５、通信部３６、及び加速度センサ３７を備えている。コントローラ５は、自機に対して行われた操作内容を示すデータを操作データとしてゲーム装置３へ送信するものである。
【００５２】
操作部３２は、上述した各操作ボタン３２ａ〜３２ｉを含み、各操作ボタン３２ａ〜３２ｉに対する入力状態（各操作ボタン３２ａ〜３２ｉが押下されたか否か）を示す操作ボタンデータを通信部３６のマイコン４２へ出力する。
【００５３】
撮像情報演算部３５は、撮像手段が撮像した画像データを解析してその中で輝度が高い領域を判別してその領域の重心位置やサイズなどを算出するためのシステムである。撮像情報演算部３５は、例えば最大２００フレーム／秒程度のサンプリング周期を有するので、比較的高速なコントローラ５の動きでも追跡して解析することができる。
【００５４】
撮像情報演算部３５は、赤外線フィルタ３８、レンズ３９、撮像素子４０、及び画像処理回路４１を含んでいる。赤外線フィルタ３８は、コントローラ５の前方から入射する光から赤外線のみを通過させる。レンズ３９は、赤外線フィルタ３８を透過した赤外線を集光して撮像素子４０へ入射させる。撮像素子４０は、例えばＣＭＯＳセンサやあるいはＣＣＤセンサのような固体撮像素子であり、レンズ３９が集光した赤外線を受光して画像信号を出力する。ここで、テレビ２の表示画面近傍に配置されるマーカ部６のマーカ６Ｒ及び６Ｌは、テレビ２の前方に向かって赤外光を出力する赤外ＬＥＤで構成される。したがって、赤外線フィルタ３８を設けることによって、撮像素子４０は、赤外線フィルタ３８を通過した赤外線だけを受光して画像データを生成するので、マーカ６Ｒ及び６Ｌの画像をより正確に撮像することができる。以下では、撮像素子４０によって撮像された画像を撮像画像と呼ぶ。撮像素子４０によって生成された画像データは、画像処理回路４１で処理される。画像処理回路４１は、撮像画像内における撮像対象（マーカ６Ｒ及び６Ｌ）の位置を算出する。画像処理回路４１は、算出された位置を示す座標を通信部３６のマイコン４２へ出力する。この座標のデータは、マイコン４２によって操作データとしてゲーム装置３に送信される。以下では、上記座標を「マーカ座標」と呼ぶ。マーカ座標はコントローラ５自体の向き（傾斜角度）や位置に対応して変化するので、ゲーム装置３はこのマーカ座標を用いてコントローラ５の向きや位置を算出することができる。
【００５５】
なお、他の実施形態においては、コントローラ５は画像処理回路４１を備えていない構成であってもよく、撮像画像自体がコントローラ５からゲーム装置３へ送信されてもよい。このとき、ゲーム装置３は、画像処理回路４１と同様の機能を有する回路あるいはプログラムを有しており、上記マーカ座標を算出するようにしてもよい。
【００５６】
加速度センサ３７は、コントローラ５の加速度（重力加速度を含む）を検出する、すなわち、コントローラ５に加わる力（重力を含む）を検出する。加速度センサ３７は、当該加速度センサ３７の検出部に加わっている加速度のうち、センシング軸方向に沿った直線方向の加速度（直線加速度）の値を検出する。例えば、２軸以上の多軸加速度センサの場合には、加速度センサの検出部に加わっている加速度として、各軸に沿った成分の加速度をそれぞれ検出する。例えば、３軸又は２軸の加速度センサは、アナログ・デバイセズ株式会社（Ａｎａｌｏｇ  Ｄｅｖｉｃｅｓ，  Ｉｎｃ．）又はＳＴマイクロエレクトロニクス社（ＳＴＭｉｃｒｏｅｌｅｃｔｒｏｎｉｃｓ  Ｎ．Ｖ．）から入手可能である種類のものでもよい。なお、加速度センサ３７は、例えば静電容量式の加速度センサであるとするが、他の方式の加速度センサを用いるようにしてもよい。
【００５７】
本実施形態では、加速度センサ３７は、コントローラ５を基準とした上下方向（図３に示すＹ軸方向）、左右方向（図３に示すＸ軸方向）及び前後方向（図３に示すＺ軸方向）の３軸方向に関してそれぞれ直線加速度を検出する。加速度センサ３７は、各軸に沿った直線方向に関する加速度を検出するものであるため、加速度センサ３７からの出力は３軸それぞれの直線加速度の値を表すものとなる。すなわち、検出された加速度は、入力装置８（コントローラ５）を基準に設定されるＸＹＺ座標系（コントローラ座標系）における３次元のベクトル（ａｘ，ａｙ，ａｚ）として表される。以下では、加速度センサ３７によって検出される３軸に関する各加速度値を各成分とするベクトルを加速度ベクトルと呼ぶ。
【００５８】
加速度センサ３７が検出した加速度を示すデータ（加速度データ）は、通信部３６へ出力される。なお、加速度センサ３７が検出した加速度は、コントローラ５自体の向き（傾斜角度）や動きに対応して変化するので、ゲーム装置３は加速度データを用いてコントローラ５の向きや動きを算出することができる。本実施形態では、ゲーム装置３は、加速度データ及び後述する角速度データに基づいて入力装置８（コントローラ５）の姿勢を判断する。入力装置８の姿勢は、例えば、入力装置８が存在する空間の所定位置を基準としたｘｙｚ座標系の座標値によって表される。ここでは、図１に示されるように、ｘｙｚ座標系は、入力装置８がマーカ部６の正面に位置することを前提とし、入力装置８の位置からマーカ部６を向く方向をｚ軸正方向とし、鉛直上向き（重力方向の逆方向）をｙ軸正方向とし、入力装置８の位置からマーカ部６を見た場合の左方向をｘ軸正方向とした座標系であるとする。また、ここでは、入力装置８（コントローラ５）を基準としたＸ軸、Ｙ軸、Ｚ軸が、それぞれｘ軸、ｙ軸、ｚ軸の向きと一致するときの入力装置８の姿勢を基準姿勢と呼ぶことにする。入力装置８の姿勢は、基準姿勢からＺ軸方向を基準としてロール方向（Ｚ軸周り）、ピッチ方向（Ｘ軸周り）、ヨー方向（Ｙ軸周り）にそれぞれ入力装置８を回転させた場合のｘｙｚ座標系における姿勢である。当該姿勢は、後述する回転行列Ｍによって表現される。
【００５９】
加速度センサ３７が検出した加速度（加速度ベクトル）を示すデータ（加速度データ）は、通信部３６へ出力される。
【００６０】
なお、加速度センサ３７から出力される加速度の信号に基づいて、ゲーム装置３のプロセッサ（例えばＣＰＵ１０）又はコントローラ５のプロセッサ（例えばマイコン４２）等のコンピュータが処理を行うことによって、コントローラ５に関するさらなる情報を推測又は算出（判定）することができることは、当業者であれば本明細書の説明から容易に理解できるであろう。例えば、加速度センサ３７を搭載するコントローラ５が静止状態であることを前提としてコンピュータ側の処理が実行される場合（すなわち、加速度センサによって検出される加速度が重力加速度のみであるとして処理が実行される場合）、コントローラ５が現実に静止状態であれば、検出された加速度に基づいてコントローラ５の姿勢が重力方向に対して傾いているか否か又はどの程度傾いているかを知ることができる。具体的には、加速度センサ３７の検出軸が鉛直下方向を向いている状態を基準としたとき、１Ｇ（重力加速度）がかかっているか否かによって、コントローラ５が基準に対して傾いているか否かを知ることができるし、その大きさによって基準に対してどの程度傾いているかも知ることができる。また、多軸の加速度センサ３７の場合には、さらに各軸の加速度の信号に対して処理を施すことによって、重力方向に対してコントローラ５がどの程度傾いているかをより詳細に知ることができる。この場合において、プロセッサは、加速度センサ３７からの出力に基づいてコントローラ５の傾斜角度を算出してもよいし、当該傾斜角度を算出せずに、コントローラ５の傾斜方向を算出するようにしてもよい。このように、加速度センサ３７をプロセッサと組み合わせて用いることによって、コントローラ５の傾斜角度又は姿勢を判定することができる。
【００６１】
一方、コントローラ５が動的な状態（コントローラ５が動かされている状態）であることを前提とする場合には、加速度センサ３７は重力加速度に加えてコントローラ５の動きに応じた加速度を検出するので、検出された加速度から重力加速度の成分を所定の処理により除去することによってコントローラ５の動き方向を知ることができる。また、コントローラ５が動的な状態であることを前提とする場合であっても、検出された加速度から、加速度センサの動きに応じた加速度の成分を所定の処理により除去することによって、重力方向に対するコントローラ５の傾きを知ることが可能である。なお、他の実施例では、加速度センサ３７は、内蔵の加速度検出手段で検出された加速度信号をマイコン４２に出力する前に当該加速度信号に対して所定の処理を行うための、組込み式の処理装置又は他の種類の専用の処理装置を備えていてもよい。組込み式又は専用の処理装置は、例えば、加速度センサ３７が静的な加速度（例えば、重力加速度）を検出するために用いられる場合、加速度信号を傾斜角（あるいは、他の好ましいパラメータ）に変換するものであってもよい。
【００６２】
通信部３６は、マイコン４２、メモリ４３、無線モジュール４４、及びアンテナ４５を含んでいる。マイコン４２は、処理を行う際にメモリ４３を記憶領域として用いながら、マイコン４２が取得したデータをゲーム装置３へ無線送信する無線モジュール４４を制御する。また、マイコン４２はコネクタ３３に接続されている。ジャイロセンサユニット７から送信されてくるデータは、コネクタ３３を介してマイコン４２に入力される。以下、ジャイロセンサユニット７の構成について説明する。
【００６３】
ジャイロセンサユニット７は、プラグ５３、マイコン５４、２軸ジャイロセンサ５５、及び１軸ジャイロセンサ５６を備えている。上述のように、ジャイロセンサユニット７は、３軸（本実施形態では、ＸＹＺ軸）周りの角速度を検出し、検出した角速度を示すデータ（角速度データ）をコントローラ５へ送信する。
【００６４】
２軸ジャイロセンサ５５は、Ｘ軸周りの角速度及びＹ軸周りの（単位時間あたりの）角速度を検出する。また、１軸ジャイロセンサ５６は、Ｚ軸周りの（単位時間あたりの）角速度を検出する。なお、本明細書では、コントローラ５の撮像方向（Ｚ軸正方向）を基準として、Ｚ軸周り、Ｘ軸周り、Ｙ軸周りの回転方向を、それぞれ、ロール方向、ピッチ方向、ヨー方向と呼ぶ。すなわち、２軸ジャイロセンサ５５は、ピッチ方向（Ｘ軸周りの回転方向）及びヨー方向（Ｙ軸周りの回転方向）の角速度を検出し、１軸ジャイロセンサ５６は、ロール方向（Ｚ軸周りの回転方向）の角速度を検出する。
【００６５】
なお、本実施形態では、３軸回りの角速度を検出するために、２軸ジャイロセンサ５５と１軸ジャイロセンサ５６とを用いる構成としたが、他の実施形態においては、３軸回りの角速度を検出することができればよく、用いるジャイロセンサの数及び組み合わせはどのようなものであってもよい。
【００６６】
また、本実施形態では、各ジャイロセンサ５５及び５６が角速度を検出する３つの軸は、加速度センサ３７が加速度を検出する３つの軸（ＸＹＺ軸）と一致するように設定される。ただし、他の実施形態においては、各ジャイロセンサ５５及び５６が角速度を検出する３つの軸と、加速度センサ３７が加速度を検出する３つの軸とは一致しなくてもよい。
【００６７】
ジャイロセンサ５５及び５６で検出された角速度を示すデータは、マイコン５４に出力される。したがって、マイコン５４には、ＸＹＺ軸の３軸回りの角度速度を示すデータが入力されることになる。マイコン５４は、上記３軸回りの角速度を示すデータを角速度データとしてプラグ５３を介してコントローラ５へ送信する。なお、マイコン５４からコントローラ５への送信は所定の周期毎に逐次行われるが、ゲームの処理は１／６０秒を単位として（１フレーム時間として）行われることが一般的であるので、この時間以下の周期で送信を行うことが好ましい。
【００６８】
コントローラ５の説明に戻り、操作部３２、撮像情報演算部３５、及び加速度センサ３７からマイコン４２へ出力されたデータ、ならびに、ジャイロセンサユニット７からマイコン４２へ送信されてきたデータは、一時的にメモリ４３に格納される。これらのデータは、上記操作データとしてゲーム装置３へ送信される。すなわち、マイコン４２は、ゲーム装置３の無線コントローラモジュール１９への送信タイミングが到来すると、メモリ４３に格納されている操作データを無線モジュール４４へ出力する。無線モジュール４４は、例えばＢｌｕｅｔｏｏｔｈ（ブルートゥース）（登録商標）の技術を用いて、所定周波数の搬送波を操作データで変調し、その微弱電波信号をアンテナ４５から放射する。つまり、操作データは、無線モジュール４４で微弱電波信号に変調されてコントローラ５から送信される。微弱電波信号はゲーム装置３側の無線コントローラモジュール１９で受信される。受信された微弱電波信号について復調や復号を行うことによって、ゲーム装置３は操作データを取得することができる。そして、ゲーム装置３のＣＰＵ１０は、取得した操作データとゲームプログラムとに基づいて、ゲーム処理を行う。なお、通信部３６から無線コントローラモジュール１９への無線送信は所定の周期毎に逐次行われるが、ゲームの処理は１／６０秒を単位として（１フレーム時間として）行われることが一般的であるので、この時間以下の周期で送信を行うことが好ましい。コントローラ５の通信部３６は、例えば１／２００秒に１回の割合で各操作データをゲーム装置３の無線コントローラモジュール１９へ出力する。
【００６９】
上記コントローラ５を用いることによって、プレイヤは、各操作ボタンを押下する従来の一般的なゲーム操作に加えて、コントローラ５を任意の傾斜角度に傾ける操作を行うことができる。その他、上記コントローラ５によれば、プレイヤは、コントローラ５によって画面上の任意の位置を指示する操作、及び、コントローラ５自体を動かす操作を行うこともできる。
【００７０】
［ゲーム処理の概要］
次に、図８〜図１０Ｃを参照して、上記ゲームシステム１において実行されるゲームの概要について説明する。
【００７１】
本実施形態において実行されるゲームでは、プレイヤによる操作に応じて、仮想空間に配置されたキャラクタオブジェクトが水上オートバイを操縦する。プレイヤは、図８に示されるように入力装置８を両手で把持し、当該入力装置８を左右に傾けることによって、水上オートバイの進行方向を制御することができる。図９は、ゲームの実行中にテレビ２の画面に表示されるゲーム画像の一例を示している。テレビ２の画面には、仮想空間に配置された仮想カメラから見たキャラクタオブジェクトの姿が表示される。
【００７２】
図１０Ａ〜図１０Ｃは、入力装置８を両手で把持しているプレイヤ側から当該入力装置８を水平方向に見た場合の入力装置８の様子を示している。本実施形態では、水上オートバイの進行方向は、一例として、入力装置８のロール方向に関する姿勢に応じて決定される。例えば、図１０Ａのように、入力装置８の長手方向が水平になっている場合には、水上オートバイは直進する。そして、図１０Ｂのように、入力装置８の前端（撮像情報演算部３５が設けられている端部）が後端（ジャイロセンサユニット７が設けられている端部）よりも上方になっている場合には、水上オートバイは右旋回する。そして、図１０Ｃのように、入力装置８の前端が後端よりも下方になっている場合には、水上オートバイは左旋回する。なお、前述のように、入力装置８の姿勢は、ジャイロセンサユニット７から出力される角速度データ、もしくは加速度センサ３７から出力される加速度データに基づいて計算することもできる。さらには、ジャイロセンサユニット７から出力される角速度データと加速度センサ３７から出力される加速度データの両方を考慮して入力装置８の姿勢を計算することもできる。
【００７３】
仮想空間におけるキャラクタオブジェクトの姿勢は、ゲーム状況に応じて様々に変化する。
【００７４】
例えば、入力装置８のロール方向の姿勢に応じてキャラクタオブジェクトの腰の位置を変化させてもよい。図１１Ａは、入力装置８が図１０Ａの状態のときのキャラクタオブジェクトの姿勢を示している。図１１Ｂは、入力装置８が図１０Ｂの状態のときのキャラクタオブジェクトの姿勢を示している。図１１Ｃは、入力装置８が図１０Ｃの状態のときのキャラクタオブジェクトの姿勢を示している。図１１Ａ〜図１１Ｃにおいて、キャラクタオブジェクトの両足の位置と両手の位置は水上オートバイに対して固定されているが、キャラクタオブジェクト腰の位置は入力装置８の姿勢に応じて移動している。
【００７５】
他の例として、キャラクタオブジェクトの両手の位置を、水上オートバイのハンドルの長さに応じて変化させてもよい。例えば、図１２の例では、図１１Ａの水上オートバイと比較してハンドルが長いので、それに応じてキャラクタオブジェクトの両手の距離も広がっている。
【００７６】
さらに他の例として、キャラクタオブジェクトの左手の位置を、水上オートバイのハンドル以外のオブジェクトに固定してもよい。例えば、図１３の例では、キャラクタオブジェクトの位置が、水面に飛び出した柱に固定されている。
【００７７】
本実施形態では、上記のようなキャラクタオブジェクトの姿勢制御を、少ない計算量で、かつ自然な姿勢となるように制御する。以下、本実施形態におけるキャラクタオブジェクトの姿勢制御の概要を説明する。
【００７８】
［キャラクタオブジェクトの構造］
本実施形態では、キャラクタオブジェクトは複数のノードで構成される関節構造体として定義されている。ここで、「ノード」とは、関節のみを指すものではなく、末端をも指すものとする。
【００７９】
図１４は、キャラクタオブジェクトの外観を示しており、図１５は、図１４に示したキャラクタオブジェクトに対応するノード構造を示している。図１４において、白丸および黒丸は、キャラクタオブジェクトを構成するノードを表しており、ノード間を結ぶ矢印は、ノードの階層構造を表している。矢印の始点に位置するノードは、矢印の終点に位置するノードに対して上位のノードであり、本明細書では、矢印の始点に位置するノードのことを、矢印の終点に位置するノードの「親」（もしくは「親ノード」）と称す。逆に、矢印の終点に位置するノードのことを、矢印の始点に位置するノードの「子」（もしくは「子ノード」）と称す。
【００８０】
本実施形態では、キャラクタオブジェクトを構成する複数のノードを、メインノードとサブノードに分類して、それぞれ異なる方法によって、まずメインノードの位置及び向きを決定した後で、サブノードの位置及び向きを決定する。本実施形態では、一例として、図１５に黒丸で示しているキャラクタオブジェクトの右手ノード、首ノード、左手ノード、胸ノード、腰ノード、右足ノード、左足ノードの７つのノードをメインノードとして扱い、白丸で示している残りのノード（左指ノード、左肘ノード、左肩ノード、左足付け根ノード、左膝ノードなど）を「サブノード」として扱う。なお、本実施形態では胸ノードの位置と腰ノードの位置は同一位置に定義されているため、図１５においてはこれらの胸ノードと腰ノードが重なって表示されている。
【００８１】
図１６Ａ〜図１６Ｃは、キャラクタオブジェクトの右手ノードの向きを変化させたときのキャラクタオブジェクトの姿勢の変化の様子を示している。図１６Ａ〜図１６Ｃにおける各矢印は、右手ノードのローカル座標のｘ軸，ｙ軸，ｚ軸の向きをそれぞれ示している。右手ノードの向き（すなわち、仮想空間における右手ノードのローカル座標のｘ軸，ｙ軸，ｚ軸の向き）が変化すると、キャラクタオブジェクトの右手（すなわちキャラクタオブジェクトの右手首から先の部分）の姿勢が変化する。また、図１７Ａ〜図１７Ｃは、キャラクタオブジェクトの胸ノードの向きを変化させたときのキャラクタオブジェクトの姿勢の変化の様子を示している。図１７Ａ〜図１７Ｃにおける各矢印は、胸ノードのローカル座標のｘ軸，ｙ軸，ｚ軸の向きをそれぞれ示している。胸ノードの向き（すなわち、仮想空間における胸ノードのローカル座標のｘ軸，ｙ軸，ｚ軸の向き）が変化すると、キャラクタオブジェクトの上半身（すなわちキャラクタオブジェクトの腰から上の部分）の姿勢が変化する。すなわち、あるノードの位置や向きが変化すると、通常、そのノードの下位の階層に位置するノードの位置や向きにも影響が及ぶ。
【００８２】
ところで、図１１Ａ〜図１１Ｃに示したように、キャラクタオブジェクトの両足と両手を水上オートバイの特定位置に固定した状態で、入力装置８の姿勢に応じてキャラクタオブジェクトの腰の位置を変化させたい場合、本実施形態では、まず、キャラクタオブジェクトの左足ノードの位置と向き、右足ノードの位置と向き、左手ノードの位置と向き、右足ノードの位置と向きを、それぞれ所定の値に設定するとともに、腰ノードの位置に、入力装置８の姿勢に応じた値を設定する。そして、これらの値と、予め用意された「基準姿勢」とに基づいて、残りのノードの位置と向きを決定する。以下、「基準姿勢」について説明する。
【００８３】
［基準姿勢］
図１８は、図１１Ａ〜図１３のようなキャラクタオブジェクトの姿勢制御を行うときに用いられる「基準姿勢」の一例である。「基準姿勢」は、具体的には、図１９に示すような複数のノード（図１５に示した複数のノードにそれぞれ対応）の位置と向きによって定義されている。本実施形態では、詳細は後述するが、仮想空間におけるキャラクタオブジェクトの一部のノードの位置や向きが設定されたとき、残りのノードの位置や向きは、仮想空間におけるキャラクタオブジェクトの姿勢が全体的に基準姿勢に近い見た目になるように、基準姿勢に基づいて算出される。したがって、各関節の可動範囲等のパラメータを特に設定しなくても、仮想空間におけるキャラクタオブジェクトの各関節が不自然な方向に曲がることはなく、仮想空間におけるキャラクタオブジェクトの姿勢は見た目に自然となる。
【００８４】
なお、仮想空間におけるキャラクタオブジェクトの姿勢制御に用いる基準姿勢は、フレーム毎に変更してもよい。図２０は、時間経過に応じて基準姿勢を変化させる例を示している。この例では、基準姿勢を１フレーム毎に少しずつ変化させ、キャラクタオブジェクトが一度かがんでから元の姿勢に戻るまでの期間を１サイクルとして、周期的に基準姿勢を変化させる例である。図２０のような基準姿勢を用いてキャラクタオブジェクトの姿勢制御を行った場合、仮想空間において水上オートバイに乗っているキャラクタオブジェクトの上半身が周期的に上下に揺れるようなゲーム画像を生成することができる。なお、図２０のように基準姿勢を変化させる場合、各フレームの基準姿勢を全て予め用意する必要はなく、例えば、２つの基準姿勢だけを予め用意しておき、その２つの基準姿勢に基づく補間処理等によって、これらの２つの基準姿勢とは異なる基準姿勢をリアルタイムに生成するようにしてもよい。
【００８５】
図２１および図２２は、ゲーム状況に応じて基準姿勢を変化させる例を示している。図２１は、キャラクタオブジェクトが水上オートバイを発進させる前の、スタンバイしている状況で用いられる基準姿勢の一例を示している。図２２は、キャラクタオブジェクトが水上バイクから放り出されそうになっている状況で用いられる基準姿勢の一例を示している。
【００８６】
［メインノードの位置および向きの制御］
本実施形態では、仮想空間においてキャラクタオブジェクトの一部のメインノードの位置や向きが変化したときに、それに連動して残りのメインノードの位置や向きを変化させるために、図２３に示すような６つの仮想的なバネを導入し、各メインノードの位置および向きの算出に利用する。
【００８７】
各バネは、仮想空間においてバネによって接続された２つのメインノードのうちの一方のメインノード（以下、ノードＢと称す）に対する他方のメインノード（以下、ノードＡと称す）の相対位置および相対向きを、基準姿勢におけるノードＡに対するノードＢの相対位置（以下、基準相対位置と称す）および相対向き（以下、基準相対向きと称す）に近づけるように作用する。
【００８８】
図２４は、基準姿勢におけるノードＡとノードＢのそれぞれの位置と向きを示している。図中の黒丸が各ノードの位置を表しており、矢印が各ノードの向き（例えば、各ノードの向きを表すローカル座標系のｙ軸）を表している。
【００８９】
仮想空間におけるノードＡとノードＢのそれぞれの位置と向きが図２５Ａに示すようなものであった場合、仮想空間におけるノードＢに対するノードＡの相対位置が、図２４に示した基準姿勢におけるノードＢに対するノードＡの相対位置（基準相対位置）からずれている。よって、バネは、仮想空間におけるノードＢに対するノードＡの相対位置を、基準相対位置に近づけるように、ノードＡとノードＢに対して図に示すような互いに反対方向の力を与える。なお、バネによってノードＡとノードＢに与えられる力の大きさは、仮想空間におけるノードＢに対するノードＡの相対位置と、基準姿勢におけるノードＢに対するノードＡの相対位置（基準相対位置）のずれの大きさに応じて（例えば、ずれの大きさに比例して）大きくなる。よって、仮想空間におけるノードＡとノードＢのそれぞれの位置と向きが図２５Ｂに示すようなものであった場合、バネによってノードＡとノードＢに図２５Ａの場合よりも大きな力が与えられる。
【００９０】
仮想空間におけるノードＡとノードＢのそれぞれの位置と向きが図２６Ａに示すようなものであった場合、仮想空間におけるノードＢに対するノードＡの相対向きが、図２４に示した基準姿勢におけるノードＢに対するノードＡの相対向き（基準相対向き）からずれている。よって、バネは、仮想空間におけるノードＢに対するノードＡの相対向きを、基準相対向きに近づけるように、ノードＡとノードＢに対して図に示すような互いに反対方向のトルクを与える。なお、バネによってノードＡとノードＢに与えられるトルクの大きさは、仮想空間におけるノードＢに対するノードＡの相対向きと、基準姿勢におけるノードＢに対するノードＡの相対向き（基準相対向き）のずれの大きさに応じて（例えば、ずれの大きさに比例して）大きくなる。よって、仮想空間におけるノードＡとノードＢのそれぞれの位置と向きが図２６Ｂに示すようなものであった場合、バネによってノードＡとノードＢに図２６Ａの場合よりも大きなトルクが与えられる。
【００９１】
仮想空間におけるノードＡとノードＢのそれぞれの位置と向きが図２７に示すようなものであった場合、仮想空間におけるノードＢに対するノードＡの相対位置が、図２４に示した基準姿勢におけるノードＢに対するノードＡの相対位置（基準相対位置）からずれていると同時に、仮想空間におけるノードＢに対するノードＡの相対向きが、図２４に示した基準姿勢におけるノードＢに対するノードＡの相対向き（基準相対向き）からずれている。よって、バネは、仮想空間におけるノードＢに対するノードＡの相対位置を、基準相対位置に近づけるように、ノードＡとノードＢに対して図に示すような互いに反対方向の力を与えると同時に、仮想空間におけるノードＢに対するノードＡの相対向きを、基準相対向きに近づけるように、ノードＡとノードＢに対して図に示すような互いに反対方向のトルクを与える。
【００９２】
上記のようにして各メインノードに与えられる力とトルクが計算されると、当該力とトルクに基づいて、仮想空間における各メインノードの位置と向きが決定される。
【００９３】
仮想空間における各メインノードの位置および向きが決定されると、その後、必要に応じてメインノードの位置および向きが補正される。この補正処理については後述する。
【００９４】
［サブノードの位置および向きの制御］
仮想空間における各メインノードの位置および向きが確定すると、続いて、サブノードの位置と向きが決定される。サブノードの位置と向きは、すでに確定しているメインノードの位置および向きと、基準姿勢とに基づいて一意に決定される。
【００９５】
本実施形態では、予め定められた一部のサブノード（以下、「第１タイプサブノード」と称す）の仮想空間における位置および向きは、当該第１タイプサブノードに接続された１つ以上のノードのうちの予め定められた１つの特定のノード（以下、関連ノードと称す）の仮想空間における位置および向きと、基準姿勢とに基づいて、一意に決定される。また、予め定められた一部のサブノード（以下、「第２タイプサブノード」と称す）の仮想空間における位置および向きは、当該第２タイプサブノードに接続された２つのノード（親ノードおよび子ノード）の仮想空間における位置および向きと、基準姿勢とに基づいて、一意に決定される。
【００９６】
具体的には、仮想空間における第１タイプサブノードの位置および向きは、仮想空間における関連ノードの位置および向きに対する当該第１タイプサブノードの相対位置および相対向きが、基準姿勢における関連ノードの位置および向きに対する当該第１タイプサブノードの相対位置（基準相対位置）および相対向き（基準相対向き）に一致するように決定される。例えば、仮想空間における左指ノードの位置および向きは、仮想空間における左手ノード（左指ノードの親ノード）に対する当該左指ノードの相対位置および相対向きが、基準姿勢における左手ノードに対する左指ノードの相対位置（基準相対位置）および相対向き（基準相対向き）に一致するように決定される。また例えば、仮想空間における左足付け根ノードの位置および向きは、仮想空間における腰ノード（左足付け根ノードの親ノード）に対する当該左足付け根ノードの相対位置および相対向きが、基準姿勢における腰ノードに対する左足付け根ノードの相対位置（基準相対位置）および相対向き（基準相対向き）に一致するように決定される。なお、ここでは仮想空間における親ノードの位置および向きと基準姿勢とに基づいて第１タイプサブノードの位置および向きを決定する例を説明したが、子ノードの位置および向きと基準姿勢とに基づいて第１タイプサブノードの位置および向きを決定するようにしても構わない。
【００９７】
次に、図２８〜図２９Ｄを参照して、仮想空間における第２タイプサブノードの位置および向きの決定方法について説明する。ここでは一具体例として、右膝ノードの位置および向きを決定する方法について説明する。
【００９８】
図２８は、キャラクタオブジェクトの基準姿勢を示している。図中の白丸および黒丸は、各ノードの位置を示しており、矢印は各ノードの向き（例えば、各ノードの向きを表すローカル座標系のｙ軸）を表している。
【００９９】
右足ノードはメインノードであり、右足付け根ノードは第１タイプサブノードである。本実施形態では、メインノードの位置および向きと、第１タイプサブノードの位置および向きが全て決定された後に、第２タイプサブノードの位置および向きが決定される。したがって、ここでは、右足ノードの位置および向きと、右足付け根ノードの位置および向きは、すでに決定済みであるとする。
【０１００】
まず、仮想空間における右膝ノードの位置を決定するために、図２９Ａに示すように、仮想空間における右足付け根ノードを中心とした球Ａと、右足ノードを中心とした球Ｂを求める。球Ａの半径は、基準姿勢における右足付け根ノードと右膝ノードの間の距離と等しくなるように設定される。すなわち、球Ａの表面は、右足付け根ノードを基準としたときの右膝ノードの候補位置を示している。また、球Ｂの半径は、基準姿勢における右足ノードと右膝ノードの間の距離と等しくなるように設定される。すなわち、球Ｂの表面は、右足ノードを基準としたときの右膝ノードの候補位置を示している。
【０１０１】
球Ａおよび球Ｂを上記のように設定すると、図２９Ｂに示すような球Ａの表面と球Ｂの表面の交線上の各点が、仮想空間における右膝ノードの候補位置となる。ただし、この段階では右膝ノードの候補位置が複数（無数に）存在するので、本実施形態では、基準姿勢を参照することによって、これらの複数の候補位置から右膝ノードの位置を一意に決定する。具体的には、右足付け根ノードと右足ノードとを結ぶ直線を中心として、右膝がいずれの方向に突き出るべきかを、基準姿勢データを参照して決定する。そして、右膝の突き出し方向が求まれば、図２９Ｃに示すように、右足付け根ノードと右足ノードとを結ぶ直線を基準として右膝の突き出し方向に位置する球Ａの表面と球Ｂの表面の交線上の一点が、右膝ノードの位置として決定される。
【０１０２】
右膝ノードの位置が決定されると、例えば、仮想空間における右膝ノードと右足ノードの位置関係等に基づいて、右膝ノードの向きが適宜に決定される（図２９Ｄ）。なお、ここで説明した第２タイプサブノードの決定方法は単なる一例に過ぎない。
【０１０３】
［ゲーム処理の詳細］
次に、光ディスク４に記憶されたゲームプログラムに基づいてＣＰＵ１０によって実行されるゲーム処理の詳細を説明する。
【０１０４】
図３０は、上記ゲーム処理の実行中に外部メインメモリ１２に格納されるプログラムおよびデータの一部を示している。外部メインメモリ１２には、光ディスク４から読み出されたゲームプログラム６１、入力装置８から受信した操作データ６２、キャラクタオブジェクトを構成する複数のノードに関するデータの集合であるノードデータ６３、ノードの階層構造（親子関係）を規定した階層構造情報６４、基準姿勢における各ノードの位置および向きを規定した基準姿勢情報６５、メインノード間を結ぶ仮想的な各バネに関するデータの集合であるバネ情報６６、キャラクタオブジェクトや水上オートバイ等の仮想空間における各オブジェクトの配置位置を示すオブジェクト位置座標６７、仮想空間における各オブジェクトの外観形状を表すポリゴンデータ６８、仮想空間における各オブジェクトの表面の模様を示すテクスチャデータ６９等が格納される。なお、これらのプログラムやデータの一部もしくは全部は、例えば内部メインメモリ１１ｅなど、外部メインメモリ１２以外の記憶領域に格納されても構わない。
【０１０５】
操作データ６２には、コントローラ５に設けられた各種スイッチの状態を示すボタンデータ、コントローラ５に装着されたジャイロセンサユニット７から出力された角速度データ、コントローラ５内の加速度センサ３７から出力された加速度データ、コントローラ５内の画像処理回路４１から出力されたマーカ座標データが含まれている。
【０１０６】
ノードデータ６３には、各メインノードに関するデータの集合であるメインノードデータと、各サブノードに関するデータの集合であるサブノードデータが含まれている。
【０１０７】
図３１は、メインノードデータの詳細を示す図である。メインノードデータには、各メインノード毎に複数のパラメータ（すなわち、ノード番号、位置、向き、速度、角速度、力、トルク、位置の属性、向きの属性、補正用パラメータ）が含まれている。
・「ノード番号」は、キャラクタオブジェクトを構成する複数のノードを識別するための番号である。
・「位置」（pos）は、仮想空間における当該メインノードの絶対位置を示すパラメータであり、例えば３次元ベクトルで表される。
・「向き」（rot）は、仮想空間における当該メインノードの絶対向きを示すパラメータ、例えばクォータニオンで表される。
・「速度」（vel）は、仮想空間における当該メインノードの絶対速度を示すパラメータ、例えば３次元ベクトルで表される。
・「角速度」（omega）は、仮想空間における当該メインノードの絶対角速度を示すパラメータ、例えば３次元ベクトルで表される。
・「力」（force）は、当該メインノードに作用する仮想空間における絶対力を示すパラメータ、例えば３次元ベクトルで表される。
・「トルク」（torque）は、当該メインノードに作用する仮想空間における絶対トルクを示すパラメータ、例えば３次元ベクトルで表される。
・「位置の属性」（attr＿pos）は、当該メインノードの「位置」の属性を示すパラメータ、「制御」または「自由」のいずれかを表している。
・「向きの属性」（attr＿rot）は、当該メインノードの「向き」の属性を示すパラメータ、「制御」または「自由」のいずれかを表している。
・「補正用パラメータ」（Tmin,Tmax,Fmin,Fmax）は、後述する補正処理の際に利用されるパラメータである。
【０１０８】
なお、「制御」の属性を有するメインノードの「位置」には、任意の値を直接設定することができる。一方、「自由」の属性を有するメインノードの「位置」は、前述の仮想的なバネを用いた演算によって、その値が決定される。したがって、例えば図１１Ａ〜図１１Ｃのように、キャラクタオブジェクトの両手と両足を水上オートバイに固定した状態で、プレイヤの入力操作に応じてキャラクタオブジェクトの腰の位置を移動させたい場合には、左手ノード、右手ノード、左足ノード、右足ノード、腰ノードのそれぞれの「位置の属性」を「制御」に設定し、残りのメインノードの「位置の属性」を「自由」に設定すればよい。「向きの属性」に関しても同様である。なお、各メインノードの「位置の属性」および「向きの属性」は、ゲーム状況に応じて変化させてもよい。
【０１０９】
図３２は、サブノードデータの詳細を示す図である。サブノードデータには、各サブノード毎に複数のパラメータ（すなわち、ノード番号、位置、向き）が含まれている。
・「ノード番号」は、キャラクタオブジェクトを構成する複数のノードを識別するための番号である。メインノードに割り当てられるノード番号とサブノードに割り当てられるノード番号は重複しないものとする。
・「位置」（pos）は、仮想空間における当該サブノードの絶対位置を示すパラメータであり、例えば３次元ベクトルで表される。
・「向き」（rot）は、仮想空間における当該サブノードの絶対向きを示すパラメータ、例えばクォータニオンで表される。
【０１１０】
図３３は、基準姿勢情報６５の詳細を示す図である。基準姿勢情報６５には、メインノードとサブノードを含む全ノードに関して、各ノード毎に複数のパラメータ（すなわち、ノード番号、位置、向き、親ノードに対する相対位置、親ノードに対する相対向き）が含まれている。
・「ノード番号」は、キャラクタオブジェクトを構成する複数のノードを識別するための番号である。
・「位置」（pos）は、基準姿勢における当該ノードの絶対位置を示すパラメータであり、例えば３次元ベクトルで表される。
・「向き」（rot）は、基準姿勢における当該ノードの絶対向きを示すパラメータであり、例えばクォータニオンで表される。
・「親ノードに対する相対位置」（pos＿local）は、親ノードに対する当該ノードの相対位置を示すパラメータであり、例えば３次元ベクトルで表される。
・「親ノードに対する相対向き」（rot＿local）は、親ノードに対する当該ノードの相対向きを示すパラメータであり、例えばクォータニオンで表される。
【０１１１】
なお、基準姿勢情報６５における各ノードの「親ノードに対する相対位置」と「親ノードに対する相対向き」の値は、階層構造情報６４と、基準姿勢情報６５に含まれる各ノードの「位置」および「向き」とに基づいて、必要に応じてリアルタイムに算出することもできる。
【０１１２】
なお、前述したように基準姿勢を時間やゲーム状況に応じて変化させる場合には、例えば、基準姿勢情報に含まれる各パラメータをリアルタイムに変更したり、予め用意した複数の基準姿勢情報セットの中からゲーム状況に応じて１つの基準姿勢情報セットを選択したりすればよい。
【０１１３】
図３４は、バネ情報６６の詳細を示す図である。バネ情報６６には、例えば図２３に示したようなメインノード間を結ぶ仮想的な各バネに関して、各バネ毎に複数のパラメータ（すなわち、ノードＡのノード番号、ノードＢのノード番号、ノードＡの仮想空間における基準位置、ノードＡの仮想空間における基準向き、前回位置ずれ、前回ｘ軸向きずれ、前回ｙ軸向きずれ、前回ｚ軸向きずれ、変位に関する硬さ係数、変位に関する減衰係数、回転に関する硬さ係数、回転に関する減衰係数）が含まれている。
・「ノードＡのノード番号」は、当該バネによって接続される２つのメインノードのうちの一方のメインノード（以下、ノードＡと称す）のノード番号である。
・「ノードＢのノード番号」は、当該バネによって接続される２つのメインノードのうちの他方のメインノード（以下、ノードＢと称す）のノード番号である。
・「ノードＡの仮想空間における基準位置」（posA）は、基準姿勢におけるノードＢに対するノードＡの相対位置（基準相対位置）を、仮想空間におけるノードＢの絶対位置および絶対向きを基準として、仮想空間における絶対位置に変換した結果の値を示すパラメータであり、例えば３次元ベクトルで表される。
・「ノードＡの仮想空間における基準向き」（rotA）は、基準姿勢におけるノードＢに対するノードＡの相対向き（基準相対向き）を、仮想空間におけるノードＢの絶対向きを基準として、仮想空間における絶対向きに変換した結果の値を示すパラメータであり、例えば３次元ベクトルで表される。
・「前回位置ずれ」（length＿pos）は、過去に計算した、ノードＡの仮想空間における基準位置と現在の位置の間のずれの大きさの計算結果（スカラー）のうち、最新のものを保存しておくためのパラメータである。
・「前回ｘ向きずれ」（length＿x）は、過去に計算した、ノードＡの仮想空間における基準向きと現在の向きの間のずれ（ノードＡの向きを表すローカル座標系のｘ軸の向きのずれ）の大きさの計算結果（スカラー）のうち、最新のものを保存しておくためのパラメータである。
・「前回ｙ向きずれ」（length＿y）は、過去に計算した、ノードＡの仮想空間における基準向きと現在の向きの間のずれ（ノードＡの向きを表すローカル座標系のｙ軸の向きのずれ）の大きさの計算結果（スカラー）のうち、最新のものを保存しておくためのパラメータである。
・「前回ｚ向きずれ」（length＿z）は、過去に計算した、ノードＡの仮想空間における基準向きと現在の向きの間のずれ（ノードＡの向きを表すローカル座標系のｚ軸の向きのずれ）の大きさの計算結果（スカラー）のうち、最新のものを保存しておくためのパラメータである。
・「変位に関する硬さ係数」（Sp）は、バネの変位に関する硬さ係数である。
・「変位に関する減衰係数」（Spd）は、バネの変位に関する減衰係数である。
・「回転に関する硬さ係数」（Sr）は、バネの回転に関する硬さ係数である。
・「回転に関する減衰係数」（Srd）は、バネの回転に関する減衰係数である。
【０１１４】
［ゲーム処理の流れ］
次に、図３５〜図４１のフローチャートを参照して、光ディスク４に記憶されたゲームプログラム６１に基づいてＣＰＵ１０によって実行されるゲーム処理の流れを説明する。なお、以下で説明するゲーム処理の一部は、ＣＰＵ１０の指示によってＧＰＵ１１ｂなどの他のプロセッサによって実行されても構わない。
【０１１５】
ゲームプログラム６１の実行が開始されると、ステップＳ１０においてＣＰＵ１０は、初期処理を行う。初期処理には、ゲーム処理に利用される各種変数に初期値を入力したり、仮想空間にキャラクタオブジェクトや水上オートバイ等のオブジェクトを初期位置に配置したり、仮想カメラを初期位置に配置したりする処理が含まれる。
【０１１６】
ステップＳ１１においてＣＰＵ１０は、必要に応じて、キャラクタオブジェクトの基準姿勢を更新する。これは、図２０〜図２２に示したように、キャラクタオブジェクトの基準姿勢を時間やゲーム状況に応じて適宜に変化させるための処理である。
【０１１７】
ステップＳ１２においてＣＰＵ１０は、必要に応じて、各メインノードの「位置の属性」および「向きの属性」を更新する。前述のように、各メインノードの「位置の属性」および「向きの属性」は、「制御」か「自由」のいずれかに設定されており、ここでは、ゲーム状況に応じてこれらの値を適宜に更新する。なお、以下の説明では、「制御」の属性を有するメインノードの「位置」および「向き」のことを、それぞれ「位置（制御）」および「向き（制御）」と称し、「自由」の属性を有するメインノードの「位置」および「向き」のことを、それぞれ「位置（自由）」および「向き（自由）」と称する。
【０１１８】
ステップＳ１３においてＣＰＵ１０は、入力装置８から操作データ６２を取得して外部メインメモリ１２に格納する。
【０１１９】
ステップＳ１４においてＣＰＵ１０は、操作データ６２に基づいて仮想空間における水上オートバイの移動制御（図１０Ａ〜図１０Ｃを参照して説明した旋回制御を含む）を行い、仮想空間におけるキャラクタオブジェクトおよび水上オートバイの配置位置（オブジェクト位置座標６７）を更新する。
【０１２０】
ステップＳ１５においてＣＰＵ１０は、姿勢制御処理（キャラクタオブジェクトの姿勢を更新するための処理）を実行する。姿勢制御処理の詳細については後述する。
【０１２１】
ステップＳ１６においてＣＰＵ１０は、ステップＳ１４で更新されたキャラクタオブジェクトおよび水上オートバイの配置位置と、ステップＳ１５で更新されたキャラクタオブジェクトの姿勢に基づいて、ポリゴンデータ６８およびテクスチャデータ６９を用いて、仮想カメラから見たキャラクタオブジェクトの様子を示すゲーム画像を生成する。
【０１２２】
ステップＳ１７においてＣＰＵ１０は、ゲームが終了したか否かを判断し、ゲームが終了した場合はゲームプログラム６１の実行を終了する。ゲームが終了していない場合には、処理はステップＳ１１に戻る。
【０１２３】
以上のステップＳ１１〜ステップＳ１７の処理は、テレビ２の画面の更新周期に同期して、繰り返し実行される。こうして、テレビ２の画面には、キャラクタオブジェクトが水上オートバイを操縦している様子が表示される。
【０１２４】
［姿勢制御処理の詳細］
次に、図３６を参照して、図３５のステップＳ１５の姿勢制御処理の詳細を説明する。
【０１２５】
ステップＳ２０においてＣＰＵ１０は、メインノード処理（各メインノードの「位置」と「向き」を決定するための処理）を実行する。メインノード処理の詳細については後述する。
【０１２６】
ステップＳ２１においてＣＰＵ１０は、サブノード処理（各サブノードの「位置」と「向き」を決定するための処理）を実行する。サブノード処理の詳細については後述する。
【０１２７】
［メインノード処理の詳細］
次に、図３７を参照して、図３６のステップＳ２０のメインノード処理の詳細を説明する。
【０１２８】
ステップＳ３０においてＣＰＵ１０は、「制御」の属性が設定されているメインノードの「位置（制御）」と「向き（制御）」を決定する。具体的には、「位置の属性」が「制御」に設定されているメインノードの「位置」のパラメータに、所望の値を代入するとともに、「向きの属性」が「制御」に設定されているメインノードの「向き」のパラメータに、所望の値を代入する。この処理は、例えば図１１Ａ〜図１１Ｃの例において、キャラクタオブジェクトの両足や両手を水上オートバイに固定したり、キャラクタオブジェクトの腰の位置を入力装置８の姿勢に応じた位置に移動したりするためのものである。
【０１２９】
ステップＳ３１においてＣＰＵ１０は、「自由」の属性が設定されているメインノードの「位置（自由）」と「向き（自由）」に仮の値を設定する。以下、「位置（自由）」に設定される仮の値のことを「仮位置」と称し、「向き（自由）」設定される仮の値のことを「仮向き」と称する。ここで設定される仮位置および仮向きは、直前のフレームの処理で決定された「位置（自由）」と「向き（自由）」の値を、そのまま仮位置、仮向きとして利用してもよいし、基準姿勢に基づいて仮位置、仮向きを設定してもよいし、予め定められた所定値を仮位置、仮向きとして設定してもよい。
【０１３０】
ステップＳ３２においてＣＰＵ１０は、バネ演算処理（各メインノードの「位置（自由）」と「向き（自由）」を決定するための処理）を実行する。バネ演算処理の詳細については後述する。
【０１３１】
ステップＳ３３においてＣＰＵ１０は、補正処理（各メインノードの「位置（自由）」と「向き（自由）」を必要に応じて補正するための処理）を実行する。補正処理の詳細については後述する。
【０１３２】
［バネ演算処理の詳細］
次に、図３８を参照して、図３７のステップＳ３２のバネ演算処理の詳細を説明する。
【０１３３】
ステップＳ４０においてＣＰＵ１０は、各メインノードの「力」と「トルク」を０にリセットする。
【０１３４】
ステップＳ４１においてＣＰＵ１０は、バネ情報６６に規定されている複数のバネの中から、未選択のバネを１つ選択する。以下のステップＳ４２〜ステップＳ４９の説明において、単に「バネ」と記載した場合には、当該ステップＳ４１で選択されたバネを指すものとする。
【０１３５】
ステップＳ４２においてＣＰＵ１０は、基準姿勢情報６５に基づいて、バネで接続された一対のメインノードのうちの一方のメインノード（以下、「ノードＢ」と称する）に対する他方のメインノード（以下、「ノードＡ」と称する）の基準相対位置を計算する。前述のように、ノードＢに対するノードＡの「基準相対位置」とは、基準姿勢におけるノードＢに対するノードＡの相対位置を意味する。
【０１３６】
ステップＳ４３においてＣＰＵ１０は、「ノードＡの仮想空間における基準位置」の値を計算して、外部メインメモリ１２に格納する。「ノードＡの仮想空間における基準位置」の値は、前述のように、ノードＢに対するノードＡの基準相対位置を、仮想空間におけるノードＢの絶対位置および絶対向きを基準として、仮想空間における絶対位置に変換することによって計算される。
【０１３７】
ステップＳ４４においてＣＰＵ１０は、仮想空間におけるノードＡの現在の位置と基準位置のずれ（変位）を計算し、当該ずれに基づいて、バネがノードＡとノードＢに及ぼす力（３次元ベクトル）を計算する。バネがノードＡに及ぼす力をF（３次元ベクトル）とすると、バネがノードＢに及ぼす力は-F（３次元ベクトル）となる。Fの値は、例えば以下のようなプログラムコードによって計算される。
【０１３８】
length = | S< Jc[ A ], Jc[ B ] >.posA - Jc[ A ].pos |
dir = ( S< Jc[ A ], Jc[ B ] >.posA - Jc[ A ].pos ) / length
F = ( Sp * length - Spd * | S< Jc[ A ], Jc[ B ]>.length＿pos - length | ) * dir
S< Jc[ A ], Jc[ B ] >.length＿pos = length (更新）
【０１３９】
上記プログラムコードにおいて、「length」は仮想空間におけるノードＡの現在の位置と基準位置のずれの大きさを示しており、「dir」は当該ずれの向きを示している。「Jc[ A ]」は、複数のメインノードのうちの特定のメインノード（ノードＡ）を表している。また、「S< Jc[ A ], Jc[ B ] >.posA」は、ノードＡとノードＢを結ぶバネのパラメータ「posA」を示しており、「Jc[ A ].pos」は、ノードＡのパラメータ「pos」を示している。また、「Sp」は「変位に関する硬さ係数」であり、「Spd」は「変位に関する減衰係数」である。「Sp」および「Spd」の値はバネ毎に異なるように設定されてもよい。「Sp」の値が相対的に大きいバネほど、そのバネによって接続される２つのメインノードの位置関係が、基準姿勢におけるそれらの位置関係に相対的に近いものになり、逆に「Sp」の値が相対的に小さいバネほど、そのバネによって接続される２つのメインノードの位置関係が、基準姿勢におけるそれらの位置関係から相対的に遠いものになる。例えば、腰ノードと胸ノードを結ぶバネの「Sp」の値は、右手ノードと胸ノードを結ぶバネの「Sp」に対して１０倍程度の値を設定するようにしてもよい。
【０１４０】
ステップＳ４５においてＣＰＵ１０は、ステップＳ４４で算出されたＦに基づいて、ノードＡとノードＢの「力」（force）を更新する。ノードＡの「力」（Jc[ A ].force）およびノードＢの「力」（Jc[ B ].force）は、例えば以下のようなプログラムコードによって計算される。
【０１４１】
Jc[ A ].force = Jc[ A ].force + F
Jc[ B ].force = Jc[ B ].force - F
【０１４２】
ステップＳ４６においてＣＰＵ１０は、基準姿勢情報６５に基づいて、ノードＢに対するノードＡの基準相対向きを計算する。前述のように、ノードＢに対するノードＡの「基準相対向き」とは、基準姿勢におけるノードＢに対するノードＡの相対向きを意味する。
【０１４３】
ステップＳ４７においてＣＰＵ１０は、「ノードＡの仮想空間における基準向き」の値を計算して、外部メインメモリ１２に格納する。「ノードＡの仮想空間における基準向き」の値は、前述のように、ノードＢに対するノードＡの基準相対向きを、仮想空間におけるノードＢの絶対向きを基準として、仮想空間における絶対向きに変換することによって計算される。
【０１４４】
ステップＳ４８においてＣＰＵ１０は、仮想空間におけるノードＡの現在の向きと基準向きのずれを計算し、当該ずれに基づいて、バネがノードＡとノードＢに及ぼすトルクを計算する。本実施形態では、一例として、バネがノードＡに及ぼすトルクを、バネがノードＡの向きを示すローカル座標の各軸（ｘ軸，ｙ軸，ｚ軸）に及ぼすトルク（Tx, Ty, Tz）として算出する（図４２Ｂ参照）。なお、図４２Ａは、仮想空間におけるノードＡの基準向きを示しており、図４２Ｂは仮想空間におけるノードＡの現在の向きを示している。バネがノードＢの向きを示すローカル座標軸の各軸（ｘ軸，ｙ軸，ｚ軸）に及ぼすトルクは、それぞれ、-Tx, -Ty, -Tzとなる。Ｔｘの値は、例えば以下のようなプログラムコードによって計算される。
【０１４５】
length = | Xaxis( S< Jc[ A ], Jc[ B ] >.rotA ) - Xaxis( Jc[ A ].rot ) |
dir = ( Xaxis( S< Jc[ A ], Jc[ B ] >.rotA ) - Xaxis( Jc[ A ].rot ) ) / length
Tx = ( Sr * length - Srd * | S< Jc[ A ], Jc[ B ] >.length＿x - length | ) * dir
S< Jc[ A ], Jc[ B ] >.length＿x = length (更新）
【０１４６】
上記プログラムコードにおいて、「length」は仮想空間におけるノードＡ（ノードＡの向きを示すローカル座標のｘ軸）の現在の向きと基準向きのずれの大きさを示しており、「dir」は当該ずれの向きを示している。「Xaxis( rot )」は、向き（rot）を示すローカル座標のｘ軸を示している。後述するYaxis, Zaxisも同様である。また、「Sr」は「回転に関する硬さ係数」であり、「Srd」は「回転に関する減衰係数」である。「Sr」および「Srd」の値はバネ毎に異なるように設定されてもよい。
【０１４７】
Ｔｙ，Ｔｚについても、Ｔｘと同様にして計算される。
【０１４８】
ステップＳ４９においてＣＰＵ１０は、ステップＳ４４で算出されたＴｘ，Ｔｙ，Ｔｚに基づいて、ノードＡとノードＢの「トルク」（torque）を更新する。ノードＡの「トルク」（Jc[ A ].torque）およびノードＢの「トルク」（Jc[ B ].torque）は、例えば以下のようなプログラムコードによって計算される。なお、「×」は外積記号である。
【０１４９】
Jc[ A ].torque = Jc[ A ].torque + Xaxis( Jc[ A ].rot ) × Tx + Yaxis( Jc[ A ].rot ) × Ty + Zaxis( Jc[ A ].rot ) × Tz
Jc[ B ].torque = Jc[ B ].torque - Xaxis( Jc[ B ].rot ) × Tx - Yaxis( Jc[ B ].rot ) × Ty - Zaxis( Jc[ B ].rot ) × Tz
【０１５０】
ステップＳ５０においてＣＰＵ１０は、バネ情報６６に規定されている全てのバネがすでに選択されたかどうかを判断する。そして、全てのバネがすでに選択されている場合には処理はステップＳ５１に進み、まだ選択されていないバネが存在する場合には処理はステップＳ４１に戻る。
【０１５１】
ステップＳ５１においてＣＰＵ１０は、各メインノードの「力」と「トルク」に基づいて、各メインノードの「位置（自由）」と「向き（自由）」を更新する。なお、ここで用いる各メインノードの「力」と「トルク」は、各メインノードに接続されている１以上のバネから受ける力とトルクを合計したものとなっている。各メインノードの「位置（自由）」（Jc.pos）と「向き（自由）」（Jc.rot）は、例えば以下のようなプログラムコードによって計算される。
【０１５２】
Jc.vel = Jc.vel * Dp + Jc.force
Jc.pos = Jc.pos + Jc.vel
Jc.omega = Jc.omega * Dr + Jc.torque
Jc.rot = [ 1.0, Jc.omega * 0.5 ] * Jc.rot 
【０１５３】
「[ 1.0, Jc.omega * 0.5 ]」は、角速度に基づいて向きを変化させるためのクォータニオンである。また、「Dp」は仮想空間における変位に関する減衰係数であり、「Dr」は仮想空間における回転に関する減衰係数である。「Dp」および「Dr」は、それぞれ、0 < Dp < 1, 0 < Dr < 1 を満たすような所定の値が設定される。
【０１５４】
ステップＳ５２においてＣＰＵ１０は、上記ステップＳ４０〜ステップＳ５１の一連の処理を所定回数（例えば４回）繰り返したかどうか判断する。そして、ステップＳ４０〜ステップＳ５１の一連の処理を所定回数繰り返した場合には、バネ演算処理を終了し、そうでない場合には、処理はステップＳ４０に戻る。なお、ステップＳ４０〜ステップＳ５１の一連の処理は、必ずしも複数回繰り返す必要は無いが、この一連の処理を繰り返すほど、仮想空間におけるキャラクタオブジェクトの姿勢が安定し、より自然な姿勢となることが期待できる。
【０１５５】
［補正処理の詳細］
次に、図３９を参照して、図３７のステップＳ３３の補正処理の詳細を説明する。
【０１５６】
前述のバネ演算処理では、基準姿勢に基づいてメインノードの位置および向きが決定されるが、各メインノードの距離に対する制限を一切考慮していないため、「制御」の属性を有するメインノードの「位置」や「向き」の値によっては、バネで接続されているメインノード間の距離が、不自然な値に設定されてしまう可能性がある。例えば、腰ノードと右足ノードの間の距離は、キャラクタオブジェクトの腰の位置から右足首までの最大長を超えるべきではないが、前述のバネ演算処理だけでは、腰ノードと右足ノードの間の距離は、キャラクタオブジェクトの腰の位置から右足首までの最大長を超えてしまい、ゲーム画像中のキャラクタオブジェクトの腰のパーツと足のパーツが離れて見えてしまう可能性がある。例えば、図４３Ａのようにキャラクタオブジェクトの右足ノードと左足ノードの「位置」および「向き」が固定されている状態から、左手ノードを図の矢印方向に移動させると、図４３Ｂのように、キャラクタオブジェクトの腕などに隙間が生じる可能性がある。そこで、補正処理では、バネで接続されているメインノード間の距離が、予め定めた制限距離を超えている場合に、その距離が制限距離に収まるように、各メインノードの位置や向きを補正する。
【０１５７】
ステップＳ６０においてＣＰＵ１０は、各メインノードの「補正用パラメータ」（Tmin,Tmax,Fmin,Fmax）を０にリセットする。
【０１５８】
ステップＳ６１においてＣＰＵ１０は、バネ情報６６に規定されている複数のバネの中から、未選択のバネを１つ選択する。以下のステップＳ６２〜ステップＳ６４の説明において、単に「バネ」と記載した場合には、当該ステップＳ６１で選択されたバネを指すものとする。
【０１５９】
ステップＳ６２においてＣＰＵ１０は、バネで接続されている２つのメインノード（ノードＡおよびノードＢ）の間の距離が制限距離を超えているかどうかを判断し、制限距離を超えている場合には処理はステップＳ６３に進み、制限距離を超えていない場合には処理はステップＳ６５に進む。なお、制限距離は、各バネ毎に予め定められているものとする。
【０１６０】
ステップＳ６３においてＣＰＵ１０は、ノードＡとノードＢの間の距離が制限距離となるようにするために必要となるノードＡの移動距離および移動方向を示すベクトル（当該ベクトルは、あたかもノードＡとノードＢの間に働く引力を示すベクトルに似ているため、以下、引力ベクトルと称す）を計算する。例えば、引力ベクトル（modifyAB）は、例えば以下のようなプログラムコードによって計算される。
【０１６１】
modifyAB = ( C.length - lengthAB ) * ( Jc[ A ].pos - Jc[ B ].pos ) / lengthAB
【０１６２】
なお、上記プログラムコードにおいて、「C.length」はノードＡとノードＢの間の制限距離を示しており、「lengthAB」はノードＡとノードＢの間の距離を示している。
【０１６３】
ステップＳ６４においてＣＰＵ１０は、引力ベクトルに基づいて、ノードＡとノードＢの「補正用パラメータ」（Tmin, Tmax, Fmin, Fmax）を更新する。ノードＡの「補正用パラメータ」（JcExA.Tmin, JcExA.Tmax, JcExA.Fmin, JcExA.Fmax）およびノードＢの「補正用パラメータ」（JcExB.Tmin, JcExB.Tmax, JcExB.Fmin, JcExB.Fmax）は、例えば以下のようなプログラムコードによって計算される。
【０１６４】
F = Cp * modifyAB
T = Cr * modifyAB
JcExA.Fmin = Min( F, JcExA.Fmin )
JcExA.Fmax = Max( F, JcExA.Fmax )
JcExA.Tmin = Min( T, JcExA.Tmin )
JcExA.Tmax = Max( T, JcExA.Tmax )
JcExB.Fmin = Min( -F, JcExB.Fmin )
JcExB.Fmax = Max( -F, JcExB.Fmax )
JcExB.Tmin = Min( -T, JcExB.Tmin )
JcExB.Tmax = Max( -T, JcExB.Tmax )
【０１６５】
なお、上記プログラムコードにおいて、「Cp」は戻し幅係数を示しており、「Cr」は向きの補正量を示している。また、「Min」は、複数の３次元ベクトルから、各成分（ｘ成分、ｙ成分、ｚ成分）毎に最小値を選択して新たな３次元ベクトルを得る演算子であり、「Max」は、複数の３次元ベクトルから、各成分（ｘ成分、ｙ成分、ｚ成分）毎に最大値を選択して新たな３次元ベクトルを得る演算子である。
【０１６６】
ステップＳ６５においてＣＰＵ１０は、バネ情報６６に規定されている全てのバネがすでに選択されたかどうかを判断する。そして、全てのバネがすでに選択されている場合には処理はステップＳ６６に進み、まだ選択されていないバネが存在する場合には処理はステップＳ６１に戻る。
【０１６７】
ステップＳ６６においてＣＰＵ１０は、「補正用パラメータ」の値に基づいて、各メインノードの「位置（自由）」および「向き（自由）」を更新する。ただし、全てのバネについてステップＳ６２の判断結果が否定であった場合には、当該ステップＳ６６の処理を省略してもよい。各メインノードの「位置（自由）」および「向き（自由）」は、各メインノードの補正用パラメータ（JcEx.Tmin，JcEx.Tmax，JcEx.Fmin，JcEx.Fmax）を用いて、例えば以下のようなプログラムコードによって計算される。
【０１６８】
Jc.pos = Jc.pos + ( JcEx.Fmin + JcEx.Fmax )
Jc.rot = [ 1.0, (JcEx.Tmin + JcEx.Tmax ) * 0.5 ] * Jc.rot
【０１６９】
なお、上記プログラムコードにおける「JcEx.Fmin + JcEx.Fmax」で示される３次元ベクトルは、後述の「修正ベクトル」に相当する。
【０１７０】
なお、本実施形態では上記のように、メインノードの「位置」を補正する際に、同時に「向き」も補正しているが、これは、それらの間の距離が制限距離を超えるような２つのメインノードが存在しているときには、メインノードの「位置」を補正するだけでなく、「向き」も補正した方が、適切な状態に補正しやすく、キャラクタオブジェクトの見た目もより自然になるからである。例えば、図４３Ｂの状態から補正処理によって左腕の隙間を埋める場合、図４３Ｃに示すように、胸ノードの向き（例えば、胸ノードの向きを表すローカル座標系のｙ軸）を左手ノードの方向へ近づけるように補正することによって、キャラクタオブジェクトの姿勢をより自然なものにすることができる。
【０１７１】
ステップＳ６７においてＣＰＵ１０は、補正処理の終了条件を満たしたかどうかを判断し、終了条件を満たした場合には補正処理を終了し、そうでない場合には処理はステップＳ６０に戻る。本実施形態では、一例として、下記の２つの条件（条件１および条件２）のうちのいずれか一方を満たした場合に、終了条件を満たしたと判断する。
【０１７２】
（条件１）
ステップＳ６３において算出された各バネに関する引力ベクトルの大きさの合計値が、予め定めた閾値以下になったこと。
【０１７３】
（条件２）
ステップＳ６０〜ステップＳ６６の一連の処理を所定回数繰り返したこと。
【０１７４】
上記条件１を設けることにより、補正の必要性がない、もしくはステップＳ６０〜ステップＳ６６の一連の処理を何回か繰り返した結果、補正の効果が十分に得られたときに、補正処理をすぐに終了させることができ、余計な処理負担を回避することができる。また、上記条件１に加えて上記条件２を設けることにより、例えばステップＳ６０〜ステップＳ６６の一連の処理を無限に繰り返したとしても補正の効果が十分に得られないようなケースにおいて、補正処理を無駄に継続してしまうことを回避することができる。
【０１７５】
次に、上記補正処理の原理について、図４４Ａ〜図４６Ｂを参照してより分かりやすく説明する。
【０１７６】
説明を理解しやすくするために、図４４Ａに示すように、第１接続ノード，第２接続ノードおよび第３接続ノードの３つのノードに接続されたノード（注目ノードと称す）の位置を制御する場合を例として説明する。
【０１７７】
図４４Ａにおいて、第１目標位置は、注目ノードと第１接続ノードの位置関係に基づいて決定される、当該注目ノードの目標位置を示している。例えば、前述のように、バネで接続された２つのメインノードの間の距離が予め定められた制限距離を超えている場合に、当該２つのメインノードを近づける必要がある。第１ベクトルは、注目ノードを第１目標位置に近づけるための当該注目ノードの目標移動方向（第１目標移動方向）と目標移動量（第１目標移動量）を示すベクトルである。第１ベクトルの大きさは、例えば、注目ベクトルと第１目標位置の間の距離に応じて（例えば、注目ベクトルと第１目標位置の間の距離に比例するように）決定されるものとする。第１ベクトルは、注目ノードが第１接続ノードに引き寄せられる方向を示すベクトルであることから、注目ノードと第１接続ノードの間に生じる「引力」を表していると言うことができる。第２ベクトルおよび第３ベクトルについても同様である。
【０１７８】
なお、オブジェクトの或るパーツが別のパーツにめり込んで表示されるのを防止するために、バネで接続された２つのメインノードの間の距離が予め定められた必要距離を下回っている場合に、当該２つのメインノードを遠ざけたい場合がある。図４４Ｂでは、注目ノードと第２接続ノードの間の距離が必要距離を下回っているために、注目オブジェクトから見て第２接続ノードから遠ざかる方向に第２目標位置が存在している。図４４Ｂにおける第２ベクトルは、注目ノードが第２接続ノードから遠ざけられる方向を示すベクトルであることから、注目ノードと第２接続ノードの間に生じる「斥力」を表していると言うことができる。
【０１７９】
ところで、図４４Ａにおいて、第１ベクトル〜第３ベクトルは、それぞれ異なる方向及び大きさを有している。このような状況において、注目ノードの位置をどのように移動させるかは、最終的に得られるゲーム画像におけるキャラクタオブジェクトの見た目の自然さに大きく影響する。容易に思いつく方法としては、第１ベクトル〜第３ベクトルを全て加算し、加算した結果として得られるベクトルに従って注目ノードの位置を移動させる方法がある。しかしながら、当該方法を採用すると、図４５に示すような例において、注目ノードと第２〜第６目標位置の間の距離はいずれも近づく一方で、注目ノードと第１目標位置の間の距離だけが大きく離れてしまうことになり、その結果、キャラクタオブジェクトの特定部分だけが際だって不自然に見えてしまうことになる。
【０１８０】
以下、図４６Ａおよび図４６Ｂを参照して、本実施形態における注目ノードの位置の制御方法を説明する。なお、図４６Ａおよび図４６Ｂは、図４４Ａの例に対応している。
【０１８１】
本実施形態では、第１ベクトル〜第３ベクトルの３つのベクトルを対象として、各成分（Ｘ成分，Ｙ成分，Ｚ成分）毎に最大値および最小値を求め、こうして求めた６つの値（Ｘ成分の最大値（Xmax），Ｘ成分の最小値（Xmin），Ｙ成分の最大値（Ymax），Ｙ成分の最小値（Ymin），Ｚ成分の最大値（Zmax），Ｚ成分の最小値（Zmin））に基づいて、注目ノードを制御するための修正ベクトルを決定し、当該修正ベクトルに基づいて注目ノードの位置を更新する。
【０１８２】
図４６Ａおよび図４６Ｂの例では、第１ベクトル〜第３ベクトルのうち、Ｘ成分の大きさが最も大きいのは第３ベクトルである。したがって、第３ベクトルのＸ成分の値がXmaxとなる。同様に、第１ベクトル〜第３ベクトルのうち、Ｘ成分の大きさが最も小さいのは第１ベクトルである。したがって、第１ベクトルのＸ成分の値がXminとなる。Ｙ成分およびＺ成分についても同様である。
【０１８３】
Xmax，Xmin，Ymax，Ymin，Zmax，Zmin の６つの値から修正ベクトルを求める方法としては、種々の方法が考えられる。ここでは、２つの代表的な方法について説明する。
【０１８４】
第１の方法は、( Xmax＋Xmin, Ymax＋Ymin, Zmax＋Zmin )を修正ベクトルとして利用する方法である。すなわち、第１の方法では、各成分の最大値と最小値の合計値を、修正ベクトルにおける対応する成分の値として利用する。図４６Ａは、当該第１の方法で決定された修正ベクトルを示している。
【０１８５】
第２の方法は、(( Xmax + Xmin ) / 2, ( Ymax + Ymin ) / 2, ( Zmax + Zmin ) / 2))を修正ベクトルとして利用する方法である。すなわち、第２の方法では、各成分の最大値と最小値の平均値を、修正ベクトルにおける対応する成分の値として利用する。図４６Ｂは、当該第２の方法で決定された修正ベクトルを示している。
【０１８６】
なお、第１の方法で決定した修正ベクトルは、第２の方法で決定した修正ベクトルに対して、方向が同じで、大きさのみが２倍となる。したがって、例えば、修正ベクトルの大きさに比例した距離だけ移動させるように注目ノードの位置を補正すると仮定した場合には、第１の方法で決定した修正ベクトルを持いて補正する方が、第２の方法で決定した修正ベクトルを用いて補正する場合と比較して、注目ベクトルの補正量は２倍になり、補正の効果が大きくなる。
【０１８７】
なお、第１の方法では、各成分の最大値と最小値の合計値を、修正ベクトルにおける対応する成分の値として利用しているが、これに替えて、各成分の最大値と最小値の合計値に所定の係数を乗じた合成値を、修正ベクトルにおける対応する成分の値として利用してもよい。当該所定の係数として例えば「0.5」を用いる場合には、第２の方法で決定した修正ベクトルと同じ修正ベクトルを得ることができる。
【０１８８】
図４５の例において、上記のような第１の方法や第２の方法で修正ベクトルを決定すると、修正ベクトルの大きさはほぼ０になる。したがって、前述した例（第１ベクトル〜第３ベクトルを全て加算た結果として得られるベクトルに従って注目ノードの位置を移動させる例）のようにキャラクタオブジェクトの特定部分だけが際だって不自然に見えてしまうような不具合は生じない。
【０１８９】
［サブノード処理の詳細］
次に、図４０を参照して、図３６のステップＳ２１のサブノード処理の詳細を説明する。
【０１９０】
本実施形態において、各サブノードは、第１タイプサブノードまたは第２タイプサブノードのいずれか一方に予め分類されている。各サブノードが第１タイプサブノードと第２タイプサブノードのどちらに分類されているのかは、サブノード毎に予め定義されているものとする。
【０１９１】
ステップＳ７０においてＣＰＵ１０は、各第１タイプサブノードの「位置」および「向き」を決定する。仮想空間における第１タイプサブノードの位置および向きは、当該第１タイプサブノードに接続された１つ以上のノードのうちの予め定められた１つの特定のノード（本実施形態では親ノードとする）の仮想空間における位置および向きと、基準姿勢とに基づいて、一意に決定される。第１タイプサブノードの「位置」（Jnc.pos）および「向き」（Jnc.rot）は、例えば以下のようなプログラムコードによって計算される。
【０１９２】
Jnc.pos = Parent( Jnc ).rot * Ja.pos＿local + Parent( Jnc ).pos
Jnc.rot = Parent( Jnc ).rot * Ja.rot＿local
【０１９３】
上記プログラムコードにおいて、「Parent( Jnc ).pos」および「Parent( Jnc ).rot」は、親ノードの「位置」および「向き」をそれぞれ示している。また、「Ja.pos＿local」および「Ja.rot＿local」は、基準姿勢情報における当該第１タイプサブノードの「親ノードに対する相対位置」および「親ノードに対する相対向き」をそれぞれ示している。
【０１９４】
ステップＳ７１においてＣＰＵ１０は、第２タイプサブノード処理を実行する。第２タイプサブノード処理は、各第２タイプサブノードの「位置」および「向き」を決定するための処理である。仮想空間における第２タイプサブノードの位置および向きは、当該第２タイプサブノードに接続された親ノードおよび子ノードの仮想空間における位置および向きと、基準姿勢とに基づいて、一意に決定される。第２タイプサブノードに接続された親ノードおよび子ノードの仮想空間における位置および向きは、前述のメインノード処理または上記ステップＳ７０の処理によってすでに決定されているものとする。以下、図４１を参照して、当該第２タイプサブノード処理の詳細を説明する。
【０１９５】
［第２タイプサブノード処理の詳細］
ステップＳ８０においてＣＰＵ１０は、第２タイプサブノードの中から、未選択の第２タイプサブノード（すなわち、「位置」と「向き」が未決定の第２タイプサブノード）を１つ選択する。以下のステップＳ８１〜ステップＳ８５の説明において、単に「第２タイプサブノード」と記載した場合には、当該ステップＳ８０で選択された第２タイプサブノードを指すものとする。
【０１９６】
ステップＳ８１においてＣＰＵ１０は、第２タイプサブノードと親ノードの間の基準距離（Lp）と、第２タイプサブノードと子ノードの間の基準距離（Lc）と、仮想空間における親ノードと子ノードの間の距離（Lpc）を計算する。Lp, Lc, Lpcは、例えば以下のようなプログラムコードによって計算される。
【０１９７】
Lp = | Ja.pos - Parent( Ja ).pos |
Lc = | Ja.pos - Child( Ja ).pos |
Lpc = | Parent( Jnc ).pos - Child( Jnc ).pos |
【０１９８】
上記プログラムコードにおいて、「Ja.pos」は、基準姿勢における第２タイプサブノードの位置を示しており、「Parent( Ja ).pos」および「Child( Ja ).pos」は、基準姿勢における親ノードおよび子ノードの位置をそれぞれ示している。また、「Parent( Jnc ).pos」および「Child( Jnc ).pos」は、仮想空間における親ノードおよび子ノードの位置をそれぞれ示している。
【０１９９】
ステップＳ８２においてＣＰＵ１０は、仮想空間における第２タイプサブノードの「仮の向き」（rot'）を計算する。当該「仮の向き」（rot'）は、仮想空間における親の向きと、基準姿勢における親の向きに対する処理対象ノードの相対向きとから仮に求めた、仮想空間における処理対象ノードの向きである。「仮の向き」（rot'）は、例えば以下のようなプログラムコードによって計算される。
【０２００】
rot’ = Parent( Jnc ).rot * Ja.rot
【０２０１】
上記プログラムコードにおいて、「Parent( Jnc ).rot」は、仮想空間における親ノードの向きを示しており、「Ja.rot」は、基準姿勢における第２タイプサブノードの向きを示している。
【０２０２】
ステップＳ８３においてＣＰＵ１０は、親ノードと子ノードを結ぶ直線に対する第２タイプサブノードの突き出し方向を計算する。具体的には、子ノードから親ノードに向かうベクトル（pc）と、ステップＳ８２で計算した「仮の向き」（rot’）に基づいて、第２タイプサブノードの突き出し方向を計算する。第２タイプサブノードの突き出し方向は、第２タイプサブノードが表している間接の回転軸に対して直交する方向である。第２タイプサブノードが表している間接の回転軸は、第２タイプサブノード毎に予め定義されているものとする。例えば、図４７の例では、右膝ノードの回転軸は、右膝ノードの向きを表すローカル座標系のｘ軸である。このように、第２タイプサブノードの向きを表すローカル座標系のｘ軸が、当該第２タイプサブノードの回転軸として定義されている場合には、第２タイプサブノードの突き出し方向（v）は、例えば以下のようなプログラムコードによって計算される。
【０２０３】
v = Xaxis( rot’ ) × pc / | pc |
【０２０４】
ステップＳ８４においてＣＰＵ１０は、親ノードと子ノードを結ぶ直線に対する第２タイプサブノードの突き出し長さを計算する。突き出し長さ（Lv）は、Lp，Lc，Lpcを用いて、例えば以下のようなプログラムコードによって計算される（図４７参照）。
【０２０５】
p = ( Lc * Lc - Lp * Lp + Lpc * Lpc ) / ( 2 * Lpc )
Lv = ( Lc * Lc - p * p ) ^ 0.5
【０２０６】
ステップＳ８５においてＣＰＵ１０は、仮想空間における第２タイプサブノードの「位置」と「向き」を決定する。仮想空間における第２タイプサブノードの「位置」（Jnc.pos）は、例えば以下のようなプログラムコードによって計算される。
【０２０７】
Jnc.pos = Child( Jnc ).pos + p * pc / | pc | + Lv * v
【０２０８】
仮想空間における第２タイプサブノードの「向き」（Jnc.rot）は、第２タイプサブノードの「位置」と、親ノードもしくは子ノードの「位置」等を考慮して、適切な向きを設定する。
【０２０９】
ステップＳ８６においてＣＰＵ１０は、全ての第２タイプサブノードがすでに選択されたかどうか（すなわち、全ての第２タイプサブノードの「位置」と「向き」がすでに決定されたかどうか）を判断する。そして、全ての第２タイプサブノードがすでに選択されている場合には第２タイプサブノード処理を終了し、まだ選択されていない第２タイプサブノードが存在する場合には処理はステップＳ８０に戻る。
【０２１０】
上記のような処理により、複数のノードで構成されるキャラクタオブジェクトの姿勢が、基準姿勢に基づいて、自然な姿勢となるように制御される。
【０２１１】
特に、仮想空間における一部のメインノードの位置または向きを指定したときに、残りのメインノードの位置および向きが基準姿勢に基づくバネ演算処理によって計算されるため、各関節の可動範囲等のパラメータを特に設定しなくても、仮想空間におけるキャラクタオブジェクトの姿勢は見た目に自然となる。
【０２１２】
また、仮想空間におけるサブノードの位置および向きについても基準姿勢に基づいて決定されるため、各関節の可動範囲等のパラメータを特に設定しなくても、仮想空間におけるキャラクタオブジェクトの姿勢は見た目に自然となる。
【０２１３】
また、キャラクタオブジェクトを構成する全ノードのうちの一部のノード（メインノード）のみを対象としてバネ演算処理を行っているので、全ノードを対象としてバネ演算処理を行う場合と比較して、全体的な処理負荷を低減することができる。
【０２１４】
なお、本実施形態では、人間を模したキャラクタオブジェクトの姿勢を制御する例を説明したが、本発明はこれに限らず、複数のノードで構成される任意のオブジェクトの姿勢の制御に利用することができる。
【０２１５】
また、本実施形態では、３次元の仮想空間に配置された３次元のオブジェクトの姿勢を制御する例を説明したが、本発明はこれに限らず、２次元のオブジェクトの姿勢の制御にも利用することができる。
【０２１６】
また、本発明は、仮想空間に存在するオブジェクトをプレイヤがインタラクティブに操作するものに限定されるものではなく、例えば、仮想空間においてコンピュータによって自動的に移動制御されるオブジェクト（例えば犬など）を、プレイヤが画面上で単に観察するようなものにも適用できる。この場合、入力装置は必ずしも必要ない。
【０２１７】
また、本実施形態では、据置型のゲーム装置に本発明を適用した例を説明したが、本発明は、携帯型ゲーム装置や、携帯電話や、一般的なパーソナルコンピュータ等の任意の情報処理装置に適用することができる。
【０２１８】
また、本実施形態では、各ノードの位置および向きの両方を制御する例を説明したが、位置または向きのいずれか一方を固定とし、残りの一方のみを制御するようにしても構わない。
【０２１９】
また、本実施形態では、バネ演算処理において、図３８のステップＳ４０〜ステップＳ５１の一連の処理を所定回数繰り返す例を説明したが、本発明はこれに限らず、ステップＳ４０〜ステップＳ５１の一連の処理を繰り返すことなく（すなわち、１度だけ実行して）、バネ演算処理を終了するようにしても構わない。
【０２２０】
また、本実施形態では、補正処理において、図３９のステップＳ６０〜ステップＳ６６の一連の処理を所定回数繰り返す例を説明したが、本発明はこれに限らず、ステップＳ６０〜ステップＳ６６の一連の処理を繰り返すことなく（すなわち、１度だけ実行して）、補正処理を終了するようにしても構わない。
【０２２１】
また、本実施形態では、キャラクタオブジェクトを構成する全ノードをメインノードとサブノードに分類し、それぞれ異なる方法で位置と向きを決定しているが、本発明はこれに限らず、全ノードに対してメインノード処理またはサブノード処理のいずれか一方だけを共通に実行して、各ノードの位置および向きを決定するようにしてもよい。
【０２２２】
また、本実施形態では、バネ演算処理によってメインノードの位置および向きを決定した後に、補正処理によって、これらのメインノードの位置および向きを必要に応じて補正しているが、当該補正処理は、任意の手法によって決定されたノードの位置および向きを補正する手法として汎用的に利用することができる。
【符号の説明】
【０２２３】
１…ゲームシステム
２…モニタ
２ａ、７０６…スピーカ
３…ゲーム装置
４…光ディスク
５…ゲーム装置本体
６…入力装置
１０…ＣＰＵ
１１…システムＬＳＩ
１２…外部メインメモリ
１３…ＲＯＭ／ＲＴＣ
１４…ディスクドライブ
１５…ＡＶ−ＩＣ
１６…ＡＶコネクタ
１７…フラッシュメモリ
１８…無線通信モジュール
１９…無線コントローラモジュール
２０…拡張コネクタ
２１…外部メモリカード用コネクタ
２２、２３…アンテナ
２４…電源ボタン
２５…リセットボタン
２６…イジェクトボタン
３１…入出力プロセッサ
３２…ＧＰＵ
３３…ＤＳＰ
３４…ＶＲＡＭ
３５…内部メインメモリ
７…コントローラ
７１、７６３…ハウジング
７２、７６１…操作部
７３、９７、７３２…コネクタ
７３１…接続ケーブル
７４…撮像情報演算部
７４１…赤外線フィルタ
７４２…レンズ
７４３…撮像素子
７４４…画像処理回路
７５…通信部
７５１、９４…マイコン
７５２…メモリ
７５３…無線モジュール
７５４…アンテナ
７６…サブユニット
７００…基板
７０１、７６２…加速度センサ
７０２…ＬＥＤ
７０４…バイブレータ
７０７…サウンドＩＣ
７０８…アンプ
８…マーカ
９…角速度検出ユニット
９１…ボタン
９２…カバー
９３…プラグ
９５…２軸ジャイロセンサ
９６…１軸ジャイロセンサ
【図１】
2011008445.tif 000003
【図２】
2011008445.tif 000004
【図３】
2011008445.tif 000005
【図４】
2011008445.tif 000006
【図５】
2011008445.tif 000007
【図６】
2011008445.tif 000008
【図７】
2011008445.tif 000009
【図８】
2011008445.tif 000010
【図９】
2011008445.tif 000011
【図１０Ａ】
2011008445.tif 000012
【図１０Ｂ】
2011008445.tif 000013
【図１０Ｃ】
2011008445.tif 000014
【図１１Ａ】
2011008445.tif 000015
【図１１Ｂ】
2011008445.tif 000016
【図１１Ｃ】
2011008445.tif 000017
【図１２】
2011008445.tif 000018
【図１３】
2011008445.tif 000019
【図１４】
2011008445.tif 000020
【図１５】
2011008445.tif 000021
【図１６Ａ】
2011008445.tif 000022
【図１６Ｂ】
2011008445.tif 000023
【図１６Ｃ】
2011008445.tif 000024
【図１７Ａ】
2011008445.tif 000025
【図１７Ｂ】
2011008445.tif 000026
【図１７Ｃ】
2011008445.tif 000027
【図１８】
2011008445.tif 000028
【図１９】
2011008445.tif 000029
【図２０】
2011008445.tif 000030
【図２１】
2011008445.tif 000031
【図２２】
2011008445.tif 000032
【図２３】
2011008445.tif 000033
【図２４】
2011008445.tif 000034
【図２５Ａ】
2011008445.tif 000035
【図２５Ｂ】
2011008445.tif 000036
【図２６Ａ】
2011008445.tif 000037
【図２６Ｂ】
2011008445.tif 000038
【図２７】
2011008445.tif 000039
【図２８】
2011008445.tif 000040
【図２９Ａ】
2011008445.tif 000041
【図２９Ｂ】
2011008445.tif 000042
【図２９Ｃ】
2011008445.tif 000043
【図２９Ｄ】
2011008445.tif 000044
【図３０】
2011008445.tif 000045
【図３１】
2011008445.tif 000046
【図３２】
2011008445.tif 000047
【図３３】
2011008445.tif 000048
【図３４】
2011008445.tif 000049
【図３５】
2011008445.tif 000050
【図３６】
2011008445.tif 000051
【図３７】
2011008445.tif 000052
【図３８】
2011008445.tif 000053
【図３９】
2011008445.tif 000054
【図４０】
2011008445.tif 000055
【図４１】
2011008445.tif 000056
【図４２Ａ】
2011008445.tif 000057
【図４２Ｂ】
2011008445.tif 000058
【図４３Ａ】
2011008445.tif 000059
【図４３Ｂ】
2011008445.tif 000060
【図４３Ｃ】
2011008445.tif 000061
【図４４Ａ】
2011008445.tif 000062
【図４４Ｂ】
2011008445.tif 000063
【図４５】
2011008445.tif 000064
【図４６Ａ】
2011008445.tif 000065
【図４６Ｂ】
2011008445.tif 000066
【図４７】
2011008445.tif 000067
【図４８】
2011008445.tif 000068