(57)【特許請求の範囲】
【請求項１】
所定の反復動作を行うユーザの荷重を示す荷重値に基づいて所定の情報処理を行うコンピュータに実行させる情報処理プログラムであって、
荷重検出装置からの信号に基づいて前記ユーザの荷重を示す荷重値を取得する荷重値取得ステップ、
前記荷重値取得ステップによって取得された荷重値に基づいて、前記ユーザの前記反復動作における第１動作の開始を検出する第１動作開始検出ステップ、および
前記第１動作開始検出ステップによって検出された第１動作の開始時が、表示装置に表示されるオブジェクトのアニメーションフレームについて当該第１動作に対応して設定される第１所定区間外であるとき、当該アニメーションフレームの更新速度が所定の速度となるように速くする更新速度制御ステップを、前記コンピュータに実行させる、情報処理プログラム。
【請求項２】
前記更新速度制御ステップは、前記第１動作開始検出ステップによって検出された第１動作の開始時が、前記第１所定区間内であるとき、前記アニメーションフレームの更新速度が前記所定の速度より小さい速度となるように速くする、請求項１記載の情報処理プログラム。
【請求項３】
前記第１動作の開始時が前記第１所定区間外であるとき、前記更新速度制御ステップによって速くされた更新速度で、当該第１所定区間まで前記アニメーションフレームを更新するフレーム更新ステップを前記コンピュータにさらに実行させる、請求項１または２記載の情報処理プログラム。
【請求項４】
前記更新速度制御ステップは、前記第１所定区間では、前記アニメーションフレームの更新速度を減速する、請求項１ないし３のいずれかに記載の情報処理プログラム。
【請求項５】
前記更新速度制御ステップは、前記第１所定区間では、当該第１所定区間の終期に向かうに従って前記アニメーションフレームの更新速度を減速する、請求項４記載の情報処理プログラム。
【請求項６】
前記反復動作は、前記第１動作とは異なる第２動作を含む、請求項１ないし５のいずれかに記載の情報処理プログラム。
【請求項７】
前記第１動作は、前記オブジェクトが推進力を得るための動作であり、前記第２動作は、当該推進力を得るための動作の準備動作である、請求項６記載の情報処理プログラム。
【請求項８】
前記荷重値取得ステップによって取得された荷重値に基づいて、前記ユーザの前記反復動作における第２動作の開始を検出する第２動作開始検出ステップを前記コンピュータにさらに実行させ、
前記更新速度制御ステップは、前記第２動作開始検出ステップによって第２動作の開始が検出されたときに、前記アニメーションフレームの更新速度を速くする、請求項６または７記載の情報処理プログラム。
【請求項９】
前記更新速度制御ステップは、前記第２動作開始検出ステップによって検出された第２動作の開始時が、前記オブジェクトのアニメーションフレームについて当該第２動作に対応して設定される第２所定区間内であるとき、前記第２動作の開始時が当該第２所定区間外である場合よりも、前記アニメーションフレームの更新速度を速くする、請求項８記載の情報処理プログラム。
【請求項１０】
前記第２所定区間は前記第１所定区間より長く設定される、請求項９記載の情報処理プログラム。
【請求項１１】
前記第２所定区間に対応する前記オブジェクトのアニメーションフレームは前記第２動作の予備動作に対応するアニメーションフレームを含む、請求項１０記載の情報処理プログラム。
【請求項１２】
前記反復動作は、前記荷重値の変化の大きい大反復動作または当該大反復動作よりも前記荷重値の変化の小さい小反復動作であり、
前記荷重値の変化の周期に基づいて、前記ユーザの動作が前記大反復動作であるか前記小反復動作であるかを判別する動作判別ステップ、および
前記荷重値の変化に基づいて、前記第１動作および前記第２動作を検出する動作検出ステップをさらに実行させ、
前記更新速度制御ステップは、前記動作判別ステップによって前記ユーザの動作が前記大反復動作であることが判別されたとき、前記動作検出ステップによって検出された前記第１動作および前記第２動作に応じて前記アニメーションフレームの更新速度を変化させる、請求項６ないし１１のいずれかに記載の情報処理プログラム。
【請求項１３】
前記更新速度制御ステップは、前記動作判別ステップによって前記ユーザの動作が前記小反復動作であることが判別されたとき、前記動作検出ステップによって検出された前記第１動作のみに応じて前記アニメーションフレームの更新速度を変化させる、請求項１２記載の情報処理プログラム。
【請求項１４】
前記第１所定区間の最初のアニメーションフレームは、前記第１動作開始検出ステップによって検出された第１動作の開始時におけるユーザの姿勢に対応する、請求項１記載の情報処理プログラム。
【請求項１５】
前記第１所定区間の最初のアニメーションフレームは、前記第１動作開始検出ステップによって検出された第１動作の開始時におけるユーザの姿勢に対応し、
前記第２所定区間の最初のアニメーションフレームは、前記第２動作開始検出ステップによって検出された第２動作の開始以前におけるユーザの姿勢に対応する、請求項９記載の情報処理プログラム。
【請求項１６】
所定の反復動作を行うユーザの荷重を示す荷重値に基づいて所定の情報処理を行う情報処理装置であって、
荷重検出装置からの信号に基づいて前記ユーザの荷重を示す荷重値を取得する荷重値取得手段、
前記荷重値取得手段によって取得された荷重値に基づいて、前記ユーザの前記反復動作における所定の動作の開始を検出する動作開始検出手段、および
前記動作開始検出手段によって検出された所定の動作の開始時が、表示装置に表示されるオブジェクトについての当該所定の動作に対応して設定されるアニメーションフレームの所定区間外であるとき、当該アニメーションフレームの更新速度が所定の速度となるように速くする更新速度制御手段を備える、情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は情報処理プログラムおよび情報処理装置に関し、特にたとえば、ユーザの荷重を示す荷重値を用いて操作する、情報処理プログラムおよび情報処理装置に関する。
【背景技術】
【０００２】
この種の情報処理装置の一例が特許文献１に開示されている。この特許文献１のゲーム装置では、４つの荷重センサを備えるゲームコントローラの支持板に、プレイヤが足を乗せ、４つの荷重センサによって検出される荷重値が操作データとして入力される。したがって、ゲーム装置では、操作データとして入力された荷重値に基づいてゲーム処理が実行される。たとえば、フラフープのゲーム処理では、プレイヤがゲームコントローラ上に乗り、このゲームコントローラの四隅に備えられた４つの荷重センサのうち、検出される荷重値が最大となる荷重センサが配置される位置に応じて、プレイヤキャラクタの腰の位置が決定される。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００８−２６４１９５号［A63F 13/04,A63F 13/00］
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかし、特許文献１のゲーム装置では、検出される荷重値が最大となる荷重センサが配置される位置に応じて、プレイヤキャラクタの腰の位置が決定されるだけなので、プレイヤの動作に対してプレイヤキャラクタのアニメーションフレームが遅延してしまうことがある。また、荷重値に基づいてアニメーションフレームを補正したとしても、単に荷重値が最大となる荷重センサが配置される位置にプレイヤキャラクタの腰の位置が来るように移動されるだけなので、ゲーム画面を見たプレイヤは違和感を覚えてしまう。つまり、フラフープを行うようなプレイヤの反復動作とプレイヤキャラクタのアニメーションとを同期されることについては改善の余地があった。
【０００５】
それゆえに、この発明の主たる目的は、新規な、情報処理プログラムおよび情報処理装置を提供することである。
【０００６】
また、この発明の他の目的は、ユーザの動作とオブジェクトのアニメーションとを円滑に同期させることができる、情報処理プログラムおよび情報処理装置を提供することができる。
【課題を解決するための手段】
【０００７】
第１の発明は、所定の反復動作を行うユーザの荷重を示す荷重値に基づいて所定の情報処理を行うコンピュータに実行させる情報処理プログラムである。荷重値取得ステップは、荷重検出装置からの信号に基づいてユーザの荷重を示す荷重値を取得する。第１動作開始検出ステップは、荷重値取得ステップによって取得された荷重値に基づいて、ユーザの反復動作における第１動作の開始を検出する。つまり、反復動作のうちの一部の動作の開始が検出される。更新速度制御ステップは、第１動作開始検出ステップによって検出された第１動作の開始時が、表示装置に表示されるオブジェクトのアニメーションフレームについて当該第１動作に対応して設定される第１所定区間外であるとき、当該アニメーションフレームの更新速度が所定の速度となるように速くする。これによって、アニメーションフレームの進行の遅延が解消される。
【０００８】
第１の発明によれば、第１動作の開始時が第１所定区間外である場合には、アニメーションフレームの更新速度を速くするので、アニメーションフレームの進行の遅延を解消して、ユーザの動作とアニメーションとを円滑に同期させることができる。
【０００９】
第２の発明は、第１の発明に従属し、更新速度制御ステップは、第１動作開始検出ステップによって検出された第１動作の開始時が、第１所定区間内であるとき、アニメーションフレームの更新速度が所定の速度よりも小さい速度となるように速くする。つまり、所定の速度は、第１動作の開始時が第１所定区間内である場合のアニメーションフレームの更新速度よりも大きい値に設定される。
【００１０】
第２の発明によれば、所定の速度は、第１動作の開始時が第１所定区間内である場合のアニメーションフレームの更新速度よりも大きいので、第１動作の開始時が第１所定区間外である場合には、アニメーションフレームを高速に進行させて、その遅延を解消することができる。
【００１１】
第３の発明は、第１または第２の発明に従属し、フレーム更新ステップは、第１動作の開始時が第１所定区間外であるとき、更新速度制御ステップによって速くされた更新速度で、当該第１所定区間までアニメーションフレームを更新する。つまり、等速で第１所定区間までアニメーションフレームが進行される。
【００１２】
第３の発明によれば、速い更新速度で第１所定区間までアニメーションフレームを進行させるので、アニメーションの遅延を解消することができる。
【００１３】
第４の発明は、第１ないし第３の発明のいずれかに従属し、更新速度制御ステップは、第１所定区間では、アニメーションフレームの更新速度を減速する。
【００１４】
第４の発明によれば、たとえば、第１動作が減速する動きを含む場合に、それをアニメーションで表現することができる。
【００１５】
第５の発明は、第４の発明に従属し、更新速度制御ステップは、第１所定区間では、その終期に向かうに従ってアニメーションフレームの更新速度を減速する。
【００１６】
第５の発明によれば、たとえば、第１動作が次第に減速するような動きである場合に、それをアニメーションで表現することができる。
【００１７】
第６の発明は、第１ないし第５の発明に従属し、反復動作は、第１動作と、この第１動作とは異なる第２動作とを含む。したがって、第１動作と第２動作とが繰り返し実行される。
【００１８】
第６の発明によれば、第１動作と第２動作とが繰り返し実行され、少なくとも、第１動作が同期するようにアニメーションフレームが更新されるので、結果的に第１動作および第２動作を含むユーザの動作とアニメーションとの同期を取ることができる。
【００１９】
第７の発明は第６の発明に従属し、第１動作は、オブジェクトが推進力を得るための動作であり、第２の動作は、当該推進力を得るための動作の準備運動である。つまり、推進力を得るための動作とその準備運動とによって反復動作が成り立っている。
【００２０】
第７の発明によれば、第１動作の開始が検出され、これによってオブジェクトは推進力を得るため、アニメーションフレームを速く進行させることにより、オブジェクトが推進力を得たことを表現することができる。
【００２１】
第８の発明は、第６または第７の発明に従属し、荷重値取得ステップによって取得された荷重値に基づいて、ユーザの反復動作における第２動作の開始を検出する第２動作開始検出ステップをコンピュータにさらに実行させる。更新速度制御ステップは、第２動作開始検出ステップによって第２動作の開始が検出されたとき、アニメーションフレームの更新速度を速くする。かかる場合にも、アニメーションフレームの進行の遅延が解消される。
【００２２】
第８の発明によれば、第２動作の開始が検出された場合もアニメーションフレームの進行の遅延が解消されるので、ユーザの動作とアニメーションとを円滑に同期させることができる。
【００２３】
第９の発明は、第８の発明に従属し、更新速度制御ステップは、第２動作開始検出ステップによって検出された第２動作の開始時が、オブジェクトのアニメーションフレームについて当該第２動作に対応して設定される第２所定区間内であるとき、第２動作の開始時が当該第２所定区間外である場合よりも、アニメーションフレームの更新速度を速くする。
【００２４】
第９の発明によれば、第２動作の開始時が第２所定区間内である場合には、アニメーションフレームの更新速度を速くするので、第２動作を検出した後に、次の第１動作を検出するまでにアニメーションフレームを第１所定区間近辺に近付けることができる。したがって、ユーザの動作とアニメーションとの同期を取り易くすることができる。
【００２５】
第１０の発明は、第９の発明に従属し、第２所定区間は第１所定区間より長く設定される。
【００２６】
第１０の発明によれば、第２所定区間は第１所定区間よりも長く設定されるので、第２動作を検出した後に、次の第１動作を検出するまでに、アニメーションフレームを第１所定区間近辺に近付け易くすることができる。
【００２７】
第１１の発明は、第１０の発明に従属し、第２所定区間に対応するオブジェクトのアニメーションフレームは、第２動作の予備動作に対応するアニメーションフレームを含む。つまり、第２所定区間は、第２動作の開始時に相当するアニメーションフレームよりも前のアニメーションフレームを含む。
【００２８】
第１１の発明においても第１０の発明と同様に、アニメーションフレームを第１所定区間近辺に近付け易くすることができる。
【００２９】
第１２の発明は、第６ないし第１１の発明に従属し、反復動作は、荷重値の変化の大きい大反復動作または当該大反復動作よりも荷重値の変化の小さい小反復動作である。動作判別ステップは、荷重値の変化の周期に基づいて、ユーザの動作が大反復動作であるか小反復動作であるかを判別する。また、動作検出ステップは、荷重値の変化に基づいて、第１動作および第２動作を検出する。更新速度制御ステップは、動作判別ステップによってユーザの動作が大反復動作であることが判別されたとき、動作検出ステップによって検出された第１動作および第２動作に応じてアニメーションフレームの更新速度を変化させる。
【００３０】
第１２の発明によれば、大反復動作が判別された場合には、第１動作および第２動作に応じてアニメーションフレームの更新速度を変化させるので、つまり第１動作および第２動作の両方に応じてアニメーションフレームの更新を制御するので、ユーザの動作とアニメーションフレームとの同期をより正確に取ることができる。
【００３１】
第１３の発明は、第１２の発明に従属し、更新速度制御ステップは、動作判別ステップによってユーザの動作が小反復動作であることが判別されたとき、動作検出ステップによって検出された第１動作のみに応じてアニメーションフレームの更新速度を変化させる。
【００３２】
第１３の発明によれば、小反復動作である場合には、第１動作のみに応じてアニメーションの更新速度を変化させても、ユーザの動作とアニメーションフレームとの同期を取ることができる。
【００３３】
第１４の発明は、第１の発明に従属し、第１所定区間の最初のアニメーションフレームは、第１動作開始検出ステップによって検出された第１動作の開始時におけるユーザの姿勢に対応する。
【００３４】
第１４の発明によれば、第１所定区間の最初のアニメーションフレームは第１動作の開始時におけるユーザの姿勢に対応するので、第１所定区間外で第１動作の開始時を検出した場合に、アニメーションフレームの更新速度を速くして第１所定区間に近付けることにより、アニメーションフレームの進行の遅延を解消することができる。
【００３５】
第１５の発明は、第９の発明に従属し、第１所定区間の最初のアニメーションフレームは、第１動作開始検出ステップによって検出された第１動作の開始時におけるユーザの姿勢に対応し、第２所定区間の最初のアニメーションフレームは、第２動作開始検出ステップによって検出された第２動作の開始以前におけるユーザの姿勢に対応する。
【００３６】
第１５の発明によれば、第２所定区間の最初のアニメーションは、第２動作の開始以前におけるユーザの姿勢に対応するので、第１４の発明の効果に加えて、第２所定区間内で第２動作の開始時を検出した場合には、出来る限り速くアニメーションフレームを第１所定区間に近付けることができる。
【００３７】
第１６の発明は、所定の反復動作を行うユーザの荷重を示す荷重値に基づいて所定の情報処理を行う情報処理装置であって、荷重検出装置からの信号に基づいてユーザの荷重を示す荷重値を取得する荷重値取得手段、荷重値取得手段によって取得された荷重値に基づいて、ユーザの反復動作における所定の動作の開始を検出する動作開始検出手段、および動作開始検出手段によって検出された所定の動作の開始時が、表示装置に表示されるオブジェクトについての当該所定の動作に対応して設定されるアニメーションフレームの所定区間外であるとき、当該アニメーションフレームの更新速度が所定の速度となるように速くする更新速度制御手段を備える、情報処理装置である。
【００３８】
第１６の発明においても、第１の発明と同様に、ユーザの動作とアニメーションとを円滑に同期させることができる。
【発明の効果】
【００３９】
この発明によれば、反復動作における第１動作の開始時がアニメーションフレームについて当該第１動作に対応して設定される第１所定期間外である場合には、速い更新速度でアニメーションフレームを更新するので、アニメーションの進行の遅延を解消して、ユーザの動作とアニメーションとを円滑に同期させることができる。
【００４０】
この発明の上述の目的，その他の目的，特徴および利点は、図面を参照して行う以下の実施例の詳細な説明から一層明らかとなろう。
【図面の簡単な説明】
【００４１】
【図１】図１はこの発明のゲームシステムの一実施例を示す図解図である。
【図２】図２は図１に示すゲームシステムの電気的な構成を示すブロック図である。
【図３】図３は図１に示すコントローラの外観を説明するための図解図である。
【図４】図４は図３に示すコントローラの電気的な構成を示すブロック図である。
【図５】図５は図１に示す荷重コントローラの外観を説明するための図解図である。
【図６】図６は図５に示す荷重コントローラの断面図である。
【図７】図７は図５に示す荷重コントローラの電気的な構成を示すブロック図である。
【図８】図８は図１に示すコントローラおよび荷重コントローラを用いて仮想ゲームをプレイするときの状態を概説するための図解図である。
【図９】図９は図１に示すマーカおよびコントローラの視野角を説明するための図解図である。
【図１０】図１０は対象画像を含む撮像画像の一例を示す図解図である。
【図１１】図１１は図１に示すモニタに表示されるゲーム画面の例を示す図解図である。
【図１２】図１２はこの実施例の仮想ゲームをプレイするときのプレイヤの動作の例を示す図解図である。
【図１３】図１３は図１２（Ａ）に示すようにプレイヤが大羽ばたき動作を行った際に検出される体重率の時間変化およびその周波数スペクトルを示すグラフである。
【図１４】図１４は図１２（Ｂ）に示すようにプレイヤが小羽ばたき動作を行った際に検出される体重率の時間変化およびその周波数スペクトルを示すグラフである。
【図１５】図１５はプレイヤが屈伸運動を行った際に検出される体重率の時間変化およびその周波数スペクトルを示すグラフである。
【図１６】図１６は荷重コントローラで検出されるプレイヤの重心位置およびそれに対応するプレイヤオブジェクトの向きを示すための図解図である。
【図１７】図１７は荷重コントローラで検出されるプレイヤの重心位置に対応する下降時以外におけるプレイヤオブジェクトの向きを示すための図解図である。
【図１８】図１８は荷重コントローラで検出されるプレイヤの重心位置に対応する下降時におけるプレイヤオブジェクトの向きを示すための図解図である。
【図１９】図１９はプレイヤオブジェクトについての一部のアニメーションフレームを示す図解図である。
【図２０】図２０は図２に示すメインメモリのメモリマップの例を示す図解図である。
【図２１】図２１は図２０に示すデータ記憶領域の具体的な内容を示す図解図である。
【図２２】図２２は図２に示すＣＰＵのゲーム全体処理の一部を示すフロー図である。
【図２３】図２３は図２に示すＣＰＵのゲーム全体処理の他の一部であって、図２２に後続するフロー図である。
【図２４】図２４は図２に示すＣＰＵのゲーム全体処理のその他の一部であって、図２３に後続するフロー図である。
【図２５】図２５は図２に示すＣＰＵのゲーム全体処理のさらに他の一部であって、図２４に後続するフロー図である。
【図２６】図２６は図２に示すＣＰＵの動作判別処理の一部を示すフロー図である。
【図２７】図２７は図２に示すＣＰＵの動作判別処理の他の一部であって、図２６に後続するフロー図である。
【図２８】図２８は図２に示すＣＰＵの動作判別処理のその他の一部であって、図２７に後続するフロー図である。
【図２９】図２９は図２に示すＣＰＵの同期処理の一部を示すフロー図である。
【図３０】図３０は図２に示すＣＰＵの同期処理の他の一部を示すフロー図である。
【図３１】図３１は図２に示すＣＰＵの同期処理のその他の一部であって、図２９および図３０に後続するフロー図である。
【発明を実施するための形態】
【００４２】
図１を参照して、この発明の一実施例であるゲームシステム１０は、ビデオゲーム装置（以下、単に「ゲーム装置」という）１２、コントローラ２２および荷重コントローラ３６を含む。なお、図示は省略するが、この実施例のゲーム装置１２は、最大４つのコントローラ（２２，３６）と通信可能に設計されている。また、ゲーム装置１２と各コントローラ（２２，３６）とは、無線によって接続される。たとえば、無線通信は、Ｂｌｕｅｔｏｏｔｈ（登録商標）規格に従って実行されるが、赤外線や無線ＬＡＮなど他の規格に従って実行されてもよい。
【００４３】
ゲーム装置１２は、略直方体のハウジング１４を含み、ハウジング１４の前面にはディスクスロット１６が設けられる。ディスクスロット１６から、情報処理プログラムの一例としてのゲームプログラム等を記憶した情報記憶媒体の一例である光ディスク１８が挿入されて、ハウジング１４内のディスクドライブ５４（図２参照）に装着される。ディスクスロット１６の周囲には、ＬＥＤと導光板が配置され、さまざまな処理に応答させて点灯させることが可能である。
【００４４】
また、ゲーム装置１２のハウジング１４の前面であり、その上部には、電源ボタン２０ａおよびリセットボタン２０ｂが設けられ、その下部には、イジェクトボタン２０ｃが設けられる。さらに、リセットボタン２０ｂとイジェクトボタン２０ｃとの間であり、ディスクスロット１６の近傍には、外部メモリカード用コネクタカバー２８が設けられる。この外部メモリカード用コネクタカバー２８の内側には、外部メモリカード用コネクタ６２（図２参照）が設けられ、図示しない外部メモリカード（以下、単に「メモリカード」という）が挿入される。メモリカードは、光ディスク１８から読み出したゲームプログラム等をローディングして一時的に記憶したり、このゲームシステム１０を利用してプレイしたゲームのゲームデータ（ゲームの結果データまたは途中データ）を保存（セーブ）しておいたりするために利用される。ただし、上記のゲームデータの保存は、メモリカードに対して行うことに代えて、たとえばゲーム装置１２の内部に設けられるフラッシュメモリ４４（図２参照）のような内部メモリに対して行うようにしてもよい。また、メモリカードは、内部メモリのバックアップメモリとして用いるようにしてもよい。
【００４５】
なお、メモリカードとしては、汎用のＳＤカードを用いることができるが、メモリスティックやマルチメディアカード（登録商標）のような他の汎用のメモリカードを用いることもできる。
【００４６】
ゲーム装置１２のハウジング１４の後面には、ＡＶコネクタ５８（図２参照）が設けられ、そのＡＶコネクタ５８を用いて、ＡＶケーブル３２ａを通してゲーム装置１２にモニタ３４およびスピーカ３４ａを接続する。このモニタ３４およびスピーカ３４ａは典型的にはカラーテレビジョン受像機であり、ＡＶケーブル３２ａは、ゲーム装置１２からの映像信号をカラーテレビのビデオ入力端子に入力し、音声信号を音声入力端子に入力する。したがって、カラーテレビ（モニタ）３４の画面上にたとえば３次元（３Ｄ）ビデオゲームのゲーム画像が表示され、左右のスピーカ３４ａからゲーム音楽や効果音などのステレオゲーム音声が出力される。また、モニタ３４の周辺（この実施例では、モニタ３４の上側）には、２つの赤外ＬＥＤ（マーカ）３４０ｍ，３４０ｎを備えるマーカ部３４ｂが設けられる。このマーカ部３４ｂは、電源ケーブル３２ｂを通してゲーム装置１２に接続される。したがって、マーカ部３４ｂには、ゲーム装置１２から電源が供給される。これによって、マーカ３４０ｍ，３４０ｎは発光し、それぞれモニタ３４の前方に向けて赤外光を出力する。
【００４７】
なお、ゲーム装置１２の電源は、一般的なＡＣアダプタ（図示せず）によって与えられる。ＡＣアダプタは家庭用の標準的な壁ソケットに差し込まれ、ゲーム装置１２は、家庭用電源（商用電源）を、駆動に適した低いＤＣ電圧信号に変換する。他の実施例では、電源としてバッテリが用いられてもよい。
【００４８】
このゲームシステム１０において、ユーザまたはプレイヤがゲーム（またはゲームに限らず、他のアプリケーション）をプレイするために、ユーザはまずゲーム装置１２の電源をオンし、次いで、ユーザはビデオゲーム（もしくはプレイしたいと思う他のアプリケーション）のプログラムを記録している適宜の光ディスク１８を選択し、その光ディスク１８をゲーム装置１２のディスクドライブ５４にローディングする。応じて、ゲーム装置１２がその光ディスク１８に記録されているプログラムに基づいてビデオゲームもしくは他のアプリケーションを実行し始めるようにする。ユーザはゲーム装置１２に入力を与えるためにコントローラ２２を操作する。たとえば、入力手段２６のどれかを操作することによってゲームもしくは他のアプリケーションをスタートさせる。また、入力手段２６に対する操作以外にも、コントローラ２２自体を動かすことによって、動画オブジェクト（プレイヤオブジェクト）を異なる方向に移動させ、または３Ｄのゲーム世界におけるユーザの視点（カメラ位置）を変化させることができる。
【００４９】
図２は図１実施例のビデオゲームシステム１０の電気的な構成を示すブロック図である。図示は省略するが、ハウジング１４内の各コンポーネントは、プリント基板に実装される。図２に示すように、ゲーム装置１２には、ＣＰＵ４０が設けられる。このＣＰＵ４０は、ゲームプロセッサとして機能する。このＣＰＵ４０には、システムＬＳＩ４２が接続される。このシステムＬＳＩ４２には、外部メインメモリ４６、ＲＯＭ／ＲＴＣ４８、ディスクドライブ５４およびＡＶ  ＩＣ５６が接続される。
【００５０】
外部メインメモリ４６は、ゲームプログラム等のプログラムを記憶したり、各種データを記憶したりし、ＣＰＵ４０のワーク領域やバッファ領域として用いられる。ＲＯＭ／ＲＴＣ４８は、いわゆるブートＲＯＭであり、ゲーム装置１２の起動用のプログラムが組み込まれるとともに、時間をカウントする時計回路が設けられる。ディスクドライブ５４は、光ディスク１８からプログラムデータやテクスチャデータ等を読み出し、ＣＰＵ４０の制御の下で、後述する内部メインメモリ４２ｅまたは外部メインメモリ４６に書き込む。
【００５１】
システムＬＳＩ４２には、入出力プロセッサ４２ａ、ＧＰＵ(Graphics Processor Unit)４２ｂ，ＤＳＰ(Digital Signal Processor)４２ｃ，ＶＲＡＭ４２ｄおよび内部メインメモリ４２ｅが設けられ、図示は省略するが、これらは内部バスによって互いに接続される。
【００５２】
入出力プロセッサ（Ｉ／Ｏプロセッサ）４２ａは、データの送受信を実行したり、データのダウンロードを実行したりする。データの送受信やダウンロードについては後で詳細に説明する。
【００５３】
ＧＰＵ４２ｂは、描画手段の一部を形成し、ＣＰＵ４０からのグラフィクスコマンド(作画命令)を受け、そのコマンドに従ってゲーム画像データを生成する。ただし、ＣＰＵ４０は、グラフィクスコマンドに加えて、ゲーム画像データの生成に必要な画像生成プログラムをＧＰＵ４２ｂに与える。
【００５４】
図示は省略するが、上述したように、ＧＰＵ４２ｂにはＶＲＡＭ４２ｄが接続される。ＧＰＵ４２ｂが作画コマンドを実行するにあたって必要なデータ（画像データ：ポリゴンデータやテクスチャデータなどのデータ）は、ＧＰＵ４２ｂがＶＲＡＭ４２ｄにアクセスして取得する。なお、ＣＰＵ４０は、描画に必要な画像データを、ＧＰＵ４２ｂを介してＶＲＡＭ４２ｄに書き込む。ＧＰＵ４２ｂは、ＶＲＡＭ４２ｄにアクセスして描画のためのゲーム画像データを作成する。
【００５５】
なお、この実施例では、ＧＰＵ４２ｂがゲーム画像データを生成する場合について説明するが、ゲームアプリケーション以外の任意のアプリケーションを実行する場合には、ＧＰＵ４２ｂは当該任意のアプリケーションについての画像データを生成する。
【００５６】
また、ＤＳＰ４２ｃは、オーディオプロセッサとして機能し、内部メインメモリ４２ｅや外部メインメモリ４６に記憶されるサウンドデータや音波形（音色）データを用いて、スピーカ３４ａから出力する音、音声或いは音楽に対応するオーディオデータを生成する。
【００５７】
上述のように生成されたゲーム画像データおよびオーディオデータは、ＡＶ  ＩＣ５６によって読み出され、ＡＶコネクタ５８を介してモニタ３４およびスピーカ３４ａに出力される。したがって、ゲーム画面がモニタ３４に表示され、ゲームに必要な音（音楽）がスピーカ３４ａから出力される。
【００５８】
また、入出力プロセッサ４２ａには、フラッシュメモリ４４、無線通信モジュール５０および無線コントローラモジュール５２が接続されるとともに、拡張コネクタ６０およびメモリカード用コネクタ６２が接続される。また、無線通信モジュール５０にはアンテナ５０ａが接続され、無線コントローラモジュール５２にはアンテナ５２ａが接続される。
【００５９】
入出力プロセッサ４２ａは、無線通信モジュール５０を介して、ネットワークに接続される他のゲーム装置や各種サーバと通信することができる。ただし、ネットワークを介さずに、直接的に他のゲーム装置と通信することもできる。入出力プロセッサ４２ａは、定期的にフラッシュメモリ４４にアクセスし、ネットワークへ送信する必要があるデータ（送信データとする）の有無を検出し、当該送信データが有る場合には、無線通信モジュール５０およびアンテナ５０ａを介してネットワークに送信する。また、入出力プロセッサ４２ａは、他のゲーム装置から送信されるデータ（受信データとする）を、ネットワーク、アンテナ５０ａおよび無線通信モジュール５０を介して受信し、受信データをフラッシュメモリ４４に記憶する。ただし、一定の場合には、受信データをそのまま破棄する。さらに、入出力プロセッサ４２ａは、ダウンロードサーバからダウンロードしたデータ（ダウンロードデータとする）をネットワーク、アンテナ５０ａおよび無線通信モジュール５０を介して受信し、ダウンロードデータをフラッシュメモリ４４に記憶する。
【００６０】
また、入出力プロセッサ４２ａは、コントローラ２２や荷重コントローラ３６から送信される入力データをアンテナ５２ａおよび無線コントローラモジュール５２を介して受信し、内部メインメモリ４２ｅまたは外部メインメモリ４６のバッファ領域に記憶（一時記憶）する。入力データは、ＣＰＵ４０のゲーム処理によって利用された後、バッファ領域から消去される。
【００６１】
なお、この実施例では、上述したように、無線コントローラモジュール５２は、Ｂｌｕｅｔｏｏｔｈ規格にしたがってコントローラ２２や荷重コントローラ３６との間で通信を行う。
【００６２】
また、図面の都合上、図２では、コントローラ２２と荷重コントローラ３６とをまとめて記載してある。
【００６３】
さらに、入出力プロセッサ４２ａには、拡張コネクタ６０およびメモリカード用コネクタ６２が接続される。拡張コネクタ６０は、ＵＳＢやＳＣＳＩのようなインターフェイスのためのコネクタであり、外部記憶媒体のようなメディアを接続したり、他のコントローラのような周辺機器を接続したりすることができる。また、拡張コネクタ６０に有線ＬＡＮアダプタを接続し、無線通信モジュール５０に代えて当該有線ＬＡＮを利用することもできる。メモリカード用コネクタ６２には、メモリカードのような外部記憶媒体を接続することができる。したがって、たとえば、入出力プロセッサ４２ａは、拡張コネクタ６０やメモリカード用コネクタ６２を介して、外部記憶媒体にアクセスし、データを保存したり、データを読み出したりすることができる。
【００６４】
詳細な説明は省略するが、図１にも示したように、ゲーム装置１２（ハウジング１４）には、電源ボタン２０ａ、リセットボタン２０ｂおよびイジェクトボタン２０ｃが設けられる。電源ボタン２０ａは、システムＬＳＩ４２に接続される。この電源ボタン２０ａがオンされると、システムＬＳＩ４２は、ゲーム装置１２の各コンポーネントに図示しないＡＣアダプタを経て電源が供給され、通常の通電状態となるモード（以下、「通常モード」という）を設定する。一方、電源ボタン２０ａがオフされると、システムＬＳＩ４２は、ゲーム装置１２の一部のコンポーネントのみに電源が供給され、消費電力を必要最低限に抑えるモード（以下、「スタンバイモード」という）を設定する。この実施例では、スタンバイモードが設定された場合には、システムＬＳＩ４２は、入出力プロセッサ４２ａ、フラッシュメモリ４４、外部メインメモリ４６、ＲＯＭ／ＲＴＣ４８および無線通信モジュール５０、無線コントローラモジュール５２以外のコンポーネントに対して、電源供給を停止する指示を行う。したがって、このスタンバイモードは、ＣＰＵ４０によってアプリケーションの実行が行われないモードである。
【００６５】
なお、システムＬＳＩ４２には、スタンバイモードにおいても電源が供給されるが、ＧＰＵ４２ｂ、ＤＳＰ４２ｃおよびＶＲＡＭ４２ｄへのクロックの供給を停止することにより、これらを駆動させないようにして、消費電力を低減するようにしてある。
【００６６】
また、図示は省略するが、ゲーム装置１２のハウジング１４内部には、ＣＰＵ４０やシステムＬＳＩ４２などのＩＣの熱を外部に排出するためのファンが設けられる。スタンバイモードでは、このファンも停止される。
【００６７】
ただし、スタンバイモードを利用したくない場合には、スタンバイモードを利用しない設定にしておくことにより、電源ボタン２０ａがオフされたときに、すべての回路コンポーネントへの電源供給が完全に停止される。
【００６８】
また、通常モードとスタンバイモードの切り替えは、コントローラ２２の電源スイッチ２６ｈのオン／オフの切り替えによっても遠隔操作によって行うことが可能である。当該遠隔操作を行わない場合には、スタンバイモードにおいて無線コントローラモジュール５２ａへの電源供給を行わない設定にしてもよい。
【００６９】
リセットボタン２０ｂもまた、システムＬＳＩ４２に接続される。リセットボタン２０ｂが押されると、システムＬＳＩ４２は、ゲーム装置１２の起動プログラムを再起動する。イジェクトボタン２０ｃは、ディスクドライブ５４に接続される。イジェクトボタン２０ｃが押されると、ディスクドライブ５４から光ディスク１８が排出される。
【００７０】
図３（Ａ）ないし図３（Ｅ）は、コントローラ２２の外観の一例を示す。図３（Ａ）はコントローラ２２の先端面を示し、図３（Ｂ）はコントローラ２２の上面を示し、図３（Ｃ）はコントローラ２２の右側面を示し、図３（Ｄ）はコントローラ２２の下面を示し、そして、図３（Ｅ）はコントローラ２２の後端面を示す。
【００７１】
図３（Ａ）ないし図３（Ｅ）を参照して、コントローラ２２は、たとえばプラスチック成型によって形成されたハウジング２２ａを有している。ハウジング２２ａは、略直方体形状であり、ユーザが片手で把持可能な大きさである。ハウジング２２ａ（コントローラ２２）には、入力手段（複数のボタンないしスイッチ）２６が設けられる。具体的には、図３（Ｂ）に示すように、ハウジング２２ａの上面には、十字キー２６ａ、１ボタン２６ｂ、２ボタン２６ｃ、Ａボタン２６ｄ、−ボタン２６ｅ、ＨＯＭＥボタン２６ｆ、＋ボタン２６ｇおよび電源スイッチ２６ｈが設けられる。また、図３（Ｃ）および図３（Ｄ）に示すように、ハウジング２２ａの下面に傾斜面が形成されており、この傾斜面に、Ｂトリガースイッチ２６ｉが設けられる。
【００７２】
十字キー２６ａは、４方向プッシュスイッチであり、矢印で示す４つの方向、前（または上）、後ろ（または下）、右および左の操作部を含む。この操作部のいずれか１つを操作することによって、プレイヤによって操作可能なキャラクタまたはオブジェクト（プレイヤキャラクタまたはプレイヤオブジェクト）の移動方向を指示したり、カーソルの移動方向を指示したりすることができる。
【００７３】
１ボタン２６ｂおよび２ボタン２６ｃは、それぞれ、押しボタンスイッチである。たとえば３次元ゲーム画像を表示する際の視点位置や視点方向、すなわち仮想カメラの位置や画角を調整する等のゲームの操作に使用される。または、１ボタン２６ｂおよび２ボタン２６ｃは、Ａボタン２６ｄおよびＢトリガースイッチ２６ｉと同じ操作或いは補助的な操作をする場合に用いるようにしてもよい。
【００７４】
Ａボタンスイッチ２６ｄは、押しボタンスイッチであり、プレイヤキャラクタまたはプレイヤオブジェクトに、方向指示以外の動作、すなわち、打つ（パンチ）、投げる、つかむ（取得）、乗る、ジャンプするなどの任意のアクションをさせるために使用される。たとえば、アクションゲームにおいては、ジャンプ、パンチ、武器を動かすなどを指示することができる。また、ロールプレイングゲーム（ＲＰＧ）やシミュレーションＲＰＧにおいては、アイテムの取得、武器やコマンドの選択および決定等を指示することができる。
【００７５】
−ボタン２６ｅ、ＨＯＭＥボタン２６ｆ、＋ボタン２６ｇおよび電源スイッチ２６ｈもまた、押しボタンスイッチである。−ボタン２６ｅは、ゲームモードを選択するために使用される。ＨＯＭＥボタン２６ｆは、ゲームメニュー（メニュー画面）を表示するために使用される。＋ボタン２６ｇは、ゲームを開始（再開）したり、一時停止したりするなどのために使用される。電源スイッチ２６ｈは、ゲーム装置１２の電源を遠隔操作によってオン／オフするために使用される。
【００７６】
なお、この実施例では、コントローラ２２自体をオン／オフするための電源スイッチは設けておらず、コントローラ２２の入力手段２６のいずれかを操作することによってコントローラ２２はオンとなり、一定時間（たとえば、３０秒）以上操作しなければ自動的にオフとなるようにしてある。
【００７７】
Ｂトリガースイッチ２６ｉもまた、押しボタンスイッチであり、主として、弾を撃つなどのトリガを模した入力を行ったり、コントローラ２２で選択した位置を指定したりするために使用される。また、Ｂトリガースイッチ２６ｉを押し続けると、プレイヤオブジェクトの動作やパラメータを一定の状態に維持することもできる。また、一定の場合には、Ｂトリガースイッチ２６ｉは、通常のＢボタンと同様に機能し、Ａボタン２６ｄによって決定したアクションを取り消すなどのために使用される。
【００７８】
また、図３（Ｅ）に示すように、ハウジング２２ａの後端面に外部拡張コネクタ２２ｂが設けられ、また、図３（Ｂ）に示すように、ハウジング２２ａの上面であり、後端面側にはインジケータ２２ｃが設けられる。外部拡張コネクタ２２ｂは、図示しない別の拡張コントローラを接続するためなどに使用される。インジケータ２２ｃは、たとえば、４つのＬＥＤで構成され、４つのうちのいずれか１つを点灯することにより、点灯ＬＥＤに対応するコントローラ２２の識別情報（コントローラ番号）を示したり、点灯させるＬＥＤの個数によってコントローラ２２の電源残量を示したりすることができる。
【００７９】
さらに、コントローラ２２は、撮像情報演算部８０（図４参照）を有しており、図３（Ａ）に示すように、ハウジング２２ａの先端面には撮像情報演算部８０の光入射口２２ｄが設けられる。また、コントローラ２２は、スピーカ８６（図４参照）を有しており、このスピーカ８６は、図３（Ｂ）に示すように、ハウジング２２ａの上面であり、１ボタン２６ｂとＨＯＭＥボタン２６ｆとの間に設けられる音抜き孔２２ｅに対応して、ハウジング２２ａ内部に設けられる。
【００８０】
なお、図３（Ａ）ないし図３（Ｅ）に示したコントローラ２２の形状や、各入力手段２６の形状、数および設置位置等は単なる一例に過ぎず、それらが適宜改変された場合であっても、本発明を実現できることは言うまでもない。
【００８１】
図４はコントローラ２２の電気的な構成を示すブロック図である。この図４を参照して、コントローラ２２はプロセッサ７０を含み、このプロセッサ７０には、内部バス（図示せず）によって、外部拡張コネクタ２２ｂ、入力手段２６、メモリ７２、加速度センサ７４、無線モジュール７６、撮像情報演算部８０、ＬＥＤ８２（インジケータ２２ｃ）、バイブレータ８４、スピーカ８６および電源回路８８が接続される。また、無線モジュール７６には、アンテナ７８が接続される。
【００８２】
プロセッサ７０は、コントローラ２２の全体制御を司り、入力手段２６、加速度センサ７４および撮像情報演算部８０によって入力された情報（入力情報）を、入力データとして無線モジュール７６およびアンテナ７８を介してゲーム装置１２に送信（入力）する。このとき、プロセッサ７０は、メモリ７２を作業領域ないしバッファ領域として用いる。
【００８３】
上述した入力手段２６（２６ａ−２６ｉ）からの操作信号（操作データ）は、プロセッサ７０に入力され、プロセッサ７０は操作データを一旦メモリ７２に記憶する。
【００８４】
また、加速度センサ７４は、コントローラ２２の縦方向（ｙ軸方向）、横方向（ｘ軸方向）および前後方向（ｚ軸方向）の３軸で各々の加速度を検出する。この加速度センサ７４は、典型的には、静電容量式の加速度センサであるが、他の方式のものを用いるようにしてもよい。
【００８５】
たとえば、加速度センサ７４は、第１所定時間毎に、ｘ軸，ｙ軸，ｚ軸の各々についての加速度（ａｘ，ａｙ，ａｚ）を検出し、検出した加速度のデータ（加速度データ）をプロセッサ７０に入力する。たとえば、加速度センサ７４は、各軸方向の加速度を、−２．０ｇ〜２．０ｇ（ｇは重力加速度である。以下、同じ。）の範囲で検出する。プロセッサ７０は、加速度センサ７４から与えられる加速度データを、第２所定時間毎に検出し、一旦メモリ７２に記憶する。プロセッサ７０は、操作データ、加速度データおよび後述するマーカ座標データの少なくとも１つを含む入力データを作成し、作成した入力データを、第３所定時間（たとえば、５ｍｓｅｃ）毎にゲーム装置１２に送信する。
【００８６】
なお、図３（Ａ）−図３（Ｅ）では省略したが、この実施例では、加速度センサ７４は、ハウジング２２ａ内部の基板上の十字キー２６ａが配置される付近に設けられる。
【００８７】
無線モジュール７６は、たとえばＢｌｕｅｔｏｏｔｈの技術を用いて、所定周波数の搬送波を入力データで変調し、その微弱電波信号をアンテナ７８から放射する。つまり、入力データは、無線モジュール７６によって微弱電波信号に変調されてアンテナ７８（コントローラ２２）から送信される。この微弱電波信号が上述したゲーム装置１２に設けられた無線コントローラモジュール５２によって受信される。受信された微弱電波は、復調および復号の処理を施され、したがって、ゲーム装置１２（ＣＰＵ４０）は、コントローラ２２からの入力データを取得することができる。そして、ＣＰＵ４０は、取得した入力データとプログラム（ゲームプログラム）とに従ってゲーム処理を行う。
【００８８】
さらに、上述したように、コントローラ２２には、撮像情報演算部８０が設けられる。この撮像情報演算部８０は、赤外線フィルタ８０ａ、レンズ８０ｂ、撮像素子８０ｃおよび画像処理回路８０ｄによって構成される。赤外線フィルタ８０ａは、コントローラ２２の前方から入射する光から赤外線のみを通過させる。上述したように、モニタ３４の表示画面近傍（周辺）に配置されるマーカ３４０ｍおよび３４０ｎは、モニタ３４の前方に向かって赤外光を出力する赤外ＬＥＤである。したがって、赤外線フィルタ８０ａを設けることによってマーカ３４０ｍおよび３４０ｎの画像をより正確に撮像することができる。レンズ８４は、赤外線フィル８２を透過した赤外線を集光して撮像素子８０ｃへ出射する。撮像素子８０ｃは、たとえばＣＭＯＳセンサあるいはＣＣＤのような固体撮像素子であり、レンズ８０ｂによって集光された赤外線を撮像する。したがって、撮像素子８０ｃは、赤外線フィルタ８０ａを通過した赤外線だけを撮像して画像データを生成する。以下では、撮像素子８０ｃによって撮像された画像を撮像画像と呼ぶ。撮像素子８０ｃによって生成された画像データは、画像処理回路８０ｄで処理される。画像処理回路８０ｄは、撮像画像内における撮像対象（マーカ３４０ｍおよび３４０ｎ）の位置を算出し、第４所定時間毎に、当該位置を示す各座標値を撮像データとしてプロセッサ７０に出力する。なお、画像処理回路８０ｄにおける処理については後述する。
【００８９】
図５は図１に示した荷重コントローラ３６の外観を示す斜視図である。図５に示すように、荷重コントローラ３６は、プレイヤがその上に乗る（プレイヤの足を乗せる）台３６ａ、および台３６ａにかかる荷重を検出するための少なくとも４つの荷重センサ３６ｂを備える。なお、各荷重センサ３６ｂは台３６ａに内包されており（図６，図７参照）、図５においてはその配置が点線で示されている。
【００９０】
台３６ａは、略直方体に形成されており、上面視で略長方形状である。たとえば長方形の短辺が３０ｃｍ程度に設定され、その長辺が５０ｃｍ程度に設定される。プレイヤが乗る台３６ａの上面は平坦にされる。台３６ａの４隅の側面は、部分的に円柱状に張り出すように形成されている。
【００９１】
この台３６ａにおいて、４つの荷重センサ３６ｂは、所定の間隔を置いて配置される。この実施例では、４つの荷重センサ３６ｂは、台３６ａの周縁部に、具体的には４隅にそれぞれ配置される。荷重センサ３６ｂの間隔は、台３６ａに対するプレイヤの荷重のかけ方によるゲーム操作の意図をより精度良く検出できるように適宜な値に設定される。
【００９２】
図６は、図５に示した荷重コントローラ３６のVI−VI断面図を示すとともに、荷重センサ３６ｂの配置された隅の部分が拡大表示されている。この図６から分かるように、台３６ａは、プレイヤが乗るための支持板３６０と脚３６２を含む。脚３６２は、荷重センサ３６ｂが配置される箇所に設けられる。この実施例では４つの荷重センサ３６ｂが４隅に配置されるので、４つの脚３６２が４隅に設けられる。脚３６２は、たとえばプラスチック成型によって略有底円筒状に形成されており、荷重センサ３６ｂは、脚３６２内の底面に設けられた球面部品３６２ａ上に配置される。支持板３６０は、この荷重センサ３６ｂを介して脚３６２に支持される。
【００９３】
支持板３６０は、上面と側面上部とを形成する上層板３６０ａ、下面と側面下部とを形成する下層板３６０ｂ、および上層板３６０ａと下層板３６０ｂとの間に設けられる中層板３６０ｃを含む。上層板３６０ａと下層板３６０ｂとは、たとえばプラスチック成型により形成されており、接着等により一体化される。中層板３６０ｃは、たとえば１枚の金属板のプレス成型により形成されている。この中層板３６０ｃが、４つの荷重センサ３６ｂの上に固定される。上層板３６０ａは、その下面に格子状のリブ（図示しない）を有しており、当該リブを介して中層板３６０ｃに支持されている。
【００９４】
したがって、台３６ａにプレイヤが乗ったときには、その荷重は、支持板３６０、荷重センサ３６ｂおよび脚３６２を伝達する。図６に矢印で示したように、入力される荷重によって生じた床からの反作用は、脚３６２から、球面部品３６２ａ、荷重センサ３６ｂ、中層板３６０ｃを介して、上層板３６０ａに伝達する。
【００９５】
荷重センサ３６ｂは、たとえば歪ゲージ（歪センサ）式ロードセルであり、入力された荷重を電気信号に変換する荷重変換器である。荷重センサ３６ｂでは、荷重入力に応じて、起歪体３７０ａが変形して歪が生じる。この歪が、起歪体に貼り付けられた歪センサ３７０ｂによって、電気抵抗の変化に変換され、さらに電圧変化に変換される。したがって、荷重センサ３６ｂは、入力荷重を示す電圧信号を出力端子から出力する。
【００９６】
なお、荷重センサ３６ｂは、音叉振動式、弦振動式、静電容量式、圧電式、磁歪式、またはジャイロ式のような他の方式の荷重センサであってもよい。
【００９７】
図５に戻って、荷重コントローラ３６には、さらに、電源ボタン３６ｃが設けられる。この電源ボタン３６ｃがオンされると、荷重コントローラ３６の各回路コンポーネント（図７参照）に電源が供給される。ただし、荷重コントローラ３６は、ゲーム装置１２からの指示に従ってオンされる場合もある。また、荷重コントローラ３６は、プレイヤが乗っていない状態が一定時間（たとえば、３０秒）以上継続すると、電源がオフされる。ただし、荷重コントローラ３６が起動されている状態で、電源ボタン３６ｃをオンしたときに、電源がオフされてもよい。
【００９８】
図７のブロック図には、荷重コントローラ３６の電気的な構成の一例が示される。なお、この図７では、信号および通信の流れは実線矢印で示される。破線矢印は、電源の供給を示している。
【００９９】
荷重コントローラ３６は、その動作を制御するためのマイクロコンピュータ（マイコン）１００を含む。マイコン１００は図示しないＣＰＵ、ＲＯＭおよびＲＡＭ等を含み、ＣＰＵはＲＯＭに記憶されたプログラムに従って荷重コントローラ３６の動作を制御する。
【０１００】
マイコン１００には、電源ボタン３６ｃ、ＡＤコンバータ１０２、ＤＣ−ＤＣコンバータ１０４および無線モジュール１０６が接続される。さらに、無線モジュール１０６には、アンテナ１０６ａが接続される。また、４つの荷重センサ３６ｂは、図３ではロードセル３６ｂとして示される。４つの荷重センサ３６ｂは、それぞれ、増幅器１０８を介してＡＤコンバータ１０２に接続される。
【０１０１】
また、荷重コントローラ３６には電源供給のために電池１００が収容されている。他の実施例では、電池に代えてＡＣアダプタを接続し、商用電源を供給するようにしてもよい。かかる場合には、ＤＣ−ＤＣコンバータに代えて、交流を直流に変換し、直流電圧を降圧および整流する電源回路を設ける必要がある。この実施例では、マイコン１００および無線モジュール１０６への電源の供給は、電池から直接的に行われる。つまり、マイコン１００内部の一部のコンポーネント（ＣＰＵ）と無線モジュール１０６とには、常に電源が供給されており、電源ボタン３６ｃがオンされたか否か、ゲーム装置１２から電源オン（荷重検出）のコマンドが送信されたか否かを検出する。一方、荷重センサ３６ｂ、ＡＤコンバータ１０２および増幅器１０８には、電池１１０からの電源がＤＣ−ＤＣコンバータ１０４を介して供給される。ＤＣ−ＤＣコンバータ１０４は、電池１１０からの直流電流の電圧値を異なる電圧値に変換して、荷重センサ３６ｂ、ＡＤコンバータ１０２および増幅器１０８に与える。
【０１０２】
これら荷重センサ３６ｂ、ＡＤコンバータ１０２および増幅器１０８への電源供給は、マイコン１００によるＤＣ−ＤＣコンバータ１０４の制御によって、必要に応じて行われるようにしてよい。つまり、マイコン１００は、荷重センサ３６ｂを動作させて荷重を検出する必要があると判断されるときに、ＤＣ−ＤＣコンバータ１０４を制御して、各荷重センサ３６ｂ、ＡＤコンバータ１０２および各増幅器１０８に電源を供給するようにしてよい。
【０１０３】
電源が供給されると、各荷重センサ３６ｂは、入力された荷重を示す信号を出力する。当該信号は各増幅器１０８で増幅され、ＡＤコンバータ１０２でアナログ信号からディジタルデータに変換されて、マイコン１００に入力される。各荷重センサ３６ｂの検出値には各荷重センサ３６ｂの識別情報が付与されて、いずれの荷重センサ３６ｂの検出値であるかが識別可能にされる。このようにして、マイコン１００は、同一時刻における４つの荷重センサ３６ｂのそれぞれの荷重検出値を示すデータを取得することができる。
【０１０４】
一方、マイコン１００は、荷重センサ３６ｂを動作させる必要がないと判断されるとき、つまり、荷重検出タイミングでないとき、ＤＣ−ＤＣコンバータ１０４を制御して、荷重センサ３６ｂ、ＡＤコンバータ１０２および増幅器１０８への電源の供給を停止する。このように、荷重コントローラ３６では、必要なときにだけ、荷重センサ３６ｂを動作させて荷重の検出を行うことができるので、荷重検出のための電力消費を抑制することができる。
【０１０５】
荷重検出の必要なときとは、典型的には、ゲーム装置１２（図１）が荷重データを取得したいときである。たとえば、ゲーム装置１２が荷重情報を必要とするとき、ゲーム装置１２は荷重コントローラ３６に対して荷重取得命令を送信する。マイコン１００は、ゲーム装置１２から荷重取得命令を受信したときに、ＤＣ−ＤＣコンバータ１０４を制御して、荷重センサ３６ｂ等に電源を供給し、荷重を検出する。一方、マイコン１００は、ゲーム装置１２から荷重取得命令を受信していないときには、ＤＣ−ＤＣコンバータ１０４を制御して、電源供給を停止する。あるいは、マイコン１００は、一定時間ごとに荷重検出タイミングであると判断して、ＤＣ−ＤＣコンバータ１０４を制御するようにしてもよい。このような周期的な荷重取得を行う場合、周期情報は、たとえば、初めにゲーム装置１２からマイコン１００に与えられ、または、予めマイコン１００に記憶されてよい。
【０１０６】
荷重センサ３６ｂからの検出値を示すデータは、荷重コントローラ３６の操作データ（入力データ）として、マイコン１００から無線モジュール１０６およびアンテナ１０６ｂを介してゲーム装置１２（図１）に送信される。たとえば、ゲーム装置１２からの命令を受けて荷重検出を行った場合、マイコン１００は、ＡＤコンバータ１０２から荷重センサ３６ｂの検出値データを受信したときに、当該検出値データをゲーム装置１２に送信する。あるいは、マイコン１００は、一定時間ごとに検出値データをゲーム装置１２に送信するようにしてもよい。
【０１０７】
なお、無線モジュール１０６は、ゲーム装置１２の無線コントローラモジュール５２と同じ無線規格（Ｂｌｕｅｔｏｏｔｈ、無線ＬＡＮなど）で通信可能にされる。したがって、ゲーム装置１２のＣＰＵ４０は、無線コントローラモジュール５２等を介して荷重取得命令を荷重コントローラ３６に送信することができる。荷重コントローラ３６のマイコン１００は、無線モジュール１０６およびアンテナ１０６ａを介して、ゲーム装置１２からの命令を受信し、また、各荷重センサ３６ｂの荷重検出値（または荷重算出値）を含む入力データをゲーム装置１２に送信することができる。
【０１０８】
図８は、コントローラ２２および荷重コントローラ３６を用いて仮想ゲームをプレイするときの状態を概説する図解図である。図８に示すように、ビデオゲームシステム１０でコントローラ２２および荷重コントローラ３６を用いて仮想ゲームをプレイする際、プレイヤは、荷重コントローラ３６の上に乗り、一方の手でコントローラ２２を把持する。厳密に言うと、プレイヤは、コントローラ２２の先端面（撮像情報演算部８０が撮像する光の入射口２２ｄ側）がマーカ３４０ｍおよび３４０ｎの方を向く状態で、荷重コントローラ３６に乗り、コントローラ２２を把持する。ただし、図１からも分かるように、マーカ３４０ｍおよび３４０ｎは、モニタ３４の画面の横方向と平行に配置されている。この状態で、プレイヤは、コントローラ２２が指示する画面上の位置を変更したり、コントローラ２２と各マーカ３４０ｍおよび３４０ｎとの距離を変更したりすることによってゲーム操作を行う。
【０１０９】
なお、図８では、プレイヤがモニタ３４の画面に対して横を向くように荷重コントローラ３６を縦置きにしてあるが、ゲームによっては、プレイヤがモニタ３４の画面に対して正面を向くように荷重コントローラ３６を横置きにしてよい。
【０１１０】
図９は、マーカ３４０ｍおよび３４０ｎと、コントローラ２２との視野角を説明するための図である。図９に示すように、マーカ３４０ｍおよび３４０ｎは、それぞれ、視野角θ１の範囲で赤外光を放射する。また、撮像情報演算部８０の撮像素子８０ｃは、コントローラ２２の視線方向を中心とした視野角θ２の範囲で入射する光を受光することができる。たとえば、マーカ３４０ｍおよび３４０ｎの視野角θ１は、共に３４°（半値角）であり、一方、撮像素子８０ｃの視野角θ２は４１°である。プレイヤは、撮像素子８０ｃが２つのマーカ３４０ｍおよび３４０ｎからの赤外光を受光することが可能な位置および向きとなるように、コントローラ２２を把持する。具体的には、撮像素子８０ｃの視野角θ２の中に少なくとも一方のマーカ３４０ｍおよび３４０ｎが存在し、かつ、マーカ３４０ｍまたは３４０ｎの少なくとも一方の視野角θ１の中にコントローラ２２が存在する状態となるように、プレイヤはコントローラ２２を把持する。この状態にあるとき、コントローラ２２は、マーカ３４０ｍおよび３４０ｎの少なくとも一方を検知することができる。プレイヤは、この状態を満たす範囲でコントローラ２２の位置および向きを変化させることによってゲーム操作を行うことができる。
【０１１１】
なお、コントローラ２２の位置および向きがこの範囲外となった場合、コントローラ２２の位置および向きに基づいたゲーム操作を行うことができなくなる。以下では、上記範囲を「操作可能範囲」と呼ぶ。
【０１１２】
操作可能範囲内でコントローラ２２が把持される場合、撮像情報演算部８０によって各マーカ３４０ｍおよび３４０ｎの画像が撮像される。すなわち、撮像素子８０ｃによって得られる撮像画像には、撮像対象である各マーカ３４０ｍおよび３４０ｎの画像（対象画像）が含まれる。図１０は、対象画像を含む撮像画像の一例を示す図である。対象画像を含む撮像画像の画像データを用いて、画像処理回路８０ｄは、各マーカ３４０ｍおよび３４０ｎの撮像画像における位置を表す座標（マーカ座標）を算出する。
【０１１３】
撮像画像の画像データにおいて対象画像は高輝度部分として現れるため、画像処理回路８０ｄは、まず、この高輝度部分を対象画像の候補として検出する。次に、画像処理回路８０ｄは、検出された高輝度部分の大きさに基づいて、その高輝度部分が対象画像であるか否かを判定する。撮像画像には、対象画像である２つのマーカ３４０ｍおよび３４０ｎの画像３４０ｍ’および３４０ｎ’のみならず、窓からの太陽光や部屋の蛍光灯の光によって対象画像以外の画像が含まれていることがある。高輝度部分が対象画像であるか否かの判定処理は、対象画像であるマーカ３４０ｍおよび３４０ｎの画像３４０ｍ’および３４０ｎ’と、それ以外の画像とを区別し、対象画像を正確に検出するために実行される。具体的には、当該判定処理においては、検出された高輝度部分が、予め定められた所定範囲内の大きさであるか否かが判定される。そして、高輝度部分が所定範囲内の大きさである場合には、当該高輝度部分は対象画像を表すと判定される。逆に、高輝度部分が所定範囲内の大きさでない場合には、当該高輝度部分は対象画像以外の画像を表すと判定される。
【０１１４】
さらに、上記の判定処理の結果、対象画像を表すと判定された高輝度部分について、画像処理回路８０ｄは当該高輝度部分の位置を算出する。具体的には、当該高輝度部分の重心位置を算出する。ここでは、当該重心位置の座標をマーカ座標と呼ぶ。また、重心位置は撮像素子８０ｃの解像度よりも詳細なスケールで算出することが可能である。ここでは、撮像素子８０ｃによって撮像された撮像画像の解像度が１２６×９６であるとし、重心位置は１０２４×７６８のスケールで算出されるものとする。つまり、マーカ座標は、（０，０）から（１０２４，７６８）までの整数値で表現される。
【０１１５】
なお、撮像画像における位置は、撮像画像の左上を原点とし、下向きをＹ軸正方向とし、右向きをＸ軸正方向とする座標系（ＸＹ座標系）で表現されるものとする。
【０１１６】
また、対象画像が正しく検出される場合には、判定処理によって２つの高輝度部分が対象画像として判定されるので、２箇所のマーカ座標が算出される。画像処理回路８０ｄは、算出された２箇所のマーカ座標を示すデータを出力する。出力されたマーカ座標のデータ（マーカ座標データ）は、上述したように、プロセッサ７０によって入力データに含まれ、ゲーム装置１２に送信される。
【０１１７】
ゲーム装置１２（ＣＰＵ４０）は、受信した入力データからマーカ座標データを検出すると、このマーカ座標データに基づいて、モニタ３４の画面上におけるコントローラ２２の指示位置（指示座標）と、コントローラ２２からマーカ３４０ｍおよび３４０ｎまでの各距離とを算出することができる。具体的には、２つのマーカ座標の中点の位置から、コントローラ２２の向いている位置すなわち指示位置が算出される。また、撮像画像における対象画像間の距離が、コントローラ２２と、マーカ３４０ｍおよび３４０ｎとの距離に応じて変化するので、２つのマーカ座標間の距離を算出することによって、ゲーム装置１２はコントローラ２２とマーカ３４０ｍおよび３４０ｎとの間の距離を把握できる。
【０１１８】
上述したように、コントローラ２２および荷重コントローラ３６を用いて仮想ゲームをプレイする場合、荷重コントローラ３６で検出される荷重値に基づいてゲーム処理を実行することができる。この実施例では、仮想ゲームが開始されると、本編の開始に先立って、プレイヤが静止した状態において荷重コントローラ３６によって４つの荷重センサ３６ｂの荷重値が検出され、検出された４つの荷重値からプレイヤの体重値が算出（測定）され、測定された体重値が基準値として設定（メインメモリ４２ｅまたは４６に記憶）され、たとえば、設定された基準値と仮想ゲームの実行中に検出される荷重値（この実施例では、４つの荷重センサ３６ｂで検出される荷重値の合計値）とに基づいてゲーム処理が実行される。つまり、プレイヤの体重値はゲーム処理を実行する場合の基準値となる。ただし、この実施例の仮想ゲームでは、プレイヤの体重の大小による有利不利を無くすため、現在の荷重値を基準値で割った値（以下、「体重率」という）に基づいてゲーム処理を実行するようにしてある。
【０１１９】
図１１（Ａ）および図１１（Ｂ）には、この実施例の仮想ゲームをプレイする場合に、モニタ３４に表示されるゲーム画面２００の例が示される。たとえば、図１１（Ａ）は、プレイヤオブジェクト２０２が羽ばたいて空を飛行している場合（通常飛行時）のゲーム画面２００を示す。また、図１１（Ｂ）は、プレイヤオブジェクト２０２がノンプレイヤオブジェクト２０４に着地するべく、羽を大きく広げてほぼ直立した状態で下降している場合（下降時）のゲーム画面２００を示す。図１１（Ａ）および図１１（Ｂ）に示すように、ゲーム画面２００には、プレイヤオブジェクト２０２が表示されるとともに、複数のノンプレイヤオブジェクト２０４が表示される。プレイヤオブジェクト（ゲームキャラクタ）２０２は、鳥を模したオブジェクト（動画オブジェクト）である。ノンプレイヤオブジェクト２０４は、プレイヤオブジェクト２０２が着地する目標となるオブジェクトである。
【０１２０】
この仮想ゲームでは、プレイヤオブジェクト２０２はプレイヤの操作に従って移動（飛行）し、複数のノンプレイヤオブジェクト２０４に着地しながら最終的な目標位置（ゴール）を目指す。たとえば、プレイヤオブジェクト２０２が、着地すべきすべてのノンプレイヤオブジェクト２０４を経由して、制限時間内にゴールに到達すると、ゲームクリアとなる。一方、プレイヤオブジェクト２０２がゴールに到達する前に制限時間を超えてしまったり、プレイヤオブジェクト２０２がノンプレイヤオブジェクト２０４を囲む海に落ちている時間が一定時間（たとえば、１０秒）を超えてしまったり、プレイヤオブジェクト２０２が一定回数（たとえば、３回）海に落ちてしまったりすると、ゲームオーバとなる。
【０１２１】
ゲーム中では、プレイヤは、荷重コントローラ３６に乗り、鳥が羽ばたくように両手を上下に動かす（羽ばたき動作を行う）。すると、荷重コントローラ３６で検出される荷重値が変化する。したがって、体重率ＷＲも変化する。この体重率ＷＲの変化に基づいて、プレイヤオブジェクト２０２の移動が制御される。この実施例では、プレイヤが羽ばたき動作を行うときの手（腕）の振りの強さ（体重率ＷＲの変化量）に応じてプレイヤオブジェクト２０２の移動量（移動速度）が制御され、荷重コントローラ３６上におけるプレイヤの重心位置に応じてプレイヤオブジェクト２０２の移動方向が制御される。
【０１２２】
具体的には、図１２（Ａ）に示すように、プレイヤは、荷重コントローラ３６上で、両手を大きく広げて、肩を中心に両手を大きく上下に振るように動作（大きく羽ばたく動作）を行ったり、図１２（Ｂ）に示すように、プレイヤが、荷重コントローラ３６上で、両手を小さく広げて、肘を中心に前腕を上下に振るように動作（小さく羽ばたく動作）を行ったりする。
【０１２３】
図示は省略するが、プレイヤが大きく羽ばたく動作（大羽ばたき動作）を行うと、プレイヤオブジェクト２０２も大羽ばたき動作のアニメーションでモニタ３４に表示され、プレイヤが小さく羽ばたく動作（小羽ばたき動作）を行うと、プレイヤオブジェクト２０２も小羽ばたき動作のアニメーションでモニタ３４に表示される。同様に図示は省略するが、大羽ばたき動作のアニメーションは、小羽ばたき動作のアニメーションに比べて、羽の可動範囲（上下方向への移動範囲）が広く（大きく）される。
【０１２４】
ここで、プレイヤが行う、大羽ばたき動作と、小羽ばたき動作との判別方法について説明する。図１３には、プレイヤが図１２（Ａ）に示したような大羽ばたき動作をした場合における、体重率ＷＲの時間変化のグラフの一例が示される。また、図１４には、プレイヤが図１２（Ｂ）に示したような小羽ばたき動作をした場合における、体重率ＷＲの時間変化のグラフの一例が示される。図１３および図１４（図１５も同じ）では、体重率ＷＲの時間変化は実線の波形で示される。ただし、体重率ＷＲが１．０の場合、つまり体重値（基準値）と現在の荷重値とが一致する場合を基準として、グラフの上側が荷重コントローラ３６によって検出されるプレイヤの荷重が加重されている側であり、グラフの下側が荷重コントローラ３６によって検出されるプレイヤの荷重が軽減されている側である。
【０１２５】
図１３および図１４に示す体重率ＷＲの時間変化を、それぞれ離散フーリエ変換すると、各々の図に示すように、パワースペクトル（周波数のインデックス番号ｎに対する振幅Ａ）が得られる。図１３および図１４（図１５も同じ）では、パワースペクトルについては、ドットで示してある。このように、離散フーリエ変換処理を実行するのは、プレイヤの羽ばたき動作（特に大羽ばたき動作）を正しく認識するためである。つまり、体重率ＷＲの時間変化の波形からは、プレイヤの小羽ばたき動作と大羽ばたき動作とを区別するのが困難だからである。
【０１２６】
ここで、離散フーリエ変換では、波形のデータ数をｘとし、時間刻みをｄｔ（秒）とすると、周波数ｆは１／（ｘ・ｄｔ）刻みとなる。この実施例では、ｘ＝３０，ｄｔ＝１／６０（ゲームフレーム）であるため、周波数ｆ（Hz）は２刻みとなる。したがって、インデックス番号ｎを２倍した値が周波数ｆ（Hz）となる。ただし、ゲームフレームは、画面更新単位時間である。
【０１２７】
図１３から分かるように、大羽ばたき動作の場合には、周波数のインデックス番号ｎ＝１のときに、振幅Ａが最大値となる。また、図１４から分かるように、小羽ばたき動作の場合には、周波数のインデックス番号ｎ＝２のときに、振幅Ａが最大値となる。したがって、体重率ＷＲの時間変化を離散フーリエ変換し、その結果、振幅Ａが最大となる場合の周波数のインデックス番号ｎを調べることにより、大羽ばたき動作であるか、小羽ばたき動作であるかを判別することができると考えられる。ただし、図示は省略するが、実験の結果では、プレイヤが大羽ばたき動作を行った場合においても、ノイズの影響により、周波数のインデックス番号ｎ＝２のときに、振幅Ａが最大値となることがあった。このため、この実施例では、大羽ばたき動作または小羽ばたき動作を、数１に従って判別するようにしてある。振幅Ａが最大値となる周波数のインデックス番号ｎ、または振幅Ａが最大値となる周波数のインデックス番号ｎおよび当該振幅Ａが、数１を満たす場合には、小羽ばたき動作と判別され、数１を満たさない場合には、大羽ばたき動作と判別される。ただし、大羽ばたき動作時のノイズ（スペクトルノイズ）の最大値をＰｎ（０．０００１）とする。
【０１２８】
[数１]
ｎ≧３
または
ｎ＝２でＡが最大、かつｎ＝３でＡ≧Ｐｎ
ただし、数１を満たさない場合に、周波数のインデックス番号ｎ＝１−１５において、すべての振幅ＡがＰｎ未満である場合には、周期的な動作が何ら行われていないと考えられるため、プレイヤが羽ばたき動作を行っていないと判断するようにしてある。
【０１２９】
このように、プレイヤの羽ばたき動作の有無および羽ばたき動作の種類（大羽ばたき動作または小羽ばたき動作）が判別されると、羽ばたきの種類に応じてアニメーションが選択され、選択されたアニメーションが再生される。したがって、上述したように、プレイヤの羽ばたき動作に応じて、プレイヤオブジェクト２０２の羽ばたき動作のアニメーションがモニタ３４に表示されるのである。
【０１３０】
ただし、プレイヤが羽ばたき動作を行っておらず、プレイヤオブジェクト２０２が３次元仮想空間内を下降している場合には、プレイヤオブジェクト２０２が下降中のアニメーション（下降時アニメーション）が再生される。
【０１３１】
ここで、上述したように、この実施例では、荷重コントローラ３６に乗っているプレイヤが羽ばたき動作を行うことにより、その荷重コントローラ３６で検出される荷重値が変動し、体重率ＷＲも変動する。したがって、たとえば、荷重コントローラ３６に乗っているプレイヤが屈伸運動を行った場合にも、プレイヤが羽ばたき動作を行った場合と同様に、その荷重コントローラ３６で検出される荷重値が周期的に変動する。かかる場合の体重率ＷＲの時間変化のグラフの一例が図１５に示される。図１３ないし図１５を比較して分かるように、屈伸運動を行った場合には、羽ばたき動作を行った場合よりも、体重率ＷＲの変動がかなり大きくなる。
【０１３２】
後で具体的に示すが、この実施例では、体重率ＷＲの大きさ（負の値）に応じた推進力がプレイヤオブジェクト２０２に与えられ、これによって、プレイヤオブジェクト２０２は３次元仮想空間内を移動する。このため、プレイヤが屈伸運動を行った場合には、プレイヤが羽ばたき動作を行った場合よりも、大きな推進力をプレイヤオブジェクト２０２に与えることができ、プレイヤオブジェクト２０２を大きく移動させることができる。しかし、このような屈伸運動は、開発者等が意図する操作方法ではない。
【０１３３】
したがって、この実施例では、プレイヤの直前の羽ばたき動作（羽ばたき区間）において、一定の閾値（たとえば、１．３）を超える体重率ＷＲが存在する場合には、屈伸運動のような意図しない動作が行われていると判断して、仮想ゲームのスコアを減点したり、プレイヤオブジェクト２０２を進行し難くしたりしてある。
【０１３４】
この実施例では、前々回の振り下ろし動作の開始から前回（直前）の振り下ろし動作の開始までの区間を、直前の羽ばたき動作（羽ばたき区間）として認識するようにしてある。ただし、図１３−図１５では、振り下ろし動作の開始時点を一点鎖線で示してある。振り下ろし動作とは、羽ばたき動作において、プレイヤが両手ないし両腕を振り下ろす動作を意味する。この振り下ろし動作の開始の判定方法については、後で詳細に説明することにする。ただし、上述したように、図１５に示す体重率ＷＲの時間変化が得られるのは、プレイヤが屈伸運動を行っている場合であるため、後述する判定方法においては、振り下ろし動作の開始が判定されるのではなく、足の曲げ動作の開始が判定されているのである。
【０１３５】
上述したように、ゲーム中では、体重率ＷＲに基づく推進力Ａｃｃがプレイヤオブジェクト２０２に与えられる。この実施例では、推進力Ａｃｃは、数２に従って算出される。ただし、体重率ＷＲは所定の閾値（この実施例では、０．９８５）未満である。このように、体重率ＷＲが１．０よりも小さい値である場合に、推進力Ａｃｃを与えるのは、鳥が羽を振り下ろしたときに推進力を得るのと同様に、プレイヤが振り下ろし動作を行ったときに推進力を得るようにしたためである。したがって、プレイヤが行う羽ばたき動作のうち、両手ないし両腕を上方向に振り上げる動作（振り上げ動作）は、推進量を得るための振り下ろし動作の準備動作であると言える。また、所定の閾値未満としたのは、ノイズによる影響を無くすためである。
【０１３６】
[数２]
推進力Ａｃｃ＝１．０−体重率ＷＲ
ここで、数２から分かるように、体重率ＷＲが小さい程、推進力Ａｃｃが大きくなる。つまり、荷重値の変動が大きい場合に、推進力Ａｃｃが大きくなる。また、推進力Ａｃｃは、体重率ＷＲが所定の閾値未満である場合に与えられ、この推進力Ａｃｃは１ゲームフレーム毎に、プレイヤオブジェクト２０２の移動に反映されるため、所定の閾値未満である時間が長いほど、つまり大羽ばたき動作のように羽ばたき動作の周期が長いほど、推進力Ａｃｃを得る回数が多くなる。結果として、大きい推進力Ａｃｃがプレイヤオブジェクト２０２に与えられ、したがって、プレイヤオブジェクト２０２の移動距離または移動速度が大きくなる（数３および数４参照）。
【０１３７】
数２で算出される推進力Ａｃｃはスカラ量であるが、３次元仮想空間においては、プレイヤオブジェクト２０２が直立した状態で頭頂部から真上に延びる単位ベクトル（Ｙベクトル）ＡｃｃＤｉｒに、そのスカラ量を積分シミュレーションで用いる値（ＡｃｃＳｉｍ）に変換して乗算される。ただし、単位ベクトルＡｃｃＤｉｒは、後述するように、プレイヤの重心位置に応じてプレイヤオブジェクト２０２がローカル座標のＸ軸周りおよびＹ軸周りに回転されることにより、決定される。
【０１３８】
積分シミュレーションでは、推進力Ａｃｃに基づいて、移動後のプレイヤオブジェクト２０２の位置（３次元位置）Ｐｏｓが数３および数４に従って算出される。ただし、プレイヤオブジェクト２０２は、現在のゲームフレーム（現フレーム）において、頭頂部が向く方向すなわち単位ベクトルＡｃｃＤｉｒの向きに移動される。また、数３および数４においては、プレイヤオブジェクト２０２の次のゲームフレーム（次フレーム）の速度をＶｅｌ＿ｎｅｗとし、移動前すなわち現フレームの速度をＶｅｌ＿ｏｌｄとし、３次元仮想空間の重力加速度ベクトルをＧｒａｖｉｔｙとし、現フレームの３次元位置をＰｏｓ＿ｏｌｄとし、そして、次フレームの３次元位置をＰｏｓ＿ｎｅｗとしてある。また、数３においては、次フレームの速度Ｖｅｌ＿ｎｅｗには、プレイヤオブジェクト２０２が下降時に前後方向に移動する場合の加速度ベクトル（ＡｃｃＢｏａｒｄ×ＦａｌlＴｒａｎｓＤｉｒ）が反映される。ただし、ＡｃｃＢｏａｒｄは並進加速度（水平方向の加速度）であり、ＦａｌｌＴｒａｎｓＤｉｒは並進方向（水平方向）の方向ベクトル（プレイヤオブジェクト２０２の正面方向または背面方向のベクトル）である。
【０１３９】
[数３]
Vel_new=｛Vel_old+(AccSim×AccDir)+(AccBoard×FallTransDir）-Gravity｝×0.994
[数４]
Pos_new=Pos_old+Vel_new
ただし、この実施例では、重力加速度ベクトルＧｒａｖｉｔｙ＝（０，０．０１４，０）としてある。ここで、この実施例では、現実世界における距離１ｍを、３次元仮想空間内における距離１０としてあるが、その比率に応じて重力加速度Ｇｒａｖｉｔｙを設定すると、プレイヤの羽ばたき動作によってプレイヤオブジェクト２０２を飛行させるために十分な推進力を得るのは困難であるため、実験等により経験的に得られた比較的小さい値に設定される。また、０．９９４は空気抵抗である。したがって、定数である必要はなく、仮想ゲームの進行状況に応じて可変的に設定するようにしてもよい。
【０１４０】
数３から分かるように、加速度ベクトル（（ＡｃｃＳｉｍ×ＡｃｃＤｉｒ）または（ＡｃｃＢｏａｒｄ×ＦａｌlＴｒａｎｓＤｉｒ））と重力加速度ベクトルＧｒａｖｉｔｙとを現フレームの速度Ｖｅｌ＿ｏｌｄに足して、空気抵抗の値を掛けることにより、次フレームの速度Ｖｅｌ＿ｎｅｗを得る。また、数４から分かるように、次フレームの速度Ｖｅｌ＿ｎｅｗを現フレームの座標Ｐｏｓ＿ｏｌｄに足して、次フレームの座標Ｐｏｓ＿ｎｅｗを得る。これは、シミュレーションに使用する推進力ＡｃｃＳｉｍを積分（２回積分）した結果である。
【０１４１】
なお、プレイヤによる羽ばたき動作が無い場合には、体重率ＷＲが１またはほぼ１であるため、シミュレーションに使用する推進力ＡｃｃＳｉｍ（加速度ベクトル（ＡｃｃＳｉｍ×ＡｃｃＤｉｒ））は０となり、数３は数５のように示される。
【０１４２】
[数５]
Vel_new=｛Vel_old+(AccBoard×FallTransDir）-Gravity｝×0.994
したがって、１ゲームフレーム毎に、次フレームの速度Ｖｅｌ＿ｎｅｗのＹ成分が０．０１４ずつ減少する。これにより、３次元仮想空間における自由落下が表現される。つまり、数３では、３次元仮想空間の重力場において、推進力が発生したときの物体の並進運動が記述されている。
【０１４３】
また、プレイヤによる羽ばたき動作が有り、プレイヤオブジェクト２０２が下降していない場合には、数３において、プレイヤオブジェクト２０２の下降時における前後方向の加速度ベクトル（ＡｃｃＢｏａｒｄ×ＦａｌｌＴｒａｎｓＤｉｒ）は０となる。
【０１４４】
このようにして、プレイヤオブジェクトの３次元仮想空間における移動後の３次元位置Ｐｏｓ＿ｎｅｗが算出され、数６に示す行列式Ａに従って、プレイヤオブジェクト２０２は、３次元仮想空間に配置される。ただし、数６に示す行列式Ａの各要素は次の意味を持つ。要素（Ｘｘ，Ｘｙ，Ｘｚ）はプレイヤオブジェクト２０２のローカル座標のＸ軸を当てはめる方向であり、要素（Ｙｘ，Ｙｙ，Ｙｚ）はプレイヤオブジェクト２０２のローカル座標のＹ軸を当てはめる方向であり、要素（Ｚｘ，Ｚｙ，Ｚｚ）はプレイヤオブジェクト２０２のローカル座標のＺ軸を当てはめる方向であり、要素（Ｐｘ，Ｐｙ，Ｐｚ）はプレイヤオブジェクト２０２のローカル座標の中心（重心）を置くワールド座標（３次元座標）である。
【０１４５】
[数６]
0005478172.tif 000002
【０１４６】
また、ゲーム中では、荷重コントローラ３６上におけるプレイヤの荷重の重心位置に応じて、プレイヤオブジェクト２０２の進行方向（移動方向）が決定（制御）される。図１６（Ａ）は、荷重コントローラ３６の上面（支持板３６０の上層板３６０ａの表面）すなわち重心位置の検出範囲の中心を原点Ｏ（０，０）に設定し、水平面内における原点Ｏからの重心位置のずれ量で、プレイヤオブジェクト２０２の頭部の向き（移動方向）が決定される。ここでは、荷重コントローラ３６の支持板３６０の横方向が検出範囲のＸ軸方向であり、その縦方向が検出範囲のＹ軸方向である。ただし、荷重コントローラ３６に正しく乗ったプレイヤの顔の方向（正面方向）は、図１６(Ａ）の紙面の上方である。また、図１６（Ａ）に示すように、検出範囲の右方向がＸ軸のプラス方向であり、検出範囲の上方向がＹ軸のプラス方向である。
【０１４７】
ここで、図１６（Ａ）に示す状態において、左上の荷重センサ３６ｂの荷重検出値をＲ１、左下の荷重センサ３６ｂの荷重検出値をＲ２、右上の荷重センサ３６ｂの荷重検出値をＲ３、右下の荷重センサ３６ｂの荷重検出値をＲ４としたとき、検出範囲の座標系における重心のＸ座標（ＸＧ）は、右荷重値と左荷重値との差分に基づいて算出され、重心のＹ座標（ＹＧ）は上荷重値と下荷重値との差分に基づいて算出される。重心のＸ座標（ＸＧ）は数７によって算出され、重心のＹ座標（ＹＧ）は数８によって算出される。
［数７］
ＸＧ＝（（Ｒ３＋Ｒ４）−（Ｒ１＋Ｒ２））×ｋ１
［数８］
ＹＧ＝（（Ｒ１＋Ｒ３）−（Ｒ２＋Ｒ４））×ｋ２
ここで、ｋ１，ｋ２は定数である。ただし、−１≦ＸＧ≦１、−１≦ＹＧ≦１である。
【０１４８】
なお、この実施例では、荷重コントローラ３６の検出範囲の中心を原点Ｏに設定するようにしてあるが、プレイヤによって、立ち位置が異なるため、プレイヤが荷重コントローラ３６に乗り、体重値を計測している場合の重心位置を原点Ｏに設定してもよい。
【０１４９】
この実施例では、プレイヤオブジェクト２０２が飛行している場合において、下降している場合と下降していない場合とで、プレイヤオブジェクト２０２の移動方向の制御方法が異なる。以下、それぞれの場合について説明することにする。
【０１５０】
プレイヤオブジェクト２０２が下降していない場合には、プレイヤオブジェクト２０２は、荷重コントローラ３６で検出される荷重の重心位置のＸ座標に応じて左右方向に回転され、重心位置のＹ座標に応じて前後方向に回転される。
【０１５１】
重心位置が検出範囲内の領域（I）または領域（III）に含まれ、重心位置のＸ座標が負の場合には、プレイヤオブジェクト２０２は、ローカル座標のＹ軸回りに、反時計周り（左周り）に回転される。また、重心位置が検出範囲内の領域領域（II）または領域（IV）に含まれ、重心位置のＸ座標が正の場合には、プレイヤオブジェクト２０２は、ローカル座標のＹ軸回りに、時計周り（右周り）に回転される。
【０１５２】
具体的には、図１６（Ｂ）に示すように、プレイヤオブジェクト２０２を真上から見た場合に、重心位置のＸ座標の負の値に応じて、プレイヤオブジェクト２０２のローカル座標のＹ軸の反時計回りの回転量が決定され、重心位置のＸ座標の正の値に応じて、プレイヤオブジェクト２０２のローカル座標のＹ軸の時計周りの回転量が決定される。回転量は、重心位置のＸ座標の大きさに比例する。また、重心位置のＸ座標が正の値であれば、プレイヤオブジェクト２０２は、そのローカル座標のＹ軸の時計回りに回転し続ける。
【０１５３】
ただし、この実施例では、ローカル座標は、プレイヤオブジェクト２０２が直立した状態において、横（水平）方向がＸ軸方向であり、縦（垂直）方向がＹ軸方向であり、前後（奥行き）方向がＺ軸方向である。また、各軸は、プレイヤオブジェクト２０２の中心ないし重心を通る。さらに、プレイヤオブジェクト２０２が直立した状態で、その左手（左の羽）の方向がローカル座標のＸ軸のプラス方向であり、その上方向がローカル座標のＹ軸のプラス方向であり、その前方向（腹の方向）がローカル座標のＺ軸のプラス方向である。
【０１５４】
また、重心位置が検出範囲内の領域（I）または領域（II）に含まれ、重心位置のＹ座標が正の場合には、図１７に示すように、頭部が前方（正面方向）に傾くように、プレイヤオブジェクト２０２はローカル座標のＸ軸回りに回転する。正面方向への傾斜量（回転量）は、重心位置のＹ座標の大きさに比例するが、最大傾斜量はプレイヤオブジェクト２０２が直立した状態から５５度である。
【０１５５】
図示は省略するが、重心位置が検出範囲内の領域（III）または領域（IV）に含まれ、重心位置のＹ座標が負の場合には、プレイヤオブジェクト２０２は、ローカル座標のＸ軸回りであり、その背面方向に回転される。ただし、プレイヤオブジェクト２０２の背面方向への最大傾斜量は３５度に設定される。これは、プレイヤオブジェクト２０２が腹を上にして飛行しているような所望でない状態を回避するためである。
【０１５６】
一方、プレイヤオブジェクト２０２が下降している場合には、プレイヤオブジェクト２０２は、荷重コントローラ３６で検出される荷重の重心位置のＸ座標に応じて左右方向に回転され、重心位置のＹ座標に応じて前後方向に並進される。
【０１５７】
プレイヤオブジェクト２０２が下降している場合においても、重心位置のＸ座標に応じて、プレイヤオブジェクト２０２はローカル座標のＹ軸周りに回転される。これは、図１６（Ｂ）を用いて説明したのと同じであるため、重複した説明は省略する。
【０１５８】
また、プレイヤオブジェクト２０２が下降している場合には、図１８に示すように、重心位置のＹ座標に応じて、プレイヤオブジェクト２０２は、前後方向に移動（並進）される。つまり、かかる場合には、プレイヤオブジェクト２０２の頭部は傾斜されない。また、並進する場合の移動量（変位量）は、重心位置のＹ座標の大きさによって決定される。このように、下降時に、重心位置のＹ座標に応じて並進されるのは、プレイヤオブジェクト２０２をノンプレイヤオブジェクト２０４に着地させ易くするためである。重心位置のＹ座標が正の場合には、プレイヤオブジェクト２０２は、正面方向に移動（並進）する。このとき、Ｙ座標が大きくなると、移動量も大きくされる。一方、重心位置のＹ座標が負の場合には、プレイヤオブジェクト２０２は、正面方向とは逆向き（背面方向）に並進する。このとき、Ｙ座標が小さくなると、つまり負の方向に大きくなると、移動量が大きくされる。ただし、プレイヤオブジェクト２０２が１ゲームフレームで移動する移動量の最大値は予め設定されている。
【０１５９】
また、図１３−図１５に示したような体重率ＷＲの時間変化から、プレイヤが腕を上方向に振り上げる動作（振り上げ動作）の開始を判定（振り上げ判定）するとともに、腕を下方向に振り下ろす動作（振り下ろし動作）の開始を判定（振り下ろし判定）する。これは、プレイヤの羽ばたき動作とプレイヤオブジェクト２０２の羽ばたき動作のアニメーションとを同期させるためである。
【０１６０】
以下、振り下ろし判定の方法および振り上げ判定の方法、およびプレイヤの羽ばたき動作とプレイヤオブジェクト２０２の羽ばたき動作のアニメーションとの同期について順番に説明することにする。
【０１６１】
この実施例では、現フレームの体重率ＷＲが１つ手前のゲームフレーム（前フレーム）の体重率ＷＲよりも小さく、しかも現フレームの体重率ＷＲの値が一定値（０．９８５）未満になると、振り下ろし動作の開始であると判定する。また、この実施例では、体重率ＷＲの値が一定値（０．９８）以上であり、体重率ＷＲが減少した後に増加すると、振り上げ動作の開始であると判定する。具体的には、２つ手前のゲームフレーム（前々フレーム）の体重率ＷＲよりも前フレームの体重率ＷＲが小さく、しかも現フレームの体重率ＷＲが前フレームの体重率ＷＲよりも一定値（０．００１）以上大きい場合に、体重率ＷＲが減少した後に増加したことが検出され、さらに、前フレームの体重率が一定値（０．９８）以上である場合に、振り上げ動作の開始が判定される。このように、体重率ＷＲがその基準値（１．０）よりも大きい側（上側）において、一定区間（３ゲームフレーム分）における体重率ＷＲの変化に基づいて、局所的（一時的）に体重率ＷＲが減少（荷重値の減少）して増加したことが検出されるときに、振り上げ動作の開始が判定される。これらは、図１３および図１４に示したような体重率ＷＲの時間変化に基づいて、経験的に得られた判定方法である。
【０１６２】
ただし、体重率ＷＲが減少するというのは、現フレームの体重率ＷＲが前フレームの体重率ＷＲよりも小さいことを意味し、体重率ＷＲが増加するというのは、前フレームの体重率ＷＲが前フレームの体重率ＷＲよりも大きいことを意味する。また、振り上げ動作の開始を判定する場合に、体重率ＷＲが一定値以上であることを条件としたのは、図１３に示したように、体重率ＷＲが０．９あたりの極小値の前後で振り上げ動作の開始であると判定するのを防止するためである。つまり、この実施例では、プレイヤが大羽ばたき動作を行っている場合に、両手（両腕）を肩と同じくらいの高さ或いは肩よりも上方の高さに振り上げた動作を、「振り上げ動作」として判定するようにしているのである。これが、開発者等が意図するプレイヤの「振り上げ動作」である。
【０１６３】
なお、上述した図１３−図１５では、振り下ろし動作の開始時を一点鎖線で示す。また、図１３では、振り上げ動作の開始時を二点鎖線で示す。
【０１６４】
次に、プレイヤの羽ばたき動作と、プレイヤオブジェクト２０２の羽ばたき動作のアニメーションとの同期について説明する。まず、プレイヤオブジェクト２０２のアニメーションは、羽ばたきの種類（大小）に拘わらず、いずれも６０フレーム（６０コマ）で構成されている。上述したように、羽ばたきの種類で異なるのは、羽の可動範囲の大きさだけである。以下には、大羽ばたき動作の場合について、プレイヤの羽ばたき動作とプレイヤオブジェクト２０２の羽ばたき動作のアニメーションとの同期について説明するが、小羽ばたき動作についても同様である。
【０１６５】
図１９には、大羽ばたきのアニメーションについての６０フレーム（アニメーションフレーム）のうち、特徴的なアニメーションフレーム（ここでは、０（６０），７，１５，２２，３０，３７，４５，５２）が抜き出される。アニメーションフレームは、０から始まって５９まで進み、次のアニメーションフレームで０（６０）に戻る。ただし、図１９では、簡単のため、プレイヤオブジェクト２０２の頭部、胴体および羽のみを示してある。また、図１９では、プレイヤオブジェクト２０２の正面方向は、紙面に対して垂直方向である。さらに、図１９では、上段に、アニメーションフレームの０から３０までを示し、下段に、アニメーションフレームの３０から６０（０）までを示してある。
【０１６６】
図１９に示すように、アニメーションフレームが０のときには、プレイヤオブジェクト２０２は、たとえば、水平方向に羽を広げた状態であり、３次元仮想空間の水平面に対して羽がなす角度は０度である。この実施例では、アニメーションフレームが再生されると、プレイヤオブジェクト２０２は、水平方向に羽を広げた状態から上に羽を振り上げ、アニメーションフレームが１５フレームで羽が最高位置に達し、その後、羽が振り下ろされる。そして、アニメーションフレームが４５フレームで羽が最下位置に達し、その後、羽が振り上げられて、６０フレーム（０フレーム）で初期の状態に戻る。
【０１６７】
したがって、１５フレームから４５フレーム（１５→２２→３０→３７→４５）の手前までが、プレイヤオブジェクト２０２の振り下ろし動作についてのアニメーションフレームに相当し、４５フレームから１５フレーム（４５→５２→６０（０）→７→１５）の手前までが、プレイヤオブジェクト２０２の振り上げ動作についてのアニメーションフレームに相当する。
【０１６８】
また、図１９に示すように、プレイヤオブジェクト２０２の振り下ろし動作またはそのアニメーションフレーム（１５−４５フレーム）に対応して、振り下ろし加速度発生可能区間（１５−３０フレーム）が設定され、プレイヤオブジェクト２０２の振り上げ動作またはそのアニメーションフレーム（４５−１５フレーム）に対応して、振り上げ加速度発生可能区間（３０−６０フレーム）が設定される。つまり、振り下ろし加速度発生可能区間は、振り下ろし動作についてのアニメーションフレームの開始から途中までの間に設定される。また、振り上げ加速度発生可能区間は、振り下ろし動作についてのアニメーションフレームの途中から振り上げ動作のアニメーションフレームの途中までの間に設定される。したがって、振り上げ加速度発生可能区間は、振り下ろし動作の一部（振り上げ動作の予備動作）についてのアニメーションフレーム（３０−４５）を含む。図１９に示すように振り下ろし加速度発生可能区間および振り上げ加速度発生可能区間を設定した理由については後述するため、ここでは省略する。
【０１６９】
なお、アニメーションフレームは６０個（６０コマ）であるが、小数点でフレーム数（フレーム番号）を指定することもできる。たとえば、フレーム番号が０のアニメーションフレームにおけるプレイヤオブジェクト２０２の腕の角度（水平面となす角度）が０度であり、フレーム番号が１のアニメーションフレームにおけるプレイヤオブジェクト２０２の腕の角度が１０度であるとし、フレーム番号として０．５を指定すると、腕の角度が５度のプレイヤオブジェクト２０２を得ることができる。したがって、理論上、プレイヤオブジェクト２０２のポーズの種類は、無限大に存在する。
【０１７０】
この実施例では、プレイヤの羽ばたき動作と、プレイヤオブジェクト２０２のアニメーションフレームの同期を取る方法として、振り下ろし動作の開始の判定時または振り下ろし動作の開始の判定後におけるアニメーションフレームの進め方Ａと、振り上げ動作の開始の判定時または振り上げ動作の判定後におけるアニメーションフレームの進め方Ｂとがある。ただし、プレイヤが小羽ばたき動作を行う場合には、振り上げ動作が判定されることがないため、アニメーションフレームの進め方Ａのみによって同期が取られる。すなわち、プレイヤが、図１２（Ａ）を用いて説明したように、開発者等の意図するような大羽ばたき動作を行う場合には、振り下ろし動作と振り上げ動作とが判定されるため、アニメーションフレームの進め方Ａおよび進め方Ｂを用いて、プレイヤの羽ばたき動作とプレイヤオブジェクト２０２のアニメーションフレームとの同期を取るようにしている。
【０１７１】
まず、アニメーションフレームの進め方Ａについて説明する。上述したように、振り下ろし動作の開始が判定されると、後述する振り下ろし加速フラグ４０４ｐ（図２１参照）がオンされる。振り下ろし加速フラグ４０４ｐがオンになっている場合に、現在のアニメーションフレームが図１９に示す振り下ろし加速度発生可能区間（フレーム番号：１５以上３０未満）内であるかどうかが判断される。
【０１７２】
なお、後述するように、振り下ろし加速フラグ４０４ｐは、振り下ろし加速度発生可能区間において、アニメーションフレームの更新（進行）速度を加速させると、オフされる。
【０１７３】
振り下ろし動作の開始が判定されたときに、現在のアニメーションフレームが振り下ろし加速度発生可能区間内である場合には、振り下ろし加速度が発生される。つまり、アニメーションフレームの加速度ＦｒａｍｅＡｃｃに０より大きい値が設定され、更新速度がゲームフレーム（１／６０（秒））よりも速くされる。この実施例では、アニメーションフレームのフレーム加速度ＦｒａｍｅＡｃｃは、数９に従って算出される。ただし、ＡｎｉｍＦｒａｍｅＭａｘは、アニメーションフレームの最大フレーム数（この実施例では、６０）である。また、ＣｙｃｌｅＳｗｉｎｇは、１回の羽ばたき動作に要した時間（羽ばたき区間）、すなわち振り下ろし判定が行われた時間間隔であり、ゲームフレーム数で表わされる。以下、同様である。したがって、羽ばたき動作を行っている周期が短ければ短いほど、アニメーションフレームのフレーム加速度ＦｒａｍｅＡｃｃが大きい値に設定されて、アニメーションフレームの更新速度が大きくなる。
【０１７４】
[数９]
FrameAcc=AnimFrameMax/CycleSwing
このように、プレイヤの振り下ろし動作が行われた時または直後に、フレーム加速度ＦｒａｍｅＡｃｃが発生されると、その瞬間にアニメーションフレームの進行が速くなるとともに、プレイヤオブジェクト２０２が羽を振り下ろすアニメーションが再生される。このため、プレイヤの羽ばたき動作と、プレイヤオブジェクト２０２の羽ばたき動作とが同期（リンク）しているように見える。その後、アニメーションフレームは、次の振り下ろし動作または振り上げ動作が判定されるまで、惰性で進行する。つまり、何ら加速が無ければ（ＦｒａｍｅＡｃｃ＝０）、アニメーションフレームのフレーム速度が空気抵抗によって減少していき、やがて０になり、アニメーションの再生が止まる。
【０１７５】
具体的には、ゲーム画面を表示（更新）する時のアニメーションフレームのフレーム数は、数１０および数１１に従って決定される。ただし、アニメーションフレームの更新（進行）速度（フレーム速度）はＦｒａｍｅＶｅｌで示され、アニメーションフレームの加速度（フレーム加速度）はＦｒａｍｅＡｃｃで示され、アニメーションフレームのフレーム数（番号）はＦｒａｍｅで示される。また、現フレーム（今回）の値には、ｏｌｄが付され、次フレーム（次回）の値には、ｎｅｗが付される。したがって、数１０では、空気抵抗を考慮した次回のフレーム速度が算出され、また、数１１では、次回のフレーム番号が算出される。
【０１７６】
[数１０]
FrameVel_new=(FrameVel_old+FrameAcc)×0.99
[数１１]
Frame_new=Frame_old+FrameVel_new
ただし、０．９９は空気抵抗である。したがって、定数である必要はなく、仮想ゲームの進行状況に応じて可変的に設定してもよい。
【０１７７】
一方、振り下ろし動作の開始が判定されたときに、現在のアニメーションフレームが振り下ろし加速度発生可能区間内でない場合には、振り下ろし加速度発生可能区間まで、数１２で算出されたフレーム速度（ただし、フレーム加速度ＡｎｉｍｅＶｃｃ＝０）に従ってアニメーションフレームが進められる。
【０１７８】
[数１２]
FrameVel_old=AnimFrameMax×1.7/CycleSwing
そして、アニメーションフレームが振り下ろし加速度発生可能区間まで進められると、上述したように、フレーム加速度ＦｒａｍｅＡｃｃが発生され、プレイヤの羽ばたき動作と、プレイヤオブジェクト２０２の羽ばたき動作との同期が取られる。
【０１７９】
ここで、数９と数１２とを比較して分かるように、数１２で得られるフレーム速度は、数９で得られる加速度ＦｒａｍｅＡｃｃの１．７倍である。たとえば、アニメーションフレームが７フレームである場合に、振り下ろし動作の開始の判定があると、アニメーションフレームは、数１２で得られた１．７倍のフレーム速度で１５フレームまで到達し、その後、数１０で算出されたフレーム速度で３０フレームまで到達する。ただし、この場合には、振り下ろし動作は、振り下ろし加速度発生可能区間外で行われているため、１５フレームから３０フレームまでの間における加速度ＦｒａｍｅＡｃｃは０である。したがって、アニメーションフレームのフレーム速度は、１５フレームから３０フレームまでの間で空気抵抗（ここでは、０．９９）によって減速（減衰）される。つまり、このような場合には、７フレームから１５フレームまでのフレーム速度は、１５フレームから３０フレームまで（振り下ろし加速発生可能区間）のフレーム速度よりも大きく、等速である。
【０１８０】
したがって、この場合には、アニメーションフレームの更新速度を１５フレームから３０フレームまでの間で、一旦加速した後に減速させることにはならないため、プレイヤオブジェクト２０２に、実際の鳥（比較的大型の鳥）が羽ばたいているような動作を実行させることができない。
【０１８１】
しかし、上述のように、振り下ろし動作の開始の判定が振り下ろし加速度発生可能区間外であった場合には、１．７倍のフレーム速度で１５フレームまでアニメーションフレームが進行され、１５フレームから３０フレームの間でフレーム速度が減速され、次の振り下ろし判定が行われるようなサイクル（以下、「サイクルＡ」と呼ぶことにする）となるので、プレイヤが１回の羽ばたき動作を行うことにより、プレイヤオブジェクト２０２が１回の羽ばたき動作を行う（アニメーションフレームが０フレームから５９フレームまで進行する）ことが保障される。また、このような場合には、振り下ろし加速度発生可能区間では、フレーム速度は加速されないが、プレイヤが振り下ろし動作を開始したことに応じて、１．７倍のフレーム速度でアニメーションフレームは更新される。つまり、プレイヤの動作に応じてプレイヤオブジェクト２０２の動作が制御されているため、プレイヤは違和感を覚えることはない。
【０１８２】
また、数１２に従って算出されるフレーム速度は、振り下ろし動作の開始の判定の時間間隔である羽ばたき区間（羽ばたき周期）ＣｙｃｌｅＳｗｉｎｇに反比例しているので、ゆっくり（遅く）羽ばたき動作を行うと、サイクルＡがゆっくり（遅く）進行し、速く羽ばたき動作を行うと、サイクルＡが速く進行する。
【０１８３】
このため、振り下ろし動作の開始を判定するだけでアニメーションフレームの進行を制御した場合であっても、プレイヤの羽ばたき動作とアニメーションとの同期を取ることができる。
【０１８４】
上述したように、振り下ろし動作の開始が判定されたときに、現在のアニメーションフレームが振り下ろし加速度発生可能区間内である場合には、フレーム加速度ＦｒａｍｅＡｃｃを発生させて、その後に、数１０および数１１に従って惰性でアニメーションフレームを更新させるようにしてある。しかし、これだけでは、アニメーションフレームがプレイヤの行う次の振り下ろし動作を含む羽ばたき動作に対して遅延してしまうことになる。
【０１８５】
この遅延を解消するため、この実施例では、プレイヤが大羽ばたき動作を行うことにより、振り上げ動作の開始を判定することができる場合には、アニメーションフレームの進め方Ａのみならず、アニメーションフレームの進め方Ｂを用いて、アニメーションフレームの進行を制御するようにしてある。
【０１８６】
すなわち、アニメーションフレームの進め方Ａにより、或る程度、プレイヤの羽ばたき動作とアニメーションフレームとの同期を取り、さらに、アニメーションフレームの進め方Ｂにより、より正確に、プレイヤの羽ばたき動作とアニメーションフレームとの同期を取るようにしているのである。
【０１８７】
なお、上述したように、数１２で得られるフレーム速度は、数９で得られる加速度ＦｒａｍｅＡｃｃの１．７倍である。これは、プレイヤの羽ばたき動作（振り下ろし動作）によって得られる加速度ＦｒａｍｅＡｃｃよりも、フレーム速度を大きくするために設定された倍率であり、実験等により経験的に得られた数値である。
【０１８８】
次に、アニメーションフレームの進め方Ｂについて説明する。上述したように、振り上げ動作の開始が判定されると、後述する振り上げ加速フラグ４０４ｎ（図２１参照）がオンされる。振り上げ加速フラグ４０４ｎがオンになっている場合に、現在のアニメーションフレームが図１９に示す振り上げ加速度発生可能区間（フレーム番号：３０以上６０未満）内であるかどうかを判断する。
【０１８９】
なお、後述するように、振り上げ加速フラグ４０４ｎは、振り上げ加速度発生可能区間において、アニメーションフレームの更新速度を加速させると、オフされる。
【０１９０】
振り上げ動作の開始が判定さたときに、現在のアニメーションフレームが振り上げ加速度発生可能区間内である場合には、振り上げ加速度が発生される。つまり、フレーム加速度ＦｒａｍｅＡｃｃに０より大きい値（この実施例では、２）が設定され、更新速度がゲームフレーム（１／６０（秒））よりも速くされる。ただし、現在のフレーム速度ＦｒａｍｅＶｅｌ＿ｏｌｄが２以上である場合には、フレーム加速度ＦｒａｍｅＡｃｃは０に設定される。つまり、プレイヤの振り上げ動作が行われた時またはその直後に、フレーム加速度ＦｒａｍｅＡｃｃを発生され、その瞬間にアニメーションフレームの進行が最も速くなるとともに、プレイヤオブジェクト２０２が羽を振り上げるアニメーションが再生される。このため、プレイヤの羽ばたき動作と、プレイヤオブジェクト２０２の羽ばたき動作とが同期しているように見える。したがって、プレイヤの羽ばたき動作とアニメーションフレームとが同期しているように見えない場合には、プレイヤは、自身の羽ばたき動作、特に振り上げ動作が正しく行われていないことを、画面（ゲーム画面２００等）を通して理解することができる。これによって、プレイヤに開発者等が意図する（正しい）羽ばたき動作（トレーニングの動作）を行わせることを促進することになると考えられる。
【０１９１】
一方、振り上げ動作の開始が判定されたときに、現在のアニメーションフレームが振り上げ加速度発生可能区間内でない場合には、アニメーションフレームは、惰性で進行される。詳細な説明は省略するが、振り上げ動作の場合のフレーム数の算出も、上述した数１０および数１１に従って算出される。
【０１９２】
ここで、振り下ろし加速度発生可能区間を１５フレーム以上３０フレーム未満に設定しているのは、その間にアニメーションフレームの進行を加速させると、プレイヤの振り下ろし動作に同期して、プレイヤオブジェクト２０２が羽を振り下ろしていると、プレイヤが感じるからである。
【０１９３】
仮に、アニメーションフレームが３７フレーム付近において、アニメーションフレームの進行を加速させ、アニメーションフレームが４５フレーム付近まで速く進んだとすると、プレイヤオブジェクト２０２が、羽を振り下ろした後、直ぐに羽を振り上げたと、プレイヤが感じてしまう。すなわち、プレイヤは、振り下ろし動作を行ったにも関わらず、振り上げ動作が認識されたと感じてしまうことになる。
【０１９４】
また、振り上げ加速度発生可能区間を３０フレーム以上６０フレーム未満に設定しているのは、そのうち、４５フレーム以上６０フレーム未満については、振り下げ加速度発生可能区間と同様に、その間にアニメーションフレームの進行を加速させると、プレイヤの振り上げ動作に同期して、プレイヤオブジェクト２０２が羽を振り上げていると、プレイヤが感じるからである。
【０１９５】
さらに、振り上げ加速度発生可能区間に３０フレーム以上４５フレーム未満を含んでいるのは、数ゲームフレーム後に来るはずのプレイヤの振り下ろし動作の開始の判定に備えて、出来るだけ振り下ろし加速度発生可能区間にアニメーションフレームを近づけておくためである。この場合、アニメーションフレームの３０フレーム以上４５フレーム未満においては、見た目には振り下ろしのアニメーションであるため、プレイヤが振り上げ動作を行ったにも関わらず、振り下ろしのアニメーションが再生されることになる。しかし、羽ばたき動作では、プレイヤは振り上げ動作を行った直後には振り下ろし動作を行うため、次の動作を予測してアニメーションフレームを進め易くすることにより、プレイヤの羽ばたき動作とアニメーションとの同期を取ることができる。逆に、プレイヤは振り下ろし動作を行った直後に振り上げ動作を行う必要性は無く、振り下ろし動作を行った後にそのままの姿勢を維持することがあったり、プレイヤが振り上げ動作を行ったとしても、上述した手法では、その振り上げ動作の開始を判定されないことがあったりするため、次の動作を予測してアニメーションフレームを進め易くしておく必要がない場合もある。
【０１９６】
また、振り上げ加速度発生可能区間に３０フレーム以上４５フレーム未満を含んでいるのは、上述したサイクルＡにおいて、１．７倍のフレーム速度で１５フレームまで進める（追いつく）部分（以下、「補正区間」という）があるが、この補正区間を小さくするためである。具体的には、振り上げ加速度発生可能区間が長いと、当該区間において、振り上げ動作の開始が判定されると、アニメーションフレームの更新速度（フレーム速度）が加速され、アニメーションフレームの進行が大きくなる。これによって、プレイヤの振り下ろし動作後の振り上げ動作によるフレーム加速度ＦｒａｍｅＡｃｃが得られ、次に振り下ろし動作の開始が判定されるときに、アニメーションフレームが１５フレーム付近まで進んでいる可能性が高くなる。つまり、補正区間を縮めることができる。また、タイミングによっては、補正区間が無くなることもある。補正区間が無くなった場合には、１５フレームから３０フレームの間で振り下ろし動作の開始が判定され、アニメーションフレームが一旦加速された後に、減速されることになる。かかる場合には、プレイヤの羽ばたき動作とアニメーションとが正確に同期する。
【０１９７】
また、図示は省略するが、プレイヤが小羽ばたき動作を行う場合には、振り上げ判定が行われなくても、振り下ろし加速度発生可能区間においてアニメーションフレームを加速するだけで、プレイヤの羽ばたき動作とプレイヤオブジェクト２０２の羽ばたき動作のアニメーションとの同期を取ることができる。これは、プレイヤが大羽ばたき動作を行う場合にも同様である。したがって、振り上げ動作の開始の判定処理および振り上げ加速度発生可能区間における加速処理を実行しなくてもよいとも考えられる。
【０１９８】
しかし、この実施例では、より正確に同期を取るために、振り上げ動作の開始の判定処理を行うとともに、振り上げ加速度発生可能区間において加速処理を実行するようにしてある。
【０１９９】
図２０には、図２に示したメインメモリ（４２ｅ，４６）のメモリマップ４００の一例を示す図解図である。図２０に示すように、メインメモリ（４２ｅ，４６）には、プログラム記憶領域４０２およびデータ記憶領域４０４０が設けられる。プログラム記憶領域４０２には、ゲームプログラムが記憶され、ゲームプログラムは、メイン処理プログラム４０２ａ、画像生成プログラム４０２ｂ、画像表示プログラム４０２ｃ、荷重取得プログラム４０２ｄ、体重率算出プログラム４０２ｅ、重心算出プログラム４０２ｆ、動作判別プログラム４０２ｇ、並進運動算出プログラム４０２ｈ、回転運動算出プログラム４０２ｉおよびアニメーション同期プログラム４０２ｊなどによって構成される。
【０２００】
メイン処理プログラム４０２ａは、この実施例の仮想ゲームのメインルーチンを処理するためのプログラムである。画像生成プログラム４０２ｂは、後述する画像データ４０４ｂを用いて、ゲーム画像データを生成（更新）するためのプログラムである。画像表示プログラム４０２ｃは、画像生成プログラム４０２ｂに従って生成されたゲーム画像データをゲーム画面（２００など）としてモニタ３４に表示（出力）するためのプログラムである。
【０２０１】
荷重取得プログラム４０２ｄは、荷重コントローラ３６で計測（検出）される現在の荷重値を取得するためのプログラムである。具体的には、４つの荷重センサ３６ｂのそれぞれで検出される荷重値が合計される。この実施例では、仮想ゲームの本編の開始に先立って、プレイヤが荷重コントローラ３６の上に乗り、静止した状態で、当該プレイヤの体重値が検出される。この体重値に対応する数値データが取得され、後述する基準値データ４０４ｆとしてデータ記憶領域４０４に記憶される。また、ゲーム中では、１ゲームフレーム毎に荷重値が検出され、検出された荷重値に対応する数値データが取得され、後述する現荷重値データ４０４ｇとしてデータ記憶領域４０４に記憶される。
【０２０２】
体重率算出プログラム４０２ｅは、荷重取得プログラム４０２ｄに従って取得された現在（現フレーム）の荷重値を、同じく荷重取得プログラム４０２ｄに従って取得されたプレイヤの体重値（基準値）で割った体重率ＷＲを１ゲームフレーム毎に算出するためのプログラムである。この体重率算出プログラム４０２ｅに従って算出された体重率ＷＲの数値データが体重率データとして後述する体重率データバッファ４０４ａに時系列に従って記憶される。
【０２０３】
重心算出プログラム４０２ｆは、荷重取得プログラム４０２ｄに従って検出された各荷重センサ３６ｂにおける荷重値を用いて、数７および数８に従って重心位置の座標（ＸＧ，ＹＧ）を算出し、算出した座標（ＸＧ，ＹＧ）に対応する座標データを後述する重心位置データ４０４ｈとしてデータ記憶領域４０４に記憶するためのプログラムである。
【０２０４】
動作判別プログラム４０２ｇは、１ゲームフレーム毎に算出される体重率ＷＲの時間変化を、一定時間（この実施例では、３０ゲームフレーム）毎に離散フーリエ変換した結果に基づいて、プレイヤによる羽ばたき動作の有無および羽ばたき動作の種類（大羽ばたき動作または小羽ばたき動作）を判別するためのプログラムである。
【０２０５】
並進運動算出プログラム４０２ｈは、羽ばたき動作によって得られる推進力または重心算出プログラム４０２ｆに従って算出された重心位置のＹ座標（ＹＧ）に基づいて、プレイヤオブジェクト２０２の一定時間（１ゲームフレーム）後の位置（３次元座標）を算出するためのプログラムである。
【０２０６】
回転運動算出プログラム４０２ｉは、重心算出プログラム４０２ｆに従って算出された重心位置の座標（ＸＧ，ＹＧ）に基づいて、プレイヤオブジェクト２０２のローカル座標のＸ軸回りの回転量およびローカル座標のＹ軸回りの回転量を算出するためのプログラムである。アニメーション同期プログラム４０２ｊは、プレイヤの羽ばたき動作に、プレイヤオブジェクト２０２の羽ばたき動作のアニメーションを同期させるためのプログラムである。
【０２０７】
なお、図示は省略するが、ゲームプログラムには、音出力プログラムやバックアッププログラムなども含まれる。音出力プログラムは、プレイヤオブジェクトの音声（擬声音）、効果音、音楽（ＢＧＭ）のようなゲームに必要な音を生成し、スピーカ３４ａから出力するためのプログラムである。バックアッププログラムは、メインメモリ（４２ｅ，４６）に記憶されたゲームデータ（途中データ，結果データ）を、フラッシュメモリ４４やＳＤカードにセーブするためのプログラムである。
【０２０８】
図２１には、データ記憶領域４０４の具体的な内容が示される。図２１に示すように、データ記憶領域４０４には、体重率データバッファ４０４ａが設けられる。また、データ記憶領域４０４には、画像データ４０４ｂ、大羽ばたきアニメーションデータ４０４ｃ、小羽ばたきアニメーションデータ４０４ｄ、下降時アニメーションデータ４０４ｅ、基準値データ４０４ｆ、現荷重値データ４０４ｇおよび重心位置データ４０４ｈが記憶される。さらに、データ記憶領域４０４には、下降中フラグ４０４ｉ、体重率下降フラグ４０４ｊ、振り上げ判定フラグ４０４ｋ、振り下ろし判定フラグ４０４ｍ、振り上げ加速フラグ４０４ｎ、振り下ろし加速フラグ４０４ｐ、大羽ばたきフラグ４０４ｑ、小羽ばたきフラグ４０４ｒ、着地成功フラグ４０４ｓ、着地失敗フラグ４０４ｔ、ゲームクリアフラグ４０４ｕおよびゲームオーバフラグ４０４ｖが設けられる。
【０２０９】
体重率データバッファ４０４ａは、体重率算出プログラム４０２ｅに従って１ゲームフレーム毎に算出される体重率データを、時系列に従って記憶するためのデータバッファである。
【０２１０】
画像データ４０４ｂは、画像生成プログラム４０２ｂに従ってゲーム画像データを生成する際に使用されるポリゴンデータやテクスチャデータなどのデータである。大羽ばたきアニメーションデータ４０４ｃは、プレイヤオブジェクト２０２が大羽ばたき動作する場合のアニメーションのデータであって、６０個（コマ）のアニメーションフレームで構成される。小羽ばたきアニメーションデータ４０４ｄは、プレイヤオブジェクト２０２が小羽ばたき動作する場合のアニメーションのデータであって、６０個のアニメーションフレームで構成される。上述したように、大羽ばたきと小羽ばたきとでは、羽の可動範囲が異なるだけである。下降時アニメーションデータ４０４ｅは、プレイヤオブジェクト２０２が下降する場合のアニメーションのデータであって、４５個のアニメーションフレームで構成される。
【０２１１】
基準値データ４０４ｆは、仮想ゲームの本編に先立って荷重取得プログラム４０２ｄに従って取得された荷重値すなわちプレイヤの体重値についての数値データである。現荷重値データ４０４ｇは、荷重取得プログラム４０２ｄに従って取得される現在（現フレーム）の荷重値についての数値データである。重心位置データ４０４ｈは、重心算出プログラム４０２ｆに従って算出される現在（現フレーム）の重心位置の座標（ＸＧ，ＹＧ）についての座標データである。
【０２１２】
下降中フラグ４０４ｉは、プレイヤオブジェクト２０２が下降中であるかどうかを判定するためのフラグであり、１ビットのレジスタで構成される。プレイヤオブジェクト２０２が下降中である場合には、下降中フラグ４０４ｉは成立（オン）され、レジスタにデータ値「１」が設定される。一方、プレイヤオブジェクト２０２が下降中でない場合には、下降中フラグ４０４ｉは不成立（オフ）され、レジスタにデータ値「０」が設定される。
【０２１３】
体重率下降フラグ４０４ｊは、体重率ＷＲが下降（減少）しているかどうかを判定するためのフラグであり、１ビットのレジスタで構成される。体重率ＷＲが下降している場合には、体重率下降フラグ４０４ｊはオンされ、レジスタにデータ値「１」が設定される。一方、体重率ＷＲが下降していない場合すなわち体重率ＷＲが上昇したり変化しなかったりする場合には、体重率下降フラグ４０４ｊはオフされ、レジスタにデータ値「０」が設定される。
【０２１４】
振り上げ判定フラグ４０４ｋは、振り上げ動作の開始が判定されたかどうかを判定するためのフラグであり、１ビットのレジスタで構成される。振り上げ動作の開始が判定されると、振り上げ判定フラグ４０４ｋはオンされ、レジスタにデータ値「１」が設定される。一方、振り下ろし動作の開始が判定されると、振り上げ判定フラグ４０４ｋはオフされ、レジスタにデータ値「０」が設定される。ただし、後述する振り下ろし判定フラグ４０４ｍがオンされた場合にも、振り上げ判定フラグ４０４ｋはオフされる。
【０２１５】
振り下ろし判定フラグ４０４ｍは、振り下ろし動作の開始が判定されたかどうかを判定するためのフラグであり、１ビットのレジスタで構成される。振り下ろし動作の開始が判定されると、振り下ろし判定フラグ４０４ｍはオンされ、レジスタにデータ値「１」が設定される。一方、振り上げ動作の開始が判定されると、振り下ろし判定フラグ４０４ｍはオフされ、レジスタにデータ値「０」が設定される。ただし、上述した振り上げ判定フラグ４０４ｋがオンされた場合にも、振り下ろし判定フラグ４０４ｍはオフされる。
【０２１６】
振り上げ加速フラグ４０４ｎは、振り上げ動作に応じてアニメーションフレームを加速させたか否かを判定するためのフラグであり、１ビットのレジスタで構成される。振り上げ動作の開始が判定されると、振り上げ加速フラグ４０４ｎはオンされ、レジスタにデータ値「１」が設定される。また、振り上げ動作の開始が判定され、アニメーションフレームが加速されると、振り上げ加速フラグ４０４ｎはオフされ、レジスタにデータ値「０」が設定される。
【０２１７】
振り下ろし加速フラグ４０４ｐは、振り下ろし動作に応じてアニメーションフレームを加速させたか否かを判定するためのフラグであり、１ビットのレジスタで構成される。振り下ろし動作の開始が判定されると、振り下ろし加速フラグ４０４ｐはオンされ、レジスタにデータ値「１」が設定される。また、振り下ろし動作の開始が判定され、アニメーションフレームが加速されると、振り下ろし加速フラグ４０４ｐはオフされ、レジスタにデータ値「０」が設定される。
【０２１８】
大羽ばたきフラグ４０４ｑは、大羽ばたき動作が判別されたかどうかを判定するためのフラグであり、１ビットのレジスタで構成される。大羽ばたき動作が判別されると、大羽ばたきフラグ４０４ｑはオンされ、レジスタにデータ値「１」が設定される。一方、大羽ばたき動作が判別されなければ、大羽ばたきフラグ４０４ｑはオフされ、レジスタにデータ値「０」が設定される。ただし、後述する小羽ばたきフラグ４０４ｒがオンされた場合やプレイヤが羽ばたき動作を行っていない場合にも、大羽ばたきフラグ４０４ｑはオフされる。
【０２１９】
小羽ばたきフラグ４０４ｒは、小羽ばたき動作が判別されたかどうかを判定するためのフラグであり、１ビットのレジスタで構成される。小羽ばたき動作が判別されると、小羽ばたきフラグ４０４ｒはオンされ、レジスタにデータ値「１」が設定される。一方、小羽ばたき動作が判別されなければ、小羽ばたきフラグ４０４ｒはオフされ、レジスタにデータ値「０」が設定される。ただし、上述した大羽ばたきフラグ４０４ｑがオンされた場合やプレイヤが羽ばたき動作を行っていない場合にも、小羽ばたきフラグ４０４ｒはオフされる。
【０２２０】
着地成功フラグ４０４ｓは、プレイヤオブジェクト２０２がノンプレイヤオブジェクト２０４への着地に成功したかどうかを判定するためのフラグであり、１ビットのレジスタで構成される。プレイヤオブジェクト２０２がノンプレイヤオブジェクト２０４への着地に成功すると、着地成功フラグ４０４ｓはオンされ、レジスタにデータ値「１」が設定される。一方、プレイヤオブジェクト２０２がノンプレイヤオブジェクト２０４に着地に成功していなければ、着地成功フラグ４０４ｓはオフされ、レジスタにデータ値「０」が設定される。
【０２２１】
着地失敗フラグ４０４ｔは、プレイヤオブジェクト２０２がノンプレイヤオブジェクト２０４への着地に失敗したかどうかを判定するためのフラグであり、１ビットのレジスタで構成される。プレイヤオブジェクト２０２がノンプレイヤオブジェクト２０４への着地に失敗すると、着地失敗フラグ４０４ｔはオンされ、レジスタにデータ値「１」が設定される。一方、プレイヤオブジェクト２０２がノンプレイヤオブジェクト２０４への着地に失敗していなければ、着地失敗フラグ４０４ｔはオフされ、レジスタにデータ値「０」が設定される。
【０２２２】
ゲームクリアフラグ４０４ｕは、仮想ゲームがクリアされたかどうかを判定するためのフラグであり、１ビットのレジスタで構成される。ゲームクリアされると、ゲームクリアフラグ４０４ｕがオンされ、レジスタにデータ値「１」が設定される。一方、ゲームクリアでなければ、ゲームクリアフラグ４０４ｕがオフされ、レジスタにデータ値「０」が設定される。
【０２２３】
ゲームオーバフラグ４０４ｖは、仮想ゲームがゲームオーバになったかどうかを判定するためのフラグであり、１ビットのレジスタで構成される。ゲームオーバになると、ゲームオーバフラグ４０４ｖがオンされ、レジスタにデータ値「１」が設定される。一方、ゲームオーバでなければ、ゲームオーバフラグ４０４ｖがオフされ、レジスタにデータ値「０」が設定される。
【０２２４】
なお、図示は省略するが、データ記憶領域４０４には、音データのような他のデータが記憶され、ゲームプログラムの実行に必要なタイマ（カウンタ）や他のフラグが設けられる。
【０２２５】
具体的には、図２に示したＣＰＵ４０が図２２−図２５に示すフロー図に従って全体処理を実行する。図示は省略するが、全体処理とは別のタスクにより、ＣＰＵ４０は、一定時間（３０ゲームフレーム）毎に、体重率ＷＲの時間変化を離散フーリエ変換する処理を実行する。
【０２２６】
図２２に示すように、全体処理を開始すると、ステップＳ１で、初期設定を実行する。このステップＳ１では、ＣＰＵ４０は、体重率データバッファ４０４ａ、基準値データ４０４ｆ、現荷重値データ４０４ｇおよび重心位置データ４０４ｈをクリアしたり、画像データ４０４ｂ、大羽ばたきアニメーションデータ４０４ｃ、小羽ばたきアニメーションデータ４０４ｄおよび下降時アニメーションデータ４０４ｅをデータ記憶領域４０４にロードしたり、各種フラグ４０４ｉ−４０４ｖをオフしたりする。
【０２２７】
次のステップＳ３では、プレイヤの体重値を検出し、基準値として記憶する。つまり、ＣＰＵ４０は、仮想ゲームの本編の開始に先立って、４つの荷重センサ３６ｂで検出された荷重値の合計を体重値として取得し、その数値データを基準値データ４０４ｆとしてデータ記憶領域４０４に記憶する。そして、ステップＳ５で、仮想ゲームの本編を開始する。
【０２２８】
続いて、ステップＳ７では、現在（現フレーム）の荷重値を取得し、取得した荷重値を記憶する。つまり、ＣＰＵ４０は、４つの荷重センサ３６ｂで検出された荷重値の合計を現在の荷重値として取得し、その数値データを現荷重値データ４０４ｇとしてデータ記憶領域４０４に記憶する。
【０２２９】
なお、ステップＳ７−Ｓ７９の処理のスキャンタイムは、１ゲームフレーム（１／６０（秒））であるため、仮想ゲーム中では、１ゲームフレーム毎に、現在の荷重値が検出される。つまり、現荷重値データ４０４ｇは、１ゲームフレーム毎に更新される。このことは、次の重心位置データ４０４ｈも同様である。
【０２３０】
次のステップＳ９では、現在の重心位置を算出し、算出した重心位置を記憶する。つまり、ＣＰＵ４０は、４つの荷重センサ３６ｂから取得した荷重値を用いて、数２および数３に従って、現フレームの重心位置の座標（ＸＧ，ＹＧ）を算出し、算出した重心位置の座標（ＸＧ，ＹＧ）についての座標データを重心位置データ４０４ｈとしてデータ記憶領域４０４に記憶する。
【０２３１】
続いて、ステップＳ１１では、後述する動作判別処理（図２６−図２８参照）を実行する。次のステップＳ１３では、動作判別処理の結果に基づいて、大羽ばたきかどうかを判断する。ここでは、ＣＰＵ４０は、大羽ばたきフラグ４０４ｑがオンであるかどうかを判断する。ステップＳ１３で“ＹＥＳ”であれば、つまり大羽ばたきフラグ４０４ｑがオンであれば、大羽ばたきであると判断して、ステップＳ１５で、積分シミュレーションで使用する推進力ＡｃｃＳｉｍに、体重率ＷＲを用いて算出された推進力Ａｃｃに０．０５を掛けた値を設定し（ＡｃｃＳｉｍ＝Ａｃｃ×０．０５）、ステップＳ１７で、大羽ばたきのアニメーションを選択して、図２３に示すステップＳ２５に進む。
【０２３２】
また、ステップＳ１３で“ＮＯ”であれば、つまり大羽ばたきフラグ４０４ｑがオフであれば、ステップＳ１９で、小羽ばたきであるかどうかを判断する。つまり、ＣＰＵ４０は、小羽ばたきフラグ４０４ｒがオンであるかどうかを判断する。ステップＳ１９で“ＮＯ”であれば、つまり小羽ばたきでなければ、プレイヤが羽ばたき動作を行っていないと判断して、そのままステップＳ２５に進む。一方、ステップＳ１９で“ＹＥＳ”であれば、つまり小羽ばたきであれば、ステップＳ２１で、積分シミュレーションで使用する推進力ＡｃｃＳｉｍに、体重率ＷＲを用いて算出された推進力Ａｃｃに０．０４２５を掛けた値を設定し（ＡｃｃＳｉｍ＝Ａｃｃ×０．０４２５）、ステップＳ２３で、小羽ばたきのアニメーションを選択して、ステップＳ２５に進む。
【０２３３】
図２３に示すステップＳ２５では、重心の前後すなわち重心位置のＹ座標（ＹＧ）による並進加速度ＡｃｃＢｏａｒｄを算出する。次のステップＳ２７では、プレイヤオブジェクト２０２の移動後（次フレーム）の速度Ｖｅｌ＿ｎｅｗを数３に従って算出する。続いて、ステップＳ２９では、速度Ｖｅｌ＿ｎｅｗが最大速度ＶｅｌＭａｘを超えているかどうかを判断する。ステップＳ２９で“ＮＯ”であれば、つまり速度Ｖｅｌ＿ｎｅｗが最大速度ＶｅｌＭａｘ以下であれば、そのままステップＳ３３に進む。一方、ステップＳ２９で“ＹＥＳ”であれば、つまり速度Ｖｅｌ＿ｎｅｗが最大速度ＶｅｌＭａｘを超えていれば、ステップＳ３１で、速度Ｖｅｌ＿ｎｅｗに最大速度ＶｅｌＭａｘを設定して、ステップＳ３３に進む。つまり、ステップＳ３１では、速度Ｖｅｌ＿ｎｅｗが最大速度ＶｅｌＭａｘで制限される。
【０２３４】
ステップＳ３３では、プレイヤオブジェクト２０２の移動後の３次元位置Ｐｏｓ＿ｎｅｗを数４に従って算出する。次のステップＳ３５では、プレイヤオブジェクト２０２が下降中であるかどうかを判断する。ここでは、ＣＰＵ４０は、プレイヤオブジェクト２０２の現在の速度Ｖｅｌ＿ｏｌｄのＹ成分が一定値（この実施例では、−０．７）未満であるかどうかを判断する。ステップＳ３５で“ＮＯ”であれば、つまり現在の速度Ｖｅｌ＿ｏｌｄのＹ成分が一定値以上であれば、プレイヤオブジェクト２０２は下降中でないと判断し、ステップＳ３９で、重心位置のＸ座標（ＸＧ）およびＹ座標（ＹＧ）に基づいて、プレイヤオブジェクト２０２の回転量を算出し、ステップＳ４１で、下降中フラグ４０４ｉをオフして、図２４に示すステップ５３に進む。
【０２３５】
つまり、ステップＳ３９では、ＣＰＵ４０は、重心位置のＹ座標（ＹＧ）に基づいてローカル座標のＸ軸周りの回転量と、重心位置のＸ座標（ＸＧ）に基づいてローカル座標のＹ軸周りの回転量とを算出する。このＸ軸周りの回転量とＹ軸周りの回転量とによって、まず、３次元仮想空間において、プレイヤオブジェクト２０２のローカル座標のＺ軸を当てはめる方向（Ｚベクトル（Ｘｚ，Ｙｚ，Ｚｚ））を決定する。次に、このＺベクトルに直交し、プレイヤオブジェクト２０２の左手方向に延びるローカル座標のＸ軸を当てはめる方向（Ｘベクトル（Ｘｘ，Ｙｘ，Ｚｘ））を決定する。さらに、ＺベクトルとＸベクトルとの外積を求めて、３次元仮想空間において、プレイヤオブジェクト２０２のローカル座標のＹ軸を当てはめる方向（Ｙベクトル（Ｘｙ，Ｙｙ，Ｚｙ））すなわち単位ベクトルＡｃｃＤｉｒを決定する。ただし、Ｘベクトル、ＹベクトルおよびＺベクトルは、大きさ「１」の単位ベクトルである。
【０２３６】
一方、ステップＳ３５で“ＹＥＳ”であれば、つまり現在の速度Ｖｅｌ＿ｏｌｄのＹ成分が一定値未満であれば、プレイヤオブジェクト２０２は下降中であると判断して、ステップＳ３６で、重心位置のＸ座標（ＸＧ）に基づいて、プレイヤオブジェクト２０２の回転量を算出し、ステップＳ３９で、下降時アニメーションを選択して、図２４に示すステップＳ４３に進む。
【０２３７】
つまり、ステップＳ３６では、ＣＰＵ４０は、重心位置のＸ座標（ＸＧ）に基づいて、プレイヤオブジェクト２０２のローカル座標のＹ軸周りの回転量のみを算出し、３次元仮想空間において、プレイヤオブジェクト２０２のローカル座標のＺ軸を当てはめる方向（Ｚベクトル）を決定する。その後、上述したように、３次元仮想空間において、プレイヤオブジェクト２０２のローカル座標のＸ軸を当てはめる方向（Ｘベクトル）を決定し、さらに、３次元仮想空間において、プレイヤオブジェクト２０２のローカル座標のＹ軸を当てはめる方向（Ｙベクトル）を決定する。
【０２３８】
図２４に示すステップＳ４３では、下降中フラグ４０４ｉがオフであるかどうかを判断する。つまり、ＣＰＵ４０は、プレイヤオブジェクト２０２が下降を開始したかどうかを判断するのである。ステップＳ４３で“ＹＥＳ”であれば、つまり下降中フラグ４０４ｉがオフであれば、プレイヤオブジェクト２０２が下降を開始したと判断して、ステップＳ４５で、下降中フラグ４０４ｉをオンし、ステップＳ４７で、アニメーションフレームＦｒａｍｅ＿ｎｅｗにフレーム番号の初期値（この実施例では、０）を設定し、ステップＳ５１で、決定されたアニメーションフレームＦｒａｍｅ＿ｎｅｗのアニメーションを設定して、図２５に示すステップＳ５９に進む。
【０２３９】
一方、ステップＳ４３で“ＮＯ”であれば、つまり下降中フラグ４０４ｉがオンであれば、プレイヤオブジェクト２０２は既に下降中であると判断して、ステップＳ４９でアニメーションフレームＦｒａｍｅ＿ｎｅｗに１加算して、ステップＳ５１に進む。ただし、アニメーションフレームＦｒａｍｅ＿ｎｅｗの現在の値が「４４」である場合には、つまりアニメーションフレームが最終フレームである場合には、ステップＳ４９においてアニメーションフレームＦｒａｍｅ＿ｎｅｗに１加算されると、その値は「０」に設定される。つまり、アニメーションフレームのフレーム番号が初期値に戻される。
【０２４０】
また、図２３に示したように、プレイヤオブジェクト２０２が下降中でない場合には、ステップＳ３７で“ＮＯ”となり、ステップＳ４１で下降中フラグ４０４ｉをオフして後に、ステップＳ５３で、ステップＳ１７またはＳ２３で選択された羽ばたきアニメーション（大羽ばたきアニメーション，小羽ばたきアニメーション）と現在の羽ばたきアニメーションとが異なるかどうかを判断する。ステップＳ５３で“ＮＯ”であれば、つまり選択された羽ばたきアニメーションと現在の羽ばたきアニメーションとが一致している場合には、そのままステップＳ５７に進む。一方、ステップＳ５３で“ＹＥＳ”であれば、つまり選択された羽ばたきアニメーションと現在の羽ばたきアニメーションとが異なる場合には、ステップＳ５５で、羽ばたきアニメーションを切り替えて、ステップＳ５７に進む。
【０２４１】
なお、ステップＳ５５では、単にアニメーションを切り替えるようにしてあるが、大羽ばたきのアニメーションと小羽ばたきのアニメーションとを一気に切り替えると、ゲーム画面２００を見ているプレイヤが違和感を覚えてしまう。このため、この実施例では、それらのアニメーションをブレンドするようにしてある。簡単に説明すると、たとえば、大羽ばたきのアニメーションから小羽ばたきのアニメーションに切り替える場合には、両方のアニメーションを再生する。たとえば、アニメーションを切り替えた瞬間では、大羽ばたきの再生比率は１．０であり、小羽ばたきの再生比率は０．０である。ただし、大羽ばたきのアニメーションと小羽ばたきのアニメーションとは、アニメーションフレームのフレーム番号は一致している。その再生比率が一定時間（この実施例では、３０ゲームフレーム＝０．５秒）の間で次第に（たとえば、線形的に、または段階的に）変化され、つまり大羽ばたきの再生比率が減少されるとともに、小羽ばたきの再生比率が増加され、アニメーションの切替開始から一定時間が経過すると（たとえば、３０ゲームフレーム目には）、大羽ばたきの再生比率が０．０となり、小羽ばたきの再生比率が１．０となる。したがって、大羽ばたきのアニメーションから小羽ばたきのアニメーションに切り替えられる。説明は省略するが、小羽ばたきのアニメーションから大羽ばたきのアニメーションに切り替える場合も同様である。
【０２４２】
図２４に戻って、ステップＳ５７では、後述する同期処理（図２９−図３１）を実行する。続いて、図２５に示すステップＳ５９では、所定の場所に着地成功したかどうかを判断する。ここでは、ＣＰＵ４０は、着地すべきノンプレイヤオブジェクト２０４に着地したかどうかを判断するのである。詳細な説明は省略するが、着地すべきノンプレイヤオブジェクト２０４は、予め設定されていたり、仮想ゲームの進行に応じて可変的に設定されたりする。ただし、ＣＰＵ４０は、プレイヤオブジェクト２０２と着地すべきノンプレイヤオブジェクト２０４との当たりを判定して、当該ノンプレイヤオブジェクト２０４上にプレイヤオブジェクト２０２が乗っているすなわち着地しているかどうかを判断するのである。
【０２４３】
ステップＳ５９で“ＹＥＳ”であれば、つまり所定の場所に着地成功したと判断すると、ステップＳ６１で、着地成功フラグ４０４ｓをオンして、ステップＳ６７に進む。ステップＳ５９で“ＮＯ”であれば、つまりプレイヤオブジェクト２０２が飛行中であったり、海に落ちてしまったり、既に着地したことのあるノンプレイヤオブジェクト２０４に再度着地したりした場合には、所定の場所に着地成功していないと判断して、ステップＳ６３で、所定の場所に着地失敗かどうかを判断する。ここでは、ＣＰＵ４０は、プレイヤオブジェクト２０２が着地すべきノンプレイヤオブジェクト２０４以外のノンプレイヤオブジェクト２０４に着地したり、ノンプレイヤオブジェクト２０４を囲む海に落ちたりしたかどうかを判断する。
【０２４４】
ステップＳ６３で“ＮＯ”であれば、つまりプレイヤオブジェクト２０２が飛行中である場合には、所定の場所に着地失敗していないと判断して、そのままステップＳ６７に進む。一方、ステップＳ６３で“ＹＥＳ”であれば、つまりプレイヤオブジェクト２０２が着地すべきノンプレイヤオブジェクト２０４以外のノンプレイヤオブジェクト２０４に着地したり、プレイヤオブジェクト２０２がノンプレイヤオブジェクト２０４を囲む海に落ちてしまったりした場合には、所定の場所に着地失敗したと判断して、ステップＳ６５で、着地失敗フラグ４０４ｔをオンして、そのままステップＳ７１に進む。
【０２４５】
ステップＳ６７では、ゲームクリアかどうかを判断する。つまり、ＣＰＵ４０は、プレイヤオブジェクト２０２が、所定の着地点をすべて経由して、ゴールに到着したかどうかを判断する。ステップＳ６７で“ＹＥＳ”であれば、つまりゲームクリアであれば、ステップＳ６９で、ゲームクリアフラグ４０４ｕをオンして、ステップＳ７５に進む。
【０２４６】
一方、ステップＳ６７で“ＮＯ”であれば、つまりゲームクリアでなければ、ステップＳ７１で、ゲームオーバであるかどうかを判断する。ここでは、ＣＰＵ４０は、プレイヤオブジェクト２０２がゴールに到達する前に、制限時間を超えてしまったり、プレイヤオブジェクト２０２が所定回数（たとえば、３回）着地に失敗したり、プレイヤオブジェクト２０２が海に落ちている時間が所定時間（たとえば、１０秒）を超えたりしたかどうかを判断する。ステップＳ７１で“ＮＯ”であれば、つまりゲームオーバでなければ、そのままステップＳ７５に進む。一方、ステップＳ７１で“ＹＥＳ”であれば、つまりゲームオーバであれば、ステップＳ７３で、ゲームオーバフラグ４０４ｖをオンして、ステップＳ７５に進む。
【０２４７】
ステップＳ７５では、ゲーム画像を生成する。ここでは、ＣＰＵ４０は、数６で示す行列式Ａに従ってプレイヤオブジェクト２０２を３次元仮想空間に配置するとともに、ステップＳ５１で設定されたアニメーションフレームのアニメーションを下降時アニメーションデータ４０４ｅから読み出したり、ステップＳ５７の同期処理で設定されたアニメーションフレームのアニメーションを羽ばたきアニメーションデータ（４０４ｃ，４０４ｄ）から読み出したりして描画（更新）する。また、ノンプレイヤオブジェクト２０４を含む背景画像を描画（更新）する。さらに、着地成功フラグ４０４ｓ、着地失敗フラグ４０４ｔ、ゲームクリアフラグ４０４ｕまたはゲームオーバフラグ４０４ｖがオンであれば、着地成功、着地失敗、ゲームクリアまたはゲームオーバを表現する画像を生成する。たとえば、着地成功、着地失敗、ゲームクリアまたはゲームオーバを示す旨のテキストがゲーム画像に上書きされる。このとき、図示は省略するが、着地成功、着地失敗、ゲームクリアまたはゲームオーバに応じた効果音ないし音楽が出力される。
【０２４８】
次のステップＳ７７では、ゲーム画像を表示する。つまり、ＣＰＵ４０は、ステップＳ７５で生成（更新）したゲーム画像をゲーム画面（２００など）としてモニタ３４に表示する。そして、ステップＳ７９では、ゲーム終了かどうかを判断する。ここでは、ＣＰＵ４０は、プレイヤの操作によって、ゲーム終了が指示されたかどうかを判断する。ステップＳ７９で“ＮＯ”であれば、つまりゲーム終了でなければ、図２２に示したステップＳ７に戻る。ただし、ゲームオーバになった場合には、仮想ゲームが最初から開始される。一方、ステップＳ７９で“ＹＥＳ”であれば、つまりゲーム終了であれば、そのまま全体処理を終了する。
【０２４９】
なお、図示は省略するが、着地成功フラグ４０４ｓおよび着地失敗フラグ４０４ｔは、ステップＳ７５よりも後であり、ステップＳ７９で“ＮＯ”となり、ステップＳ７に戻るまでの間に、オフされる。
【０２５０】
図２６−図２８は、図２２に示したステップＳ１１の動作判別処理のフロー図である。図２６に示すように、ＣＰＵ４０は、動作判別処理を開始すると、ステップＳ９１で、現在の体重率ＷＲを算出および記憶する。つまり、現荷重値データ４０４ｇが示す荷重値を、基準値データ４０４ｆが示す基準値（体重値）で割ることにより、現在の体重率ＷＲを算出し、その体重率データを体重率データバッファ４０４ａに記憶する。
【０２５１】
次のステップＳ９３では、現在の体重率ＷＲが第１閾値（この実施例では、０．９８５）未満であるかどうかを判断する。つまり、ＣＰＵ４０は、プイレヤオブジェクト２０２に推進力Ａｃｃを与えるかどうかを判断しているのである。ステップＳ９３で“ＹＥＳ”であれば、つまり現在の体重率ＷＲが第１閾値未満であれば、ステップＳ９５で、推進力Ａｃｃに１−体重率ＷＲを設定して、ステップＳ９９に進む。つまり、体重率ＷＲに応じた推進力Ａｃｃが算出（設定）される。一方、ステップＳ９３で“ＮＯ”であれば、つまり現在の体重率ＷＲが第１閾値以上であれば、ステップＳ９７で、推進力Ａｃｃに０を設定して、ステップＳ９９に進む。
【０２５２】
ステップＳ９９では、直前の羽ばたき動作（羽ばたき区間）における体重率ＷＲの最大値が第２閾値（この実施例では、１．３）を超えるかどうかを判断する。つまり、ＣＰＵ４０は、プレイヤの操作入力が屈伸運動によるものかどうかを判断しているのである。ただし、直前の羽ばたき区間は、上述したように、前々回の振り下ろし動作の開始が判定されてから前回（直前）の振り下ろし動作の開始が判定されるまでの区間を意味する。
【０２５３】
ステップＳ９９で“ＮＯ”であれば、つまり直前の羽ばたき動作における体重率ＷＲの最大値が第２閾値以下であれば、プレイヤの操作入力が屈伸運動によるものではないと判断して、ステップＳ１０１で、最大速度ＶｅｌＭａｘをプレイヤオブジェクト２０２の最高速度（この実施例では、４）に設定し、ステップＳ１０３で、推進力Ａｃｃを１．３倍（Ａｃｃ＝Ａｃｃ×１．３）して、ステップＳ１０９に進む。一方、ステップＳ９９で“ＹＥＳ”であれば、つまり直前の羽ばたき動作における体重率ＷＲの最大値が第２閾値を超えていれば、プレイヤの操作入力が屈伸運動によるものであると判断して、ステップＳ１０５で、最大速度ＶｅｌＭａｘをプレイヤオブジェクト２０２の最高速度の半分（この実施例では、２）に設定し、ステップＳ１０７で、推進力Ａｃｃを０．８倍（Ａｃｃ＝Ａｃｃ×０．８）して、ステップＳ１０９に進む。
【０２５４】
このように、ステップＳ９９−Ｓ１０７では、この仮想ゲームの開発者等が意図する操作入力である場合には、プレイヤオブジェクト２０２が前進し易くし、逆に、開発者等が意図しない操作入力である場合には、プレイヤオブジェクト２０２が前進し難くしてある。したがって、最大速度ＶｅｌＭａｘに設定する数値や推進力Ａｃｃに掛ける係数は、実施例の値に限定される必要はない。
【０２５５】
ステップＳ１０９では、現在（現フレーム）の体重率ＷＲと前回（前フレーム）の体重率ＷＲとの差が第３閾値（この実施例では、０．００１）未満であるかどうかを判断する。ステップＳ１０９で“ＹＥＳ”であれば、つまり現在の体重率ＷＲと前回の体重率ＷＲとの差が第３閾値未満であれば、図２７に示すステップＳ１１１で、現在の体重率ＷＲが第４閾値（この実施例では、０．９９）以上第５閾値（この実施例では、１．０１）以下であるかどうかを判断する。
【０２５６】
ステップＳ１１１で“ＹＥＳ”であれば、つまり現在の体重率ＷＲが第４閾値以上第５閾値以下である場合には、体重率ＷＲの上昇でも下降でもないと判断して、図２８に示すように、そのまま動作判別処理を終了する。一方、ステップＳ１１１で“ＮＯ”であれば、つまり現在の体重率ＷＲが第４閾値未満であるまたは第５閾値を超えている場合には、そのまま図２８に示すステップＳ１３７に進む。図示は省略するが、かかる場合には、体重率ＷＲの上昇または下降についての前回の判定結果が維持されることになる。
【０２５７】
図２６に戻って、ステップＳ１０９で“ＮＯ”であれば、つまり現在の体重率ＷＲと前回の体重率ＷＲとの差が第３閾値以上であれば、図２７に示すステップＳ１１３で、現在の体重率ＷＲが前回の体重率ＷＲよりも小さいかどうかを判断する。つまり、ＣＰＵ４０は、体重率ＷＲが下降しているか上昇しているかを判断しているのである。ステップＳ１１３で“ＮＯ”であれば、つまり現在の体重率ＷＲが前回の体重率ＷＲよりも大きければ、体重率ＷＲが上昇していると判断して、ステップＳ１１５で、体重率下降フラグ４０４ｊがオンであるかどうかを判断する。つまり、ＣＰＵ４０は、体重率ＷＲが下降した後に、上昇したかどうかを判断する。
【０２５８】
ステップＳ１１５で“ＮＯ”であれば、つまり体重率下降フラグ４０４ｊがオフであれば、体重率ＷＲは上昇中であると判断して、そのままステップＳ１３７に進む。一方、ステップＳ１１５で“ＹＥＳ”であれば、つまり体重率下降フラグ４０４ｊがオンであれば、体重率ＷＲが下降した後に上昇したと判断して、ステップＳ１１７で、体重率下降フラグ４０４ｊをオフし、ステップＳ１１９で、現在の体重率ＷＲが第６閾値（この実施例では、０．９８）以上であるかどうかを判断する。つまり、開発者等が意図する振り上げ動作が行われたかどうかを判断する。
【０２５９】
ステップＳ１１９で“ＮＯ”であれば、つまり現在の体重率ＷＲが第６閾値未満であれば、振り上げ動作でないと判断して、そのままステップＳ１３７に進む。一方、ステップＳ１１９で“ＹＥＳ”であれば、つまり現在の体重率ＷＲが第６閾値以上であれば、振り上げ動作であると判断して、ステップＳ１２１で、振り上げ判定フラグ４０４ｋをオンし、ステップＳ１２３で、振り上げ加速フラグ４０４ｎをオンし、さらに、ステップＳ１２５で、振り下ろし判定フラグ４０４ｍをオフして、ステップＳ１３７に進む。
【０２６０】
また、ステップＳ１１３で“ＹＥＳ”であれば、つまり現在の体重率ＷＲが前回の体重率ＷＲよりも小さければ、体重率ＷＲが下降していると判断して、ステップＳ１２７で体重率下降フラグ４０４ｊをオンし、ステップＳ１２９で、現在の体重率ＷＲが第７閾値（この実施例では、０．９８５）未満であるかどうかを判断する。つまり、ＣＰＵ４０は、振り下ろし動作であるかどうかを判断する。ステップＳ１２９で“ＮＯ”であれば、つまり現在の体重率ＷＲが第７閾値以上であれば、振り下ろし動作ではないと判断して、そのままステップＳ１３７に進む。一方、ステップＳ１２９で“ＹＥＳ”であれば、つまり現在の体重率ＷＲが第７閾値未満であれば、振り下ろし動作であると判断して、ステップＳ１３１で、振り下ろし判定フラグ４０４ｍをオンし、ステップＳ１３３で、振り下ろし加速フラグ４０４ｐをオンし、さらに、ステップＳ１３５で、振り上げ判定フラグ４０４ｋをオフして、ステップＳ１３７に進む。
【０２６１】
図２８に示すように、ステップＳ１３７では、周波数のインデックス番号ｎ＝２で振幅Ａが最大であり、かつインデックス番号ｎ＝３の振幅Ａが第８閾値（ここでは、０．０００１）以上である、または、周波数のインデックス番号ｎ＝３以上で振幅Ａが最大であるかどうかを判断する。ステップＳ１３７で“ＹＥＳ”であれば、つまり、周波数のインデックス番号ｎ＝２で振幅Ａが最大であり、かつインデックス番号ｎ＝３の振幅Ａが第８閾値以上である場合、または、インデックス番号ｎ＝３以上で振幅Ａが最大である場合には、小羽ばたき動作であると判定して、ステップＳ１３９で、小羽ばたきフラグ４０４ｒをオンし、ステップＳ１４１で、大羽ばたきフラグ４０４ｑをオフして、全体処理にリターンする。
【０２６２】
一方、ステップＳ１３７で“ＮＯ”であれば、つまり周波数のインデックス番号ｎ＝２で振幅Ａが最大でない場合、または、インデックス番号ｎ＝３の振幅Ａが第８閾値未満である場合、或いは、周波数のインデックス番号ｎ＝３以上で振幅Ａが最大でない場合には、ステップＳ１４３で、周波数のインデックス番号ｎ＝１−１５の振幅Ａがすべて第８閾値未満かどうかを判断する。
【０２６３】
ステップＳ１４３で“ＮＯ”であれば、つまり周波数のインデックス番号ｎ＝１−１５の振幅Ａのうち、第８閾値以上のものが有れば、大羽ばたき動作であると判断して、ステップＳ１４５で、大羽ばたきフラグ４０４ｑをオンし、ステップＳ１４７で、小羽ばたきフラグ４０４ｒをオフして、全体処理にリターンする。
【０２６４】
一方、ステップＳ１４３で“ＹＥＳ”であれば、つまり周波数のインデックス番号ｎ＝１−１５のすべての振幅Ａが第８閾値未満であれば、羽ばたき動作を行っていないと判断して、ステップＳ１４９で、大羽ばたきフラグ４０４ｑおよび小羽ばたきフラグ４０４ｒをオフして、全体処理にリターンする。
【０２６５】
図２９−図３１は、図２４のステップＳ５７に示した同期処理のフロー図である。図２９に示すように、ＣＰＵ４０は、同期処理を開始すると、ステップＳ１６１で、振り下ろし判定フラグ４０４ｍがオンであるかどうかを判断する。詳細な説明は省略するが、同期処理では、プレイヤオブジェクト２０２は下降中ではなく、プレイヤによって羽ばたき動作が行われているため、振り上げ判定フラグ４０４ｋまたは振り下ろし判定フラグ４０４ｍは必ずオンである。
【０２６６】
ステップＳ１６１で“ＮＯ”であれば、つまり振り下り判定フラグ４０４ｍがオフであり、振り上げ判定フラグ４０４ｋがオンであれば、図３０に示すステップＳ１８１に進む。一方、ステップＳ１６１で“ＹＥＳ”であれば、つまり振り下ろし判定フラグ４０４ｍがオンであり、振り上げ判定フラグ４０４ｋがオフであれば、ステップＳ１６３で、振り下ろし加速フラグ４０４ｐがオンであるかどうかを判断する。つまり、ＣＰＵ４０は、プレイヤの振り下ろし動作の開始に応じてアニメーションフレームを加速させたかどうかを判断する。
【０２６７】
ステップＳ１６３で“ＮＯ”であれば、つまり振り下ろし加速フラグ４０４ｐがオフであれば、現在の羽ばたき区間において、振り下ろし動作の開始に応じて既にアニメーションフレームを加速したと判断して、ステップＳ１６５で、フレーム加速度ＦｒａｍｅＡｃｃに０を設定して、図３１に示すステップＳ１９３に進む。一方、ステップＳ１６３で“ＹＥＳ”であれば、つまり振り下ろし加速フラグ４０４ｐがオンであれば、現在の羽ばたき区間において、振り下ろし動作の開始に応じて未だアニメーションフレームを加速していないと判断して、ステップＳ１６７で、現在のアニメーションフレームが１５以上３０未満であるかどうかを判断する。つまり、ＣＰＵ４０は、アニメーションフレームが振り下ろし加速度発生可能区間内であるかどうかを判断する。
【０２６８】
ステップＳ１６７で“ＹＥＳ”であれば、つまり現在のアニメーションフレームが１５以上３０未満であれば、アニメーションフレームが振り下ろし加速度発生可能区間内であると判断して、ステップＳ１６９で、フレーム加速度ＦｒａｍｅＡｃｃに、アニメーションフレームの最大フレーム数ＡｎｉｍＦｒａｍｅＭａｘを振り下ろし判定間隔ＣｙｃｌｅＳｗｉｎｇで割った値を設定する。つまり、後でフレーム速度ＦｒａｍｅＶｅｌ＿ｎｅｗを算出する際に、アニメーションフレームが加速される。次のステップＳ１７１では、振り下ろし加速フラグ４０４ｐをオフして、ステップＳ１９３に進む。
【０２６９】
一方、ステップＳ１６７で“ＮＯ”であれば、つまり現在のアニメーションフレームが１５以上３０未満でなければ、アニメーションフレームが振り下ろし加速度発生可能区間内でないと判断して、ステップＳ１７３で、フレーム加速度ＦｒａｍｅＡｃｃに０を設定し、ステップＳ１７５で、数１２に従って、現在のフレーム速度ＦｒａｍｅＶｅｌ＿ｏｌｄに、アニメーションフレームの最大フレーム数ＡｎｉｍＦｒａｍｅＭａｘを１．７倍して振り下ろし判定間隔ＣｙｃｌｅＳｗｉｎｇで割った値を設定する。つまり、ＣＰＵ４０は、アニメーションフレームを、フレーム加速度発生可能区間に早く近づけるのである。
【０２７０】
続いて、ステップＳ１７７では、現在のフレーム速度ＦｒａｍｅＶｅｌ＿ｏｌｄが６よりも大きいかどうかを判断する。ステップＳ１７７で“ＮＯ”であれば、つまり現在のフレーム速度ＦｒａｍｅＶｅｌ＿ｏｌｄが６以下であれば、そのままステップＳ１９３に進む。一方、ステップＳ１７７で“ＹＥＳ”であれば、つまり現フレーム速度ＦｒａｍｅＶｅｌ＿ｏｌｄが６よりも大きければ、ステップＳ１７９で、現在のフレーム速度ＦｒａｍｅＶｅｌ＿ｏｌｄに６を設定して、ステップＳ１８１に進む。つまり、現在のフレーム速度ＦｒａｍｅＶｅｌ＿ｏｌｄが制限される。
【０２７１】
図３０に示すように、ステップＳ１８１では、振り上げ加速フラグ４０４ｎがオンであるかどうかを判断する。ステップＳ１８１で“ＮＯ”であれば、つまり振り上げ加速フラグ４０４ｎがオフであれば、現在の羽ばたき区間において、振り上げ動作の開始に応じて既にアニメーションフレームを加速したと判断して、ステップＳ１９１で、フレーム加速度ＦｒａｍｅＡｃｃに０を設定して、ステップＳ１９３に進む。一方、ステップＳ１８１で“ＹＥＳ”であれば、つまり振り上げ加速フラグ４０４ｎがオンであれば、現在の羽ばたき区間において、振り上げ動作の開始に応じて未だアニメーションフレームを加速していないと判断して、ステップＳ１８３で、現在のアニメーションフレームが３０以上６０未満であるかどうかを判断する。つまり、ＣＰＵ４０は、アニメーションフレームが振り上げ加速度発生可能区間内であるかどうかを判断するのである。
【０２７２】
ステップＳ１８３で“ＮＯ”であれば、つまり現在のアニメーションフレームが３０以上６０未満でなければ、アニメーションフレームが振り上げ加速度発生可能区間内でないと判断して、ステップＳ１９１に進む。一方、ステップＳ１８３で“ＹＥＳ”であれば、つまり現在のアニメーションフレームが３０以上６０未満であれば、アニメーションフレームが振り上げ加速度発生可能区間内であると判断して、ステップＳ１８５で、現在のフレーム速度ＦｒａｍｅＶｅｌ＿ｏｌｄが２未満であるかどうかを判断する。
【０２７３】
ステップＳ１８５で“ＮＯ”であれば、つまり現在のフレーム速度ＦｒａｍｅＶｅｌ＿ｏｌｄが２以上であれば、ステップＳ１９１に進む。一方、ステップＳ１８７で“ＹＥＳ”であれば、つまり現在のフレーム速度ＦｒａｍｅＶｅｌ＿ｏｌｄが２未満であれば、ステップＳ１８７で、フレーム加速度ＦｒａｍｅＡｃｃに２を設定し、ステップＳ１８９で、振り上げ加速フラグ４０４ｎをオフして、ステップＳ１９３に進む。
【０２７４】
図３１に示すステップＳ１９３では、フレーム加速度ＦｒａｍｅＡｃｃが０でないかどうかを判断する。ステップＳ１９３で“ＮＯ”であれば、つまりフレーム加速度ＦｒａｍｅＡｃｃが０であれば、そのままステップＳ１９７に進む。一方、ステップＳ１９３で“ＹＥＳ”であれば、つまりフレーム加速度ＦｒａｍｅＡｃｃが０でなければ、ステップＳ１９５で、現在のフレーム速度ＦｒａｍｅＶｅｌ＿ｏｌｄに０を設定して、ステップＳ１９７に進む。
【０２７５】
ステップＳ１９７では、積分シミュレーションにより、次のフレーム速度ＦｒａｍｅＶｅｌ＿ｎｅｗを算出する。続いて、ステップＳ１９９では、次のアニメーションフレームＦｒａｍｅ＿ｎｅｗを決定する。つまり、ＣＰＵ４０は、数１０に従って次のフレーム速度ＦｒａｍｅＶｅｌ＿ｎｅｗを算出し、数１１に従って、次のアニメーションフレームＦｒａｍｅ＿ｎｅｗを算出する。そして、ステップＳ２０１で、決定されたアニメーションフレームＦｒａｍｅ＿ｎｅｗのアニメーションを設定して、図２２−図２５に示した全体処理にリターンする。
【０２７６】
この実施例によれば、プレイヤの羽ばたき動作を体重率の変動の周期に基づいて判定し、これをプレイヤオブジェクトのアニメーションに反映させるとともに、体重率の大きさに基づいてプレイヤオブジェクトの移動量を制御するので、単なる荷重の変化に応じてゲーム処理を実行する場合に比べて多彩な処理を実行することができる。
【０２７７】
また、この実施例によれば、振り下ろし動作および振り上げ動作に応じて、アニメーションフレームの更新速度を変化させるので、アニメーションフレームの遅延を解消して、プレイヤの羽ばたき動作とアニメーションとを円滑に同期させることができる。このため、プレイヤは仮想ゲームへの没入感を得ることができ、ゲームプレイを楽しむことができる。
【０２７８】
さらに、この実施例によれば、プレイヤの荷重値に基づく体重率が所定の閾値以上の場合に、当該体重率が局所的に軽減（減少）して増加したことを検出すると、大羽ばたき動作における振り上げ動作が開始されたと判定し、振り上げ動作に応じてプレイヤオブジェクトの移動速度を変化させたり、振り下ろし動作のみならず振り上げ動作に応じてアニメーションフレームの更新速度を変化させたりするので、開発者等の意図する動作をさせたり、そのような動作を検出したことにより処理を実行したりすることができる。つまり、複雑な動作を検出して、多彩な処理を実行することができる。
【０２７９】
なお、この実施例では、現在の荷重値を体重値（基準値）で割った体重率を用いるようにしたが、荷重値をそのまま用いるようにしてもよい。かかる場合には、体重差によるゲームの有利不利を無くすために、体重別（体重のランク別）の閾値を設けるようにすればよい。
【０２８０】
また、この実施例では、体重率の時間変化を離散フーリエ変換して得られた周波数スペクトルに基づいて、プレイヤによる羽ばたき動作の有無および羽ばたき動作の種類を判別するようにしたが、高速フーリエ変換するようにしてもよい。
【０２８１】
さらに、この実施例では、羽ばたき動作のような反復動作において、図１３に示したような体重率の時間変化に基づいて、プレイヤの振り上げ動作を判定するようにしたが、これに限定される必要はない。たとえば、図１３に示した波形を体重率の基準値で上下反転させた波形が得られるときには、その上下反転させた波形に基づいて所定の動作を判定することもできる。かかる場合には、体重率の値が一定値（たとえば、１．０２）以下であり、体重率が増加した後に減少すると、所定の動作の開始であると判定する。
【符号の説明】
【０２８２】
１０  …ゲームシステム
１２  …ゲーム装置
１８  …光ディスク
２２  …コントローラ
２４  …受信ユニット
３４  …モニタ
３４ａ  …スピーカ
３６  …荷重コントローラ
３６ｂ  …荷重センサ（ロードセル）
４０  …ＣＰＵ
４２  …システムＬＳＩ
４２ａ  …入出力プロセッサ
４２ｂ  …ＧＰＵ
４２ｃ  …ＤＳＰ
４２ｄ  …ＶＲＡＭ
４２ｅ  …内部メインメモリ
４４  …フラッシュメモリ
４６  …外部メインメモリ
４８  …ＲＯＭ／ＲＴＣ
５０  …無線通信モジュール
５２  …無線コントローラモジュール
５４  …ディスクドライブ
５６  …ＡＶ  ＩＣ
５８  …ＡＶコネクタ
６０  …拡張コネクタ
６２  …メモリカード用コネクタ
７０  …プロセッサ
７４  …加速度センサ
８０  …画像情報演算部
８０ｃ  …撮像素子
８０ｄ  …画像処理回路
１００  …マイコン
１０２  …ＡＤコンバータ
１０４  …ＤＣ−ＤＣコンバータ
１０６  …無線モジュール
１０８  …増幅器
【図１】
0005478172.tif 000003
【図２】
0005478172.tif 000004
【図３】
0005478172.tif 000005
【図４】
0005478172.tif 000006
【図５】
0005478172.tif 000007
【図６】
0005478172.tif 000008
【図７】
0005478172.tif 000009
【図８】
0005478172.tif 000010
【図９】
0005478172.tif 000011
【図１０】
0005478172.tif 000012
【図１１】
0005478172.tif 000013
【図１２】
0005478172.tif 000014
【図１３】
0005478172.tif 000015
【図１４】
0005478172.tif 000016
【図１５】
0005478172.tif 000017
【図１６】
0005478172.tif 000018
【図１７】
0005478172.tif 000019
【図１８】
0005478172.tif 000020
【図１９】
0005478172.tif 000021
【図２０】
0005478172.tif 000022
【図２１】
0005478172.tif 000023
【図２２】
0005478172.tif 000024
【図２３】
0005478172.tif 000025
【図２４】
0005478172.tif 000026
【図２５】
0005478172.tif 000027
【図２６】
0005478172.tif 000028
【図２７】
0005478172.tif 000029
【図２８】
0005478172.tif 000030
【図２９】
0005478172.tif 000031
【図３０】
0005478172.tif 000032
【図３１】
0005478172.tif 000033