[ゲームシステムの全体構成]
図1を参照して、本発明の一実施形態に係るゲーム装置を含むゲームシステム1について説明する。図1は、ゲームシステム1の外観図である。以下、据置型のゲーム装置を一例にして、本実施形態のゲーム装置及びゲームプログラムについて説明する。図1において、ゲームシステム1は、テレビジョン受像器(以下、単に「テレビ」と記載する)2、ゲーム装置3、光ディスク4、入力装置8、及びマーカ部6を含む。本システムは、入力装置8を用いたゲーム操作に基づいてゲーム装置3でゲーム処理を実行するものである。
ゲーム装置3には、当該ゲーム装置3に対して交換可能に用いられる情報記憶媒体の一例である光ディスク4が脱着可能に挿入される。光ディスク4には、ゲーム装置3において実行されるためのゲームプログラムが記憶されている。ゲーム装置3の前面には光ディスク4の挿入口が設けられている。ゲーム装置3は、挿入口に挿入された光ディスク4に記憶されているゲームプログラムを読み出して実行することによってゲーム処理を実行する。
ゲーム装置3には、表示装置の一例であるテレビ2が接続コードを介して接続される。テレビ2は、ゲーム装置3において実行されるゲーム処理の結果得られるゲーム画像を表示する。また、テレビ2の画面の周辺(図1では画面の上側)には、マーカ部6が設置される。マーカ部6は、その両端に2つのマーカ6R及び6Lを備えている。マーカ6R(マーカ6Lも同様)は、具体的には1以上の赤外LEDであり、テレビ2の前方に向かって赤外光を出力する。マーカ部6はゲーム装置3に接続されており、ゲーム装置3はマーカ部6が備える各赤外LEDの点灯を制御することが可能である。
入力装置8は、自機に対して行われた操作の内容を示す操作データをゲーム装置3に与えるものである。本実施形態では、入力装置8はコントローラ5とジャイロセンサユニット7とを含む。詳細は後述するが、入力装置8は、コントローラ5に対してジャイロセンサユニット7が着脱可能に接続されている構成である。コントローラ5とゲーム装置3とは無線通信によって接続される。本実施形態では、コントローラ5とゲーム装置3との間の無線通信には例えばBluetooth(ブルートゥース)(登録商標)の技術が用いられる。なお、他の実施形態においてはコントローラ5とゲーム装置3とは有線で接続されてもよい。
[ゲーム装置3の内部構成]
次に、図2を参照して、ゲーム装置3の内部構成について説明する。図2は、ゲーム装置3の構成を示すブロック図である。ゲーム装置3は、CPU10、システムLSI11、外部メインメモリ12、ROM/RTC13、ディスクドライブ14、及びAV−IC15等を有する。
CPU10は、光ディスク4に記憶されたゲームプログラムを実行することによってゲーム処理を実行するものであり、ゲームプロセッサとして機能する。CPU10は、システムLSI11に接続される。システムLSI11には、CPU10の他、外部メインメモリ12、ROM/RTC13、ディスクドライブ14及びAV−IC15が接続される。システムLSI11は、それに接続される各構成要素間のデータ転送の制御、表示すべき画像の生成、外部装置からのデータの取得等の処理を行う。システムLSIの内部構成について後述する。揮発性の外部メインメモリ12は、光ディスク4から読み出されたゲームプログラムや、フラッシュメモリ17から読み出されたゲームプログラム等のプログラムを記憶したり、各種データを記憶したりするものであり、CPU10のワーク領域やバッファ領域として用いられる。ROM/RTC13は、ゲーム装置3の起動用のプログラムが組み込まれるROM(いわゆるブートROM)と、時間をカウントするクロック回路(RTC:Real Time Clock)とを有する。ディスクドライブ14は、光ディスク4からプログラムデータやテクスチャデータ等を読み出し、後述する内部メインメモリ11e又は外部メインメモリ12に読み出したデータを書き込む。
また、システムLSI11には、入出力プロセッサ(I/Oプロセッサ)11a、GPU(Graphics Processor Unit)11b、DSP(Digital Signal Processor)11c、VRAM11d、及び内部メインメモリ11eが設けられる。図示は省略するが、これらの構成要素11a〜11eは内部バスによって互いに接続される。
GPU11bは、描画手段の一部を形成し、CPU10からのグラフィクスコマンド(作画命令)に従って画像を生成する。VRAM11dは、GPU11bがグラフィクスコマンドを実行するために必要なデータ(ポリゴンデータやテクスチャデータ等のデータ)を記憶する。画像が生成される際には、GPU11bは、VRAM11dに記憶されたデータを用いて画像データを作成する。
DSP11cは、オーディオプロセッサとして機能し、内部メインメモリ11eや外部メインメモリ12に記憶されるサウンドデータや音波形(音色)データを用いて、音声データを生成する。
上述のように生成された画像データ及び音声データは、AV−IC15によって読み出される。AV−IC15は、読み出した画像データをAVコネクタ16を介してテレビ2に出力するとともに、読み出した音声データを、テレビ2に内蔵されるスピーカ2aに出力する。これによって、画像がテレビ2に表示されるとともに音がスピーカ2aから出力される。
入出力プロセッサ11aは、それに接続される構成要素との間でデータの送受信を実行したり、外部装置からのデータのダウンロードを実行したりする。入出力プロセッサ11aは、フラッシュメモリ17、無線通信モジュール18、無線コントローラモジュール19、拡張コネクタ20、及びメモリカード用コネクタ21に接続される。無線通信モジュール18にはアンテナ22が接続され、無線コントローラモジュール19にはアンテナ23が接続される。
入出力プロセッサ11aは、無線通信モジュール18及びアンテナ22を介してネットワークに接続し、ネットワークに接続される他のゲーム装置や各種サーバと通信することができる。入出力プロセッサ11aは、定期的にフラッシュメモリ17にアクセスし、ネットワークへ送信する必要があるデータの有無を検出し、当該データが有る場合には、無線通信モジュール18及びアンテナ22を介してネットワークに送信する。また、入出力プロセッサ11aは、他のゲーム装置から送信されてくるデータやダウンロードサーバからダウンロードしたデータを、ネットワーク、アンテナ22及び無線通信モジュール18を介して受信し、受信したデータをフラッシュメモリ17に記憶する。CPU10はゲームプログラムを実行することにより、フラッシュメモリ17に記憶されたデータを読み出してゲームプログラムで利用する。フラッシュメモリ17には、ゲーム装置3と他のゲーム装置や各種サーバとの間で送受信されるデータの他、ゲーム装置3を利用してプレイしたゲームのセーブデータ(ゲームの結果データ又は途中データ)が記憶されてもよい。
また、入出力プロセッサ11aは、コントローラ5から送信される操作データをアンテナ23及び無線コントローラモジュール19を介して受信し、内部メインメモリ11e又は外部メインメモリ12のバッファ領域に記憶(一時記憶)する。
さらに、入出力プロセッサ11aには、拡張コネクタ20及びメモリカード用コネクタ21が接続される。拡張コネクタ20は、USBやSCSIのようなインターフェースのためのコネクタであり、外部記憶媒体のようなメディアを接続したり、他のコントローラのような周辺機器を接続したり、有線の通信用コネクタを接続することによって無線通信モジュール18に替えてネットワークとの通信を行ったりすることができる。メモリカード用コネクタ21は、メモリカードのような外部記憶媒体を接続するためのコネクタである。例えば、入出力プロセッサ11aは、拡張コネクタ20やメモリカード用コネクタ21を介して外部記憶媒体にアクセスし、外部記憶媒体にデータを保存したり、外部記憶媒体からデータを読み出したりすることができる。
ゲーム装置3には、電源ボタン24、リセットボタン25、及びイジェクトボタン26が設けられる。電源ボタン24及びリセットボタン25は、システムLSI11に接続される。電源ボタン24がオンされると、ゲーム装置3の各構成要素に対して、図示しないACアダプタを経て電源が供給される。リセットボタン25が押されると、システムLSI11は、ゲーム装置3の起動プログラムを再起動する。イジェクトボタン26は、ディスクドライブ14に接続される。イジェクトボタン26が押されると、ディスクドライブ14から光ディスク4が排出される。
[入力装置8の構成]
次に、図3〜図6を参照して、入力装置8について説明する。図3は、入力装置8の外観構成を示す斜視図である。図4は、コントローラ5の外観構成を示す斜視図である。図3は、コントローラ5の上側後方から見た斜視図であり、図4は、コントローラ5を下側前方から見た斜視図である。
図3及び図4において、コントローラ5は、例えばプラスチック成型によって形成されたハウジング31を有している。ハウジング31は、その前後方向(図3に示すZ軸方向)を長手方向とした略直方体形状を有しており、全体として大人や子供の片手で把持可能な大きさである。プレイヤは、コントローラ5に設けられたボタンを押下すること、及び、コントローラ5自体を動かしてその位置や姿勢を変えることによってゲーム操作を行うことができる。
ハウジング31には、複数の操作ボタンが設けられる。図3に示すように、ハウジング31の上面には、十字ボタン32a、1番ボタン32b、2番ボタン32c、Aボタン32d、マイナスボタン32e、ホームボタン32f、プラスボタン32g、及び電源ボタン32hが設けられる。本明細書では、これらのボタン32a〜32hが設けられるハウジング31の上面を「ボタン面」と呼ぶことがある。一方、図4に示すように、ハウジング31の下面には凹部が形成されており、当該凹部の後面側傾斜面にはBボタン32iが設けられる。これらの各操作ボタン32a〜32iには、ゲーム装置3が実行するゲームプログラムに応じた機能が適宜割り当てられる。また、電源ボタン32hは遠隔からゲーム装置3本体の電源をオン/オフするためのものである。ホームボタン32f及び電源ボタン32hは、その上面がハウジング31の上面に埋没している。これによって、プレイヤがホームボタン32f又は電源ボタン32hを誤って押下することを防止することができる。
ハウジング31の後面にはコネクタ33が設けられている。コネクタ33は、コントローラ5に他の機器(例えば、ジャイロセンサユニット7や他のコントローラ)を接続するために利用される。また、ハウジング31の後面におけるコネクタ33の両側には、上記他の機器が容易に離脱することを防止するために係止穴33aが設けられている。
ハウジング31上面の後方には複数(図3では4つ)のLED34a〜34dが設けられる。ここで、コントローラ5には、他のメインコントローラと区別するためにコントローラ種別(番号)が付与される。各LED34a〜34dは、コントローラ5に現在設定されている上記コントローラ種別をプレイヤに通知したり、コントローラ5の電池残量をプレイヤに通知したりする等の目的で用いられる。具体的には、コントローラ5を用いてゲーム操作が行われる際、上記コントローラ種別に応じて複数のLED34a〜34dのいずれか1つが点灯する。
また、コントローラ5は撮像情報演算部35(図6)を有しており、図4に示すように、ハウジング31前面には撮像情報演算部35の光入射面35aが設けられる。光入射面35aは、マーカ6R及び6Lからの赤外光を少なくとも透過する材質で構成される。
ハウジング31上面における1番ボタン32bとホームボタン32fとの間には、コントローラ5に内蔵されるスピーカ49(図5)からの音を外部に放出するための音抜き孔31aが形成されている。
次に、図5及び図6を参照して、コントローラ5の内部構造について説明する。図5及び図6は、コントローラ5の内部構造を示す図である。なお、図5は、コントローラ5の上筐体(ハウジング31の一部)を外した状態を示す斜視図である。図6は、コントローラ5の下筐体(ハウジング31の一部)を外した状態を示す斜視図である。図6に示す斜視図は、図5に示す基板30を裏面から見た斜視図となっている。
図5において、ハウジング31の内部には基板30が固設されており、当該基板30の上主面上に各操作ボタン32a〜32h、各LED34a〜34d、加速度センサ37、アンテナ45、及びスピーカ49等が設けられる。これらは、基板30等に形成された配線(図示せず)によってマイクロコンピュータ(Micro Computer:マイコン)42(図6参照)に接続される。本実施形態では、加速度センサ37は、X軸方向に関してコントローラ5の中心からずれた位置に配置されている。これによって、コントローラ5をZ軸回りに回転させたときのコントローラ5の動きが算出しやすくなる。また、加速度センサ37は、長手方向(Z軸方向)に関してコントローラ5の中心よりも前方に配置されている。また、無線モジュール44(図6)及びアンテナ45によって、コントローラ5がワイヤレスコントローラとして機能する。
一方、図6において、基板30の下主面上の前端縁に撮像情報演算部35が設けられる。撮像情報演算部35は、コントローラ5の前方から順に赤外線フィルタ38、レンズ39、撮像素子40、及び画像処理回路41を備えている。これらの部材38〜41はそれぞれ基板30の下主面に取り付けられる。
さらに、基板30の下主面上には、上記マイコン42及びバイブレータ48が設けられている。バイブレータ48は、例えば振動モータやソレノイドであり、基板30等に形成された配線によってマイコン42と接続される。マイコン42の指示によりバイブレータ48が作動することによってコントローラ5に振動が発生する。これによって、コントローラ5を把持しているプレイヤの手にその振動が伝達される、いわゆる振動対応ゲームを実現することができる。本実施形態では、バイブレータ48は、ハウジング31のやや前方寄りに配置される。つまり、バイブレータ48がコントローラ5の中心よりも端側に配置することによって、バイブレータ48の振動によりコントローラ5全体を大きく振動させることができる。また、コネクタ33は、基板30の下主面上の後端縁に取り付けられる。なお、図5及び図6に示す他、コントローラ5は、マイコン42の基本クロックを生成する水晶振動子、スピーカ49に音声信号を出力するアンプ等を備えている。
また、ジャイロセンサユニット7は、3軸回りの角速度を検知するジャイロセンサ(図7に示すジャイロセンサ55及び56)を有する。ジャイロセンサユニット7は、コントローラ5のコネクタ33に着脱可能に装着される。ジャイロセンサユニット7の前端(図3に示すZ軸正方向側の端部)には、コネクタ33に接続可能なプラグ(図7に示すプラグ53)が設けられる。さらに、プラグ53の両側にはフック(図示せず)が設けられる。ジャイロセンサユニット7がコントローラ5に対して装着される状態では、プラグ53がコネクタ33に接続されるとともに、上記フックがコントローラ5の係止穴33aに係止する。これによって、コントローラ5とジャイロセンサユニット7とがしっかりと固定される。また、ジャイロセンサユニット7は側面(図3に示すX軸方向の面)にボタン51を有している。ボタン51は、それを押下すれば上記フックの係止穴33aに対する係止状態を解除することができるように構成されている。したがって、ボタン51を押下しながらプラグ53をコネクタ33から抜くことによって、ジャイロセンサユニット7をコントローラ5から離脱することができる。
また、ジャイロセンサユニット7の後端には、上記コネクタ33と同形状のコネクタが設けられる。したがって、コントローラ5(のコネクタ33)に対して装着可能な他の機器は、ジャイロセンサユニット7のコネクタに対しても装着可能である。なお、図3においては、当該コネクタに対してカバー52が着脱可能に装着されている。
なお、図3〜図6に示したコントローラ5及びジャイロセンサユニット7の形状や、各操作ボタンの形状、加速度センサやバイブレータの数及び設置位置等は単なる一例に過ぎず、他の形状、数、及び設置位置であっても、本発明を実現することができる。また、本実施形態では、撮像手段による撮像方向はZ軸正方向であるが、撮像方向はいずれの方向であってもよい。すなわち、コントローラ5における撮像情報演算部35の位置(撮像情報演算部35の光入射面35a)は、ハウジング31の前面でなくてもよく、ハウジング31の外部から光を取り入れることができれば他の面に設けられてもかまわない。
図7は、入力装置8(コントローラ5及びジャイロセンサユニット7)の構成を示すブロック図である。コントローラ5は、操作部32(各操作ボタン32a〜32i)、コネクタ33、撮像情報演算部35、通信部36、及び加速度センサ37を備えている。コントローラ5は、自機に対して行われた操作内容を示すデータを操作データとしてゲーム装置3へ送信するものである。
操作部32は、上述した各操作ボタン32a〜32iを含み、各操作ボタン32a〜32iに対する入力状態(各操作ボタン32a〜32iが押下されたか否か)を示す操作ボタンデータを通信部36のマイコン42へ出力する。
撮像情報演算部35は、撮像手段が撮像した画像データを解析してその中で輝度が高い領域を判別してその領域の重心位置やサイズなどを算出するためのシステムである。撮像情報演算部35は、例えば最大200フレーム/秒程度のサンプリング周期を有するので、比較的高速なコントローラ5の動きでも追跡して解析することができる。
撮像情報演算部35は、赤外線フィルタ38、レンズ39、撮像素子40、及び画像処理回路41を含んでいる。赤外線フィルタ38は、コントローラ5の前方から入射する光から赤外線のみを通過させる。レンズ39は、赤外線フィルタ38を透過した赤外線を集光して撮像素子40へ入射させる。撮像素子40は、例えばCMOSセンサやあるいはCCDセンサのような固体撮像素子であり、レンズ39が集光した赤外線を受光して画像信号を出力する。ここで、テレビ2の表示画面近傍に配置されるマーカ部6のマーカ6R及び6Lは、テレビ2の前方に向かって赤外光を出力する赤外LEDで構成される。したがって、赤外線フィルタ38を設けることによって、撮像素子40は、赤外線フィルタ38を通過した赤外線だけを受光して画像データを生成するので、マーカ6R及び6Lの画像をより正確に撮像することができる。以下では、撮像素子40によって撮像された画像を撮像画像と呼ぶ。撮像素子40によって生成された画像データは、画像処理回路41で処理される。画像処理回路41は、撮像画像内における撮像対象(マーカ6R及び6L)の位置を算出する。画像処理回路41は、算出された位置を示す座標を通信部36のマイコン42へ出力する。この座標のデータは、マイコン42によって操作データとしてゲーム装置3に送信される。以下では、上記座標を「マーカ座標」と呼ぶ。マーカ座標はコントローラ5自体の向き(傾斜角度)や位置に対応して変化するので、ゲーム装置3はこのマーカ座標を用いてコントローラ5の向きや位置を算出することができる。
なお、他の実施形態においては、コントローラ5は画像処理回路41を備えていない構成であってもよく、撮像画像自体がコントローラ5からゲーム装置3へ送信されてもよい。このとき、ゲーム装置3は、画像処理回路41と同様の機能を有する回路あるいはプログラムを有しており、上記マーカ座標を算出するようにしてもよい。
加速度センサ37は、コントローラ5の加速度(重力加速度を含む)を検出する、すなわち、コントローラ5に加わる力(重力を含む)を検出する。加速度センサ37は、当該加速度センサ37の検出部に加わっている加速度のうち、センシング軸方向に沿った直線方向の加速度(直線加速度)の値を検出する。例えば、2軸以上の多軸加速度センサの場合には、加速度センサの検出部に加わっている加速度として、各軸に沿った成分の加速度をそれぞれ検出する。例えば、3軸又は2軸の加速度センサは、アナログ・デバイセズ株式会社(Analog Devices, Inc.)又はSTマイクロエレクトロニクス社(STMicroelectronics N.V.)から入手可能である種類のものでもよい。なお、加速度センサ37は、例えば静電容量式の加速度センサであるとするが、他の方式の加速度センサを用いるようにしてもよい。
本実施形態では、加速度センサ37は、コントローラ5を基準とした上下方向(図3に示すY軸方向)、左右方向(図3に示すX軸方向)及び前後方向(図3に示すZ軸方向)の3軸方向に関してそれぞれ直線加速度を検出する。加速度センサ37は、各軸に沿った直線方向に関する加速度を検出するものであるため、加速度センサ37からの出力は3軸それぞれの直線加速度の値を表すものとなる。すなわち、検出された加速度は、入力装置8(コントローラ5)を基準に設定されるXYZ座標系(コントローラ座標系(物体座標系))における3次元のベクトル(ax,ay,az)として表される。以下では、加速度センサ37によって検出される3軸に関する各加速度値を各成分とするベクトルを加速度ベクトルと呼ぶ。
加速度センサ37が検出した加速度を示すデータ(加速度データ)は、通信部36へ出力される。なお、加速度センサ37が検出した加速度は、コントローラ5自体の向き(傾斜角度)や動きに対応して変化するので、ゲーム装置3は加速度データを用いてコントローラ5の向きや動きを算出することができる。本実施形態では、ゲーム装置3は、加速度データ及び後述する角速度データに基づいてコントローラ5の姿勢を判断する。
加速度センサ37が検出した加速度(加速度ベクトル)を示すデータ(加速度データ)は、通信部36へ出力される。本実施形態において、加速度センサ37は、コントローラ5の傾斜角度を判断するためのデータを出力するセンサとして用いられる。
なお、加速度センサ37から出力される加速度の信号に基づいて、ゲーム装置3のプロセッサ(例えばCPU10)又はコントローラ5のプロセッサ(例えばマイコン42)等のコンピュータが処理を行うことによって、コントローラ5に関するさらなる情報を推測又は算出(判定)することができることは、当業者であれば本明細書の説明から容易に理解できるであろう。例えば、加速度センサ37を搭載するコントローラ5が静止状態であることを前提としてコンピュータ側の処理が実行される場合(すなわち、加速度センサによって検出される加速度が重力加速度のみであるとして処理が実行される場合)、コントローラ5が現実に静止状態であれば、検出された加速度に基づいてコントローラ5の姿勢が重力方向に対して傾いているか否か又はどの程度傾いているかを知ることができる。具体的には、加速度センサ37の検出軸が鉛直下方向を向いている状態を基準としたとき、1G(重力加速度)がかかっているか否かによって、コントローラ5が基準に対して傾いているか否かを知ることができるし、その大きさによって基準に対してどの程度傾いているかも知ることができる。また、多軸の加速度センサ37の場合には、さらに各軸の加速度の信号に対して処理を施すことによって、重力方向に対してコントローラ5がどの程度傾いているかをより詳細に知ることができる。この場合において、プロセッサは、加速度センサ37からの出力に基づいてコントローラ5の傾斜角度を算出してもよいし、当該傾斜角度を算出せずに、コントローラ5の傾斜方向を算出するようにしてもよい。このように、加速度センサ37をプロセッサと組み合わせて用いることによって、コントローラ5の傾斜角度又は姿勢を判定することができる。
一方、コントローラ5が動的な状態(コントローラ5が動かされている状態)であることを前提とする場合には、加速度センサ37は重力加速度に加えてコントローラ5の動きに応じた加速度を検出するので、検出された加速度から重力加速度の成分を所定の処理により除去することによってコントローラ5の動き方向を知ることができる。また、コントローラ5が動的な状態であることを前提とする場合であっても、検出された加速度から、加速度センサの動きに応じた加速度の成分を所定の処理により除去することによって、重力方向に対するコントローラ5の傾きを知ることが可能である。なお、他の実施例では、加速度センサ37は、内蔵の加速度検出手段で検出された加速度信号をマイコン42に出力する前に当該加速度信号に対して所定の処理を行うための、組込み式の処理装置又は他の種類の専用の処理装置を備えていてもよい。組込み式又は専用の処理装置は、例えば、加速度センサ37が静的な加速度(例えば、重力加速度)を検出するために用いられる場合、加速度信号を傾斜角(あるいは、他の好ましいパラメータ)に変換するものであってもよい。
通信部36は、マイコン42、メモリ43、無線モジュール44、及びアンテナ45を含んでいる。マイコン42は、処理を行う際にメモリ43を記憶領域として用いながら、マイコン42が取得したデータをゲーム装置3へ無線送信する無線モジュール44を制御する。また、マイコン42はコネクタ33に接続されている。ジャイロセンサユニット7から送信されてくるデータは、コネクタ33を介してマイコン42に入力される。以下、ジャイロセンサユニット7の構成について説明する。
ジャイロセンサユニット7は、プラグ53、マイコン54、2軸ジャイロセンサ55、及び1軸ジャイロセンサ56を備えている。上述のように、ジャイロセンサユニット7は、3軸(本実施形態では、XYZ軸)周りの角速度を検出し、検出した角速度を示すデータ(角速度データ)をコントローラ5へ送信する。
2軸ジャイロセンサ55は、X軸周りの角速度及びY軸周りの(単位時間あたりの)角速度を検出する。また、1軸ジャイロセンサ56は、Z軸周りの(単位時間あたりの)角速度を検出する。なお、本明細書では、コントローラ5の撮像方向(Z軸正方向)を基準として、Z軸周り、X軸周り、Y軸周りの回転方向を、それぞれ、ロール方向、ピッチ方向、ヨー方向と呼ぶ。すなわち、2軸ジャイロセンサ55は、ピッチ方向(X軸周りの回転方向)及びヨー方向(Y軸周りの回転方向)の角速度を検出し、1軸ジャイロセンサ56は、ロール方向(Z軸周りの回転方向)の角速度を検出する。
なお、本実施形態では、3軸回りの角速度を検出するために、2軸ジャイロセンサ55と1軸ジャイロセンサ56とを用いる構成としたが、他の実施形態においては、3軸回りの角速度を検出することができればよく、用いるジャイロセンサの数及び組み合わせはどのようなものであってもよい。
また、本実施形態では、各ジャイロセンサ55及び56が角速度を検出する3つの軸は、加速度センサ37が加速度を検出する3つの軸(XYZ軸)と一致するように設定される。ただし、他の実施形態においては、各ジャイロセンサ55及び56が角速度を検出する3つの軸と、加速度センサ37が加速度を検出する3つの軸とは一致しなくてもよい。
ジャイロセンサ55及び56で検出された角速度を示すデータは、マイコン54に出力される。したがって、マイコン54には、XYZ軸の3軸回りの角度速度を示すデータが入力されることになる。マイコン54は、上記3軸回りの角速度を示すデータを角速度データとしてプラグ53を介してコントローラ5へ送信する。なお、マイコン54からコントローラ5への送信は所定の周期毎に逐次行われるが、ゲームの処理は1/60秒を単位として(1フレーム時間として)行われることが一般的であるので、この時間以下の周期で送信を行うことが好ましい。
コントローラ5の説明に戻り、操作部32、撮像情報演算部35、及び加速度センサ37からマイコン42へ出力されたデータ、ならびに、ジャイロセンサユニット7からマイコン42へ送信されてきたデータは、一時的にメモリ43に格納される。これらのデータは、上記操作データとしてゲーム装置3へ送信される。すなわち、マイコン42は、ゲーム装置3の無線コントローラモジュール19への送信タイミングが到来すると、メモリ43に格納されている操作データを無線モジュール44へ出力する。無線モジュール44は、例えばBluetooth(ブルートゥース)(登録商標)の技術を用いて、所定周波数の搬送波を操作データで変調し、その微弱電波信号をアンテナ45から放射する。つまり、操作データは、無線モジュール44で微弱電波信号に変調されてコントローラ5から送信される。微弱電波信号はゲーム装置3側の無線コントローラモジュール19で受信される。受信された微弱電波信号について復調や復号を行うことによって、ゲーム装置3は操作データを取得することができる。そして、ゲーム装置3のCPU10は、取得した操作データとゲームプログラムとに基づいて、ゲーム処理を行う。なお、通信部36から無線コントローラモジュール19への無線送信は所定の周期毎に逐次行われるが、ゲームの処理は1/60秒を単位として(1フレーム時間として)行われることが一般的であるので、この時間以下の周期で送信を行うことが好ましい。コントローラ5の通信部36は、例えば1/200秒に1回の割合で各操作データをゲーム装置3の無線コントローラモジュール19へ出力する。
上記コントローラ5を用いることによって、プレイヤは、各操作ボタンを押下する従来の一般的なゲーム操作に加えて、コントローラ5を任意の傾斜角度に傾ける操作を行うことができる。その他、上記コントローラ5によれば、プレイヤは、コントローラ5によって画面上の任意の位置を指示する操作、及び、コントローラ5自体を動かす操作を行うこともできる。
[ゲーム処理の概要]
次に、図8〜図15Bを参照して、本発明の一実施形態に係るゲーム処理の概要について説明する。本実施形態では、ボウリングゲームを行うこととする。図8は、入力装置8を用いてゲーム操作するときの状態を概説する図である。図9は、プレイヤが投球前の動作の姿勢で入力装置8を把持する様子を示した図である。図10は、プレイヤがバックスイングをしている様子を示した図である。図11は、プレイヤがフォワードスイングをしている様子を示した図である。図12は、プレイヤがボールを投球する瞬間の様子を示した図である。図13は、プレイヤがボールを投球した後の様子を示した図である。図8に示されるように、プレイヤPは、入力装置8を把持し、あたかもボウリングのボールを実際に投げるように、入力装置8を振る動作を行う。このようなプレイヤが入力装置8を振る動作に応じて、ゲーム装置3は、プレイヤキャラクタがボウリングのボールを投げる様子をテレビ2に表示する。
まず、プレイヤPは、ボウリングのアドレス(投球前の動作)のような姿勢で入力装置8を把持した状態(アドレス動作。図9)から、コントローラ5(入力装置8)のBボタン32iを押下し、バックスイング(図10)からフォワードスイング(図11)に移行する動作を行う。このプレイヤPの動作に応じて、テレビ2には、プレイヤキャラクタがアドレス動作からバックスイング動作を開始し、フォワードスイング動作に移行する様子が表示される。次に、プレイヤPがフォワードスイングに移行後、ボウリングのボールを実際に投げるようにして入力装置8を振る動作を行う(リリース動作。図12)。通常、人が実際にボウリングのボールを投げる場合、フォワードスイング中、ボールが最下点(レーンに最も近い位置)付近に達した時に、人はボールをリリースする。人はボールをリリースする際、ボールに力を加えるようにして投球する。本ゲームにおいてもプレイヤは、実際にボウリングのボールを投球する場合のように、フォワードスイング中、入力装置8が最下点付近に達した時に、ボールを投げるようにして入力装置8を振る動作を行う(図12)。このプレイヤPの投球動作に応じて、ゲーム装置3は、ボールが投球されたと判定(自動投球判定)し、テレビ2にプレイヤキャラクタがボールを投球した様子を表示する。その後、プレイヤPは、投球動作を終了する(フィニッシュ。図13)。このように、ボウリングの投球動作は、アドレス、バックスイング、フォワードスイング、リリース、及び、フィニッシュの動作に分けることができる。
ここで、投球されたボールの速度及び軌道は、プレイヤが投球動作中に入力装置8に加えた力や方向(すなわち、コントローラ5を振る速さや方向)に応じて定められる。また、投球判定後にコントローラ5に加わった力やその方向も、投球されたボールの速度及び軌道に影響する。
具体的には、ゲーム装置3は、2軸ジャイロセンサ55及び1軸ジャイロセンサ56で検出された角速度を用いて入力装置8の姿勢を検出することによって、バックスイングからフォワードスイングに移行したことを検出する。すなわち、ゲーム装置3は、2軸ジャイロセンサ55及び1軸ジャイロセンサ56から逐次出力される各軸周りの角速度を積分し、初期状態からの姿勢の変化量を積分結果から算出することによって、現在の入力装置8の姿勢を算出する。そして、算出された入力装置8の姿勢の変化に基づいて、ゲーム装置3は、プレイヤがバックスイングからフォワードスイングに移行したことを認識する。
ここで、入力装置8の姿勢とは、入力装置8が存在する空間の所定位置を基準としたxyz座標系における姿勢である。ここでは、図1に示されるように、xyz座標系は、入力装置8がマーカ部6の正面に位置することを前提とし、入力装置8の位置からマーカ部6を向く方向をz軸正方向とし、鉛直上向き(重力方向の逆方向)をy軸正方向とし、入力装置8の位置からマーカ部6を向いた場合の左方向をx軸正方向とした座標系であるとする。また、ここでは、入力装置8を基準としたX軸、Y軸、Z軸が、それぞれx軸、y軸、z軸の向きと一致する姿勢を基準姿勢と呼ぶことにする。入力装置8の姿勢は、基準姿勢からZ軸方向を基準としてロール方向(Z軸周り)、ピッチ方向(X軸周り)、ヨー方向(Y軸周り)にそれぞれ入力装置8を回転させた場合のxyz座標系における姿勢である。当該姿勢は、後述する回転行列Mによって表現される。
次に、ゲーム装置3は、フォワードスイング中、2軸ジャイロセンサ55で検出された角速度を用いて、ボールの自動投球判定を行う。具体的には、ゲーム装置3は、2軸ジャイロセンサ55で検出されたX軸周りの角速度及びY軸周りの角速度を各成分とする、角速度ベクトルの大きさ(この角速度ベクトルの大きさは、入力装置8の振りの速さに応じて変化する)が所定の閾値を超えた場合に、ボールが投球されたと判定する。より正確には、後述するように、上記角速度ベクトルの大きさが所定の閾値を超え、かつ極大となった場合に、ボールが投球されたと判定する。すなわち、ゲーム装置3は、プレイヤが入力装置8をX軸及びY軸周りに所定の速さ以上で振った場合、ボールが投球されたと判定する。
次に、ゲーム装置3は、上記自動投球判定がなされた時点を基準に定められる所定の期間に加速度センサ37で検出された加速度に基づいて、投球されたボールの速度を決定する。すなわち、ゲーム装置3は、自動投球判定前の所定の期間中に加速度センサ37で検出した加速度の大きさに応じて、ボールの速度を決定する。さらに、ゲーム装置3は、自動投球判定後の所定の期間中に加速度センサ37で検出した加速度の大きさに応じて、ボールの速度を変化させる。このように、自動投球判定がなされた後における加速度の値に応じて、ボールの速度を変化させることにより、プレイヤの振り動作をより正確にゲーム処理に反映させることができる。すなわち、上述した自動投球判定では、入力装置8の振りの速さが所定値以上である場合にボールの投球がなされたと判断されるため、プレイヤがより速く入力装置8を振る場合、プレイヤの意図するリリースのタイミング前のフォワードスイング中に、ボールの投球がされたと判断される場合がある。つまり、自動投球判定では、プレイヤの意図するリリースのタイミングを正確に知ることは困難であるため、リリースのタイミング前にボールの投球がされたと判断される場合がある。このような場合、自動投球判定後において、入力装置8の振りの速さが最大になると考えられる。自動投球判定前にのみ検出された加速度に応じてボールの転がる速度が決定されると、プレイヤがより速くボールを転がせようと意図して入力装置8をより速く振った場合でも、ボールの転がる速度は所定の値(自動投球判定の閾値に応じたボールの速度)以上にはならない。従って、自動投球判定後の所定期間に検出される加速度の大きさに応じて、ボールの速度を補正することにより、プレイヤの振り動作をより正確にゲーム空間におけるボールの転がる速度に反映させることができる。
また、ゲーム装置3は、自動投球判定前後の所定期間中に加速度センサ37で検出した加速度の積算値と、1軸ジャイロセンサ56で検出したZ軸周りの角速度積算値とに基づいて、ボールの回転量及び回転方向を決定し、決定された回転量及び回転方向に基づいてボールをカーブ(軌道を変化)させる。すなわち、プレイヤが入力装置8を捻る動作に応じて、ボールにカーブをかける。上述した自動投球判定では、プレイヤの意図するリリースのタイミングを正確に知ることは困難であるため、自動投球判定前後に検出される上記加速度と、上記角速度とに基づいて、ボールの回転(回転量及び回転方向)を決定する。これにより、プレイヤがボールに加えようと意図する回転を、より正確にゲーム空間におけるボールの回転に反映させることができる。このようにして、自動投球判定前後におけるプレイヤによる入力装置8の実際の振り及び捻り動作が、ゲーム空間におけるボールの回転量及び回転方向に反映される。
さらに、ゲーム装置3は、自動投球判定後、プレイヤが入力装置8を振り終わる際の入力装置8の姿勢が所定の姿勢である場合、ボールの軌道を修正する。具体的には、プレイヤが入力装置8を振った後であるフィニッシュの状態において、入力装置8の姿勢がロール方向(Z軸周り)に回転していない場合は、プレイヤはストレートの投球をしたとして、ストレート補正を行う。ストレート補正とは、ボールが転がる方向をストレートに補正することである。例えば、ゲーム装置3は、ボールの回転方向をピンに向かう方向に補正したり、回転量を抑えたりすることによって、ボールの転がる方向をストレートに補正する。図14は、フィニッシュの状態において、入力装置8を後面から見た図である。図14において、Z軸の方向は紙面手前から奥方向である。図14に示されるように、フィニッシュの状態において、入力装置8がZ軸周りに所定の角度以上回転している場合、ゲーム装置3は、プレイヤがボールに回転を加えたと判断して上記ストレート補正を行わない。
ただし、フィニッシュの状態において、入力装置8がZ軸周りに所定の角度以上回転していなくても、入力装置8の上面が地面の方向を向いており、かつ、Z軸正方向がプレイヤの真後ろ方向を向いていない場合には、ゲーム装置3は、ストレート補正を行わない。図15Aは、フィニッシュの状態において、入力装置8の姿勢を投球方向に対して横から見た図である。図15Bは、フィニッシュの状態において、ストレート補正を行わない場合の入力装置8の姿勢を投球方向に対して真後ろから見た図である。図15A及び図15Bに示されるように、プレイヤが入力装置8を振り終わった場合において、入力装置8の上面が地面の方向を向いており(すなわち、入力装置8の位置からY軸正方向に無限に伸びる半直線が地面と交わる場合)、かつ、Z軸がxyz座標系におけるx軸の正方向(図15Bの左側)又は負方向(図15Bの右側)に傾いている場合、ゲーム装置3は、プレイヤがボールに回転を加えたとしてストレート補正を行わない。
上述のように、フィニッシュの状態における入力装置8の姿勢に応じてストレート補正を行うか否かを決定する理由を以下に説明する。すなわち、プレイヤがストレートのボールを投球する際、掌を上の方向に向けた状態から手首を捻ることなく真後ろにバックスイングを行い、そのまま手首を捻らずにフォワードスイングをすると考えられる。そして、プレイヤは、ボールをリリース後、手首を捻らずに掌が投球方向(あるいは大きなスイングをする場合は投球方向と反対方向)に向くようにしてボールの投球動作を終了する(フィニッシュの状態になる)と考えられる。つまり、プレイヤがストレートのボールを投球する際、投球中及び投球後において、プレイヤは投球方向にまっすぐに腕を振るものと考えられる。一方、プレイヤがボールに回転を加えようとする場合、ボールを捻るようにして投球しようとすると考えられるため、フィニッシュの状態では、手首を捻った状態になる。この場合、入力装置8はZ軸周りに回転した状態になる。従って、フィニッシュの状態における入力装置8のZ軸周りの回転を検出することにより、プレイやがボールにカーブをかけようとしたのか、ストレートのボールを投げようとしたのかを判定することができる。
また、入力装置8を振った場合の腕の軌道が投球方向に対してまっすぐでない場合、フィニッシュの状態においては、入力装置8は、図15Bに示されるように、x軸の正方向又は負方向に傾くと考えられる。図15Bで示される腕の軌道を示す矢印pは、プレイヤの腕が後方(バックスイングからフォワードスイングに移行する瞬間の状態)から前方(フィニッシュの状態)に移動する様子を上から見た場合の腕の軌道を示している。このように、腕の軌道pが投球方向に対してまっすぐでない場合、プレイヤは、ボールに回転を加えようとしたと考えられる。プレイヤが投球方向に対してまっすぐに入力装置8を振らない場合、フィニッシュの状態における入力装置8は、図15Bに示されるようにy軸方向(重力方向と反対方向)に対してある程度傾いていると考えられる。
以上のように、フィニッシュの状態における入力装置8の姿勢から、プレイヤがボールに回転を加えようとしたか否かを判定することができる。従って、フィニッシュの状態における入力装置8の姿勢に基づいてストレート補正を行うか否かを判定することにより、プレイヤが意図したようにボールを投球することができる。
[ゲーム処理の詳細]
次に、図16〜図29を参照してゲーム装置3において実行される処理の詳細について説明する。まず、ゲーム装置3における処理において用いられる主なデータについて図16を用いて説明する。図16は、ゲーム装置3のメインメモリ(外部メインメモリ12又は内部メインメモリ11e)に記憶される主なデータを示す図である。図16に示されるように、ゲーム装置3のメインメモリには、ゲームプログラム61、操作データ62、及びゲーム処理用データ66が記憶される。なお、メインメモリには、図16に示すデータの他、ゲームに登場する各種オブジェクトの画像データや、オブジェクトの各種パラメータを示すデータ、各操作ボタン32a〜32iに対する入力状態を示すデータ等、ゲーム処理に必要なデータが記憶される。
ゲームプログラム61は、ゲーム装置3に電源が投入された後の適宜のタイミングで光ディスク4からその一部又は全部が読み込まれてメインメモリのプログラム領域に記憶される。
操作データ62は、コントローラ5からゲーム装置3へ送信されてくる操作データである。上述したように、コントローラ5からゲーム装置3へ1/200秒に1回の割合で操作データが送信されるので、メインメモリに記憶される操作データ62はこの割合で更新される。ここで、本実施形態においては、1/200秒に1回送信される操作データを1サンプルとして、メインメモリには、最新の(最後に送信された)操作データに加えて、過去に送信された所定数の操作データが記憶される。
操作データ62には、角速度データ63、加速度データ64、及びマーカ座標データ65が含まれる。また、各ボタンが押されたか否かを示すデータも含まれる。角速度データ63は、ジャイロセンサユニット7のジャイロセンサ55及び56によって検出された角速度を示すデータの集合である。すなわち、角速度データ63は、図3に示すXYZ座標系における各軸回りの角速度であり、現在及び過去に検出された各軸周りの角速度の集合である。また、加速度データ64は、現在及び過去に加速度センサ37によって検出された加速度(加速度ベクトル)を示すデータの集合である。
マーカ座標データ65は、撮像情報演算部35の画像処理回路41によって算出される座標、すなわち上記マーカ座標を示すデータである。マーカ座標は、撮像画像に対応する平面上の位置を表すための2次元座標系で表現される。
ゲーム処理用データ66は、後述するゲーム処理(図17)において用いられるデータである。ゲーム処理用データ66は、回転行列データ67、ロール成分回転データ68、ピッチ成分回転データ69、ヨー成分回転データ70、ピッチ姿勢データ71、及びヨー姿勢データ72を含む。
回転行列データ67は、基準姿勢(上述したXYZ軸がxyz軸と一致する場合の姿勢)から現在の入力装置8(コントローラ5)の姿勢への回転を表すデータであり、当該回転は、回転行列Mで表される。また、詳細は後述するが、回転行列Mは、入力装置8のXYZ軸方向を示すそれぞれの単位ベクトルをxyz空間内の座標系で表して並べたものでもある。回転行列データ67は、操作データ62と同様、最新の回転行列Mに加えて、所定サンプルの回転行列Mを示すデータの集合である。回転行列Mは、以下の式(1)に示す3×3の行列で表現される。
また、ロール成分回転データ68は、Z軸周りの入力装置8の回転を表すデータであり、ロール成分回転行列Mrで表される。ピッチ成分回転データ69は、X軸周りの入力装置8の回転を表すデータであり、ピッチ成分回転行列Mpで表される。さらに、ヨー成分回転データ70は、Y軸周りの入力装置8の回転を表すデータであり、ヨー成分回転行列Myで表される。ロール成分回転行列Mr、ピッチ成分回転行列Mp、及びヨー成分回転行列Myは、それぞれ以下の式(2)〜式(4)に示す3×3の行列で表現される。
ここで、ロール方向(Z軸周り)、ピッチ方向(X軸周り)、ヨー方向(Y軸周り)の回転角をそれぞれθr、θp、θyとした。角度θr、θp、θyは、角速度データ63に基づいて求められる。すなわち、角度θrは、基準姿勢からのZ軸周りの回転角であり、当該回転角は、上述したように、Z軸周りの角速度の積分を算出することにより求められる。角度θp及びθyも同様に、それぞれX軸周り、Y軸周りの角速度の積分を算出することにより、求められる。なお、ジャイロセンサの出力には一般的にドリフト等による誤差が含まれる可能性があるので、角速度を積分するだけでなく、加速度データ64に基づいて姿勢を補正することができる。具体的には、入力装置8が静止しているときや、等速運動をしているときは、加速度データ64が示す加速度が重力であるので、その方向から入力装置8の姿勢を算出し、角速度によって算出された姿勢を加速度から算出された姿勢に近づける補正を行う。その際、加速度の大きさが重力の大きさに近いほど補正の度合いを高くするようにすれば、動いている場合等、加速度から姿勢を算出できない場合の姿勢をあまり反映させないようにすることができる。さらに、マーカ座標データ65に基づいて補正を行うことも可能である。すなわち、2つのマーカ座標を結ぶ方向によって、入力装置のロール方向の姿勢を算出することが可能であるし、マーカ座標の位置をヨーおよび/またはピッチ方向の姿勢に関連付けることも可能であるので、角速度によって算出された姿勢や加速度によって補正された姿勢を、マーカ座標に基づいて算出された姿勢に所定割合で近づけることで補正を行うことが可能である。
上記回転行列Mは、Z軸を基準としたロール方向、ピッチ方向、ヨー方向の回転を表す回転行列の積である。すなわち、回転行列Mは、上記式(2)〜式(4)で表される各成分の回転行列の積である。本実施形態では、角速度データ63が更新されるタイミング(1/200秒に1回の割合)で、回転行列M(回転行列データ67)が算出され、メインメモリに保存されるものとする。
ピッチ姿勢データ71は、入力装置8のxyz座標系におけるピッチ方向の姿勢を示すデータの集合であり、当該ピッチ方向の姿勢は、上記回転行列Mにより求められる。ここで、xyz座標系におけるピッチ方向の姿勢とは、物体座標系(XYZ座標系)で入力装置8を回転させた後の空間固定座標系(xyz座標系)から見たx軸周りの回転を表す姿勢である。
ヨー姿勢データ72は、入力装置8のxyz座標系におけるヨー方向の姿勢を示すデータの集合であり、当該ヨー方向の姿勢は、上記回転行列Mにより求められる。ここで、xyz座標系におけるヨー方向の姿勢とは、物体座標系(XYZ座標系)で入力装置8を回転させた後の空間固定座標系(xyz座標系)から見たy軸周りの回転を表す姿勢である。
図17は、ゲーム装置3において実行されるゲーム処理の流れを示すメインフローチャートである。ゲーム装置3の電源が投入されると、ゲーム装置3のCPU10は、図示しないブートROMに記憶されている起動プログラムを実行し、これによってメインメモリ等の各ユニットが初期化される。そして、光ディスク4に記憶されたゲームプログラムがメインメモリに読み込まれ、CPU10によって当該ゲームプログラム61の実行が開始される。図17に示すフローチャートは、以上の処理が完了した後に行われる処理を示すフローチャートである。
まず、ステップS1において、CPU10は、現在のステートを投球前に設定する。具体的には、CPU10は、メインメモリに記憶された投球状態を表す変数(ステート変数)に、投球前の状態を表す値(例えば、1)を格納する。次に、CPU10は、ステップS2において、投球後経過時間を0にセットする。この投球後経過時間は、後述する自動投球判定がなされた後の経過時間である。次に、CPU10は、メインループの処理を実行する。
メインループの処理は、1フレーム時間(1/60秒)に1回の割合で実行され、ゲームが終了するまで繰り返し実行される。メインループの処理では、さらにセンササンプルループの処理が実行される。センササンプルループでは、サンプリング周期(例えば200回/秒)でコントローラ5から送信される加速度センサ37、2軸ジャイロセンサ55、及び1軸ジャイロセンサ56で検出された各操作データ(各軸方向の加速度及び各軸周りの角速度)に基づく処理が、サンプリング周期に合わせて逐次実行される。センササンプルループでは、まず、ステップS3の処理が実行される。
ステップS3において、CPU10は、加速度センサ37、2軸ジャイロセンサ55、及び1軸ジャイロセンサ56で検出された値をメインメモリに保存する。具体的には、CPU10は、コントローラ5から送信された各軸周りの角速度を角速度データ63として、メインメモリに保存する。同様に、CPU10は、コントローラ5から送信された加速度を加速度データ64として、メインメモリに保存する。ここで、CPU10は、今回から所定サンプル前までに取得した加速度及び角速度を履歴としてメインメモリに保存する。次に、CPU10は、ステップS4の処理を実行する。
ステップS4において、CPU10は、取得した加速度及び角速度に基づいて投球処理を実行する。ステップS4における処理の詳細を図18を用いて説明する。図18は、図17における投球処理(ステップS4)の詳細を示すフローチャートである。
まず、CPU10は、ステップS10の処理を実行する。ステップS10において、CPU10は、現在の状態が投球前であるか否かの判定を行う。具体的には、CPU10は、現在の状態を示すステート変数が投球前を示す値(例えば、1)か否かを判定する。本ゲーム処理においては、ステートは、投球前、投球中、投球後の3つの状態の何れかに設定される。ステップS10においては、これらの状態のうち、現在の状態が何れであるかが判定される。投球前の状態とは、プレイヤキャラクタがボールを把持して投球動作を行う前の状態である。投球中の状態とは、プレイヤキャラクタがボールを把持し、投球動作を行っている間の状態である。投球後の状態とは、プレイヤキャラクタがボールを投球した後の状態である。判定結果が肯定の場合、CPU10は、次にステップS11の処理を実行する。判定結果が否定の場合、CPU10は、次にステップS15の処理を実行する。
ステップS11において、CPU10は、Yawリセット前のピッチ姿勢を算出する。ステップS11では、後述するYaw方向のリセット処理が行われる前の入力装置8のピッチ姿勢を算出する処理である。ここで、ピッチ姿勢とは、入力装置8の空間固定座標系(xyz座標系)でのピッチ方向(x軸周り)に関する姿勢である。ステップS11における、Yawリセット前ピッチ姿勢算出処理の詳細を図19を用いて説明する。図19は、Yawリセット前ピッチ姿勢算出処理(ステップS11)の詳細を示すフローチャートである。
まず、CPU10は、ステップS30の処理を実行する。ステップS30において、CPU10は、入力装置8の回転を示す回転行列Mを取得する。具体的には、CPU10は、メインメモリを参照して、回転行列データ67を取得する。回転行列データ67は、上述したように、式(1)で示される回転行列Mを表すデータである。回転行列Mは、ステップS3で取得された最新の角速度に基づいて算出される入力装置8の姿勢を表す。次に、CPU10は、ステップS31の処理を実行する。
ステップS31において、CPU10は、ピッチ方向の姿勢を算出する。ここで、ピッチ方向の姿勢とは、入力装置8を回転行列Mによって回転させた場合において、回転された入力装置8のxyz座標系における姿勢のピッチ方向成分(x軸周りの回転)を示す。具体的には、CPU10は、以下の式(5)を用いて、ピッチ方向の姿勢を算出する。
ピッチ方向の姿勢=ArcSin(Zy) ・・・(5)
Zyは、ステップS30で取得した回転行列Mから得られる値であり、式(1)に示される回転行列Mの1つの要素である。ここで、物体座標系(XYZ座標系)のZ軸方向の単位ベクトルez(0,0,1)に回転行列Mをかける演算を行うと、当該演算後のベクトルez'は、ez'=(Zx,Zy,Zz)となる。すなわち、Zyは、Z軸方向の単位ベクトルを基準姿勢(すなわち、XYZ座標系とxyz座標系が一致する場合の姿勢)から回転行列Mを用いて回転させた場合において、当該回転後のベクトルのxyz座標系におけるy軸の座標値を示す。同様に、Zxは、Z軸方向の単位ベクトルを基準姿勢から回転行列Mを用いて回転させた場合において、当該回転後のベクトルのxyz座標系におけるx軸の座標値を示す。Zzも同様である。さらに、その他の要素についても同様である。例えば、Xz、Xy、及びXzは、X軸方向の単位ベクトルを基準姿勢から回転行列Mを用いて回転させた場合において、当該回転後のベクトルのxyz座標系におけるx軸、y軸、及びz軸の座標値を示す。また、Yz、Yy、及びYzは、Y軸方向の単位ベクトルを回転行列Mを用いて回転させた場合において、当該回転後のベクトルのxyz座標系におけるx軸、y軸、及びz軸の座標値を示す。
図28は、ステップS31で算出されるピッチ方向の姿勢を表した図である。ステップS31の処理では、ピッチ方向の姿勢は、ヨー方向の姿勢を無視して算出される(つまり、Zx=0として算出される)。ヨー方向の姿勢とは、入力装置8を回転行列Mによって回転させた場合において、回転された入力装置8のxyz座標系における姿勢のヨー方向成分(y軸周りの回転)である。図28から明らかなように、式(5)で求められるピッチ方向の姿勢は、回転後のベクトルez'(0,Zy,Zz)とz軸とがなす角度である。
一方、回転後のZ軸がx軸方向にも傾いている場合(すなわち、Zxが0でない場合)がある。この場合におけるピッチ方向の姿勢及びヨー方向の姿勢について、図29を用いて説明する。図29は、ピッチ方向の姿勢及びヨー方向の姿勢を説明するための説明図である。図29において、ベクトルez'は、Z軸方向の単位ベクトルezをX軸(又はx軸)周り及びY軸(又はy軸)周りに回転させた後のベクトルである。図29に示されるように、ピッチ方向の姿勢は、回転後のZ軸方向単位ベクトルez'をzy平面上に投影させた場合のzy投影ベクトルとz軸とがなす角度であり、x軸周りの回転量を表す。具体的には、この場合のピッチ方向の姿勢は上記式(5)ではなく、以下の式(6)で求められる。
ピッチ方向の姿勢=ArcTan(Zy/Zz) ・・・(6)
また、ヨー方向の姿勢は、ベクトルez'がx軸方向にどれだけずれているかを示す姿勢である。具体的には、ヨー方向の姿勢は、ベクトルez'をxz平面上に投影した場合のxz投影ベクトルとz軸とがなす角度として表現することができる。すなわち、ヨー方向の姿勢は、y軸周りの回転量を表す。
しかしながら、ステップS31においては、x軸方向の成分、すなわち、ヨー方向の姿勢(y軸周りの回転)を考慮せず、式(5)を用いてピッチ方向の姿勢を求めることとする。これは、以下に示す理由からである。
すなわち、入力装置8の姿勢(xyz座標系における姿勢)は、ロール方向の姿勢(z軸周りの回転)及びピッチ方向の姿勢(x軸周りの回転)については、常に正確に求めることができるが、ヨー方向の姿勢(y軸周りの回転)については、状況によっては正確に求めることが困難だからである。
具体的には、ジャイロセンサで検出された角速度から各軸周りの回転角を求めることにより入力装置8の姿勢を算出することができるが、角速度を用いた各軸周りの回転角は、角速度を時間で積分することによって求められるため、時間とともに誤差が蓄積する。また、求められる回転角は、ある姿勢からの回転角であるため、ある姿勢が上記基準姿勢とずれている場合は、正確なxyz座標系における姿勢を求めることができない。しかしながら、ロール方向の姿勢及びピッチ方向の姿勢については、このような誤差を加速度センサ37により検出された加速度データを用いて補正することができる。すなわち、例えば、入力装置8が静止状態等では、加速度センサ37により検出された加速度ベクトルの方向が重力方向と一致する。従って、加速度センサ37により検出された加速度ベクトルの方向に基づいて、入力装置8がロール方向(Z軸周り)及びピッチ方向(X軸周り)にどの程度回転しているかを正確に求めることができる。また、入力装置8が静止していない場合であっても、ある程度の期間内において加速度センサ37で検出される加速度ベクトルは、平均的には重力方向に近いものとなる。従って、例えば、検出される加速度ベクトルの平均的な向きが、Y軸負方向と略一致する場合、入力装置8は、ロール方向及びピッチ方向に回転していないことがわかる。従って、ロール方向及びピッチ方向の回転については、ある程度正確に求めることができる。しかしながら、加速度センサ37の検出結果からは、重力方向を軸とした回転(ヨー方向の姿勢)を検知することはできない。従って、ヨー方向の姿勢(y軸周りの回転)については、後述するYawリセット処理を行うまでは基本的に、正確に求めることができない(ただし、コントローラ5の撮像素子40によって生成される画像にマーカ6R及び6Lの画像が含まれている場合には、上述したマーカ座標に基づいて、入力装置8のヨー方向の姿勢(y軸周りの回転)も正確に求めることができる)。
以上のような理由から、ステップS31においては、ヨー方向の姿勢(y軸周りの回転)を考慮しない。従って、ステップS31においては、CPU10は、ヨー方向については回転していない(Z軸がx軸方向に傾いていない)として、ピッチ方向の姿勢を式(5)を用いて算出する。
なお、入力装置8をロール方向(Z軸周り)、ピッチ方向(X軸周り)、ヨー方向(Y軸周り)にそれぞれ角度θr、θp、θyで回転させた場合、回転後のxzy座標系(空間座標系)における上記ピッチ方向の姿勢(x軸周りの回転)及びヨー方向の姿勢(y軸周りの回転)は、必ずしも角度θp及び角度θyと一致しない。例えば、入力装置8をロール方向(Z軸周り)に角度θrだけ回転させ、さらにピッチ方向(X軸周り)に角度θpだけ回転させた場合、入力装置8をヨー方向(Y軸周り)に回転させていないにも拘らず、xzy座標系では、上記ヨー方向(y軸周り)に回転したような姿勢となる。従って、本明細書では、物体座標系(XYZ座標系)における回転と回転後の空間座標系(xyz座標系)における姿勢とを区別するため、特に座標系を明示している場合を除いて、例えば、「ピッチ方向の姿勢」という場合は、xyz座標系におけるx軸周りの回転を意味し、「ピッチ方向の回転」という場合は、XYZ座標系におけるX軸周りの回転を意味することとする。
図19に戻り、次に、CPU10は、ステップS32の処理を実行する。ステップS32において、CPU10は、ステップS31で算出したピッチ方向の姿勢を履歴として保存する。具体的には、CPU10は、算出したピッチ方向の姿勢をピッチ姿勢データ71として、メインメモリに保存する。その後、CPU10は、Yawリセット前のピッチ姿勢算出処理処理を終了し、図18に示されるステップS12の処理を実行する。
図18に戻り、ステップS12において、CPU10は、投球前ステートの処理を実行する。ステップS12では、投球前の状態における処理である。ステップS12における投球前ステート処理の詳細を、図20を用いて説明する。図20は、投球前ステート処理(ステップS12)の詳細を示したフローチャートである。
ステップS40において、CPU10は、ピッチ方向の姿勢に基づいて現在のモーションを設定する。具体的には、CPU10は、ステップS31で算出された最新のピッチ方向の姿勢をメインメモリのピッチ姿勢データ71から取得する。そして、CPU10は、ピッチ方向の姿勢に対応付けられたモーション画像を予めメインメモリに保存された複数のモーション画像の中から選択し、現在のモーションとして設定する。例えば、モーション画像は、数十のプレイヤキャラクタの画像から構成されており、ピッチ方向の姿勢に応じたモーション画像が選択されることにより、後述するステップS5において、プレイヤの動作に応じた動作を示すプレイヤキャラクタの画像がテレビ2に表示される。次に、CPU10は、ステップS41の処理を実行する。
ステップS41において、CPU10は、プレイヤキャラクタの手の位置及びボールの位置を補正する。ここでの処理は、入力装置8のヨー方向の姿勢(y軸周りの回転)に応じてプレイヤキャラクタの手首の位置を中心として、プレイヤキャラクタの手(手首から先の部分)の位置及びボールの位置を補正する処理である。より具体的には、回転行列Mの要素Zxの値に応じて、プレイヤキャラクタの手の位置を投球方向に対して左右方向に移動させる処理である。ここで、回転行列Mの要素Zxは、Z軸方向の単位ベクトルを回転行列Mを用いて回転させた場合において、当該回転後のベクトルのxyz座標系におけるx軸の座標値である。従って、例えば、プレイヤが画面に向かって右側に入力装置8を振ると、プレイヤの動きに応じてプレイヤキャラクタの手の位置及びボールの位置がレーンに対して右側に移動する。ステップS41において、具体的には、CPU10は、メインメモリを参照してステップS30で取得した最新の回転行列M(回転行列データ67)を取得し、当該回転行列Mの要素Zxの値に所定の係数をかけることによって、x軸方向の補正量を算出する。そして、CPU10は、ステップS40で設定された現在のモーションにおけるx軸方向の手の位置及びボールの位置に、算出したx軸方向の補正量を加え、新たな現在のモーションとして設定する。
ここで、ステップS41においては、ヨー方向の姿勢(y軸周りの回転)は、上述したように、正確に求めることは困難である。すなわち、入力装置8が基準姿勢からどの程度ヨー方向に回転しているか(コントローラ5の先端(光入射面35a)がどの程度x軸方向にずれているか)正確に求めることはできない。しかしながら、ボールの投球動作の前である投球前ステートにおいては、ボールを投球したときのボールの方向や強さ等には一切関係ないため、不正確なヨー方向の姿勢を用いても問題ない。ここでは、表示上の演出のためにプレイヤキャラクタの手の位置及びボールの位置を補正している。
次に、CPU10は、ステップS42において、Bボタン32iが押されたか否かを判定する。CPU10は、Bボタン32iが押されたと判定した場合、次にステップS43の処理を実行する。CPU10は、Bボタン32iが押されていないと判定した場合、投球前ステート処理を終了し、処理を図18に示す投球処理に戻す。
ステップS43において、CPU10は、Yawリセット処理を実行する。具体的には、CPU10は、式(5)を用いてピッチ方向の姿勢を算出し、現在の姿勢として設定する。ここでの処理は、不正確なヨー方向の姿勢をリセットし、ピッチ方向の姿勢を現在の姿勢として設定する処理である。すなわち、ステップS43では、プレイヤによってBボタン32iが押された時点(この時点では、プレイヤは図9に示したような姿勢で入力装置8を構えている)で、ヨー方向の姿勢を0に設定する。上述したように、ヨー方向の姿勢は正確ではない可能性があるため、Bボタン32iが押された時点を基準として、当該基準からのヨー方向の回転を以降の投球処理に反映させる。その後、CPU10は、投球前ステート処理を終了し、処理を図18に示す投球処理に戻す。
図18に戻り、ステップS13において、CPU10は、Yawリセットをしたか否かを判定する。具体的には、CPU10は、ステップS12においてYawリセット処理(上述のステップS43の処理)を行った場合、Yawリセットをしたと判定する。判定結果が肯定の場合、CPU10は、次にステップS14の処理を実行する。判定結果が否定の場合、CPU10は、図18に示す投球処理を終了する。
ステップS14において、CPU10は、現在のステートを投球中に設定する。具体的には、CPU10は、メインメモリに記憶されたステート変数に、投球中の状態を表す値(例えば、2)を格納する。したがって、Bボタン32iが押された場合にステートが投球中に設定されるので、押される前、すなわち投球を行う意思の無いときに入力装置8が動かされても誤って投球が行われることを防ぐことができる。また、Bボタン32iを押したまま投球を行うことができるので、人差指に力を加えることで入力装置8をしっかり把持することができる。次に、CPU10は、図18に示す投球処理を終了する。
一方、ステップS10において、現在の状態が投球前ではないと判定された場合、CPU10は、次に、ステップS15の処理を実行する。
ステップS15において、CPU10は、Yawリセット後のピッチ姿勢を算出する。ステップS15では、上述したYawリセット処理が行われた後の入力装置8のピッチ方向の姿勢を算出する処理である。ステップS15における、Yawリセット後ピッチ姿勢算出処理の詳細を図21を用いて説明する。図21は、Yawリセット後ピッチ姿勢算出処理(ステップS15)の詳細を示すフローチャートである。
まず、CPU10は、ステップS50の処理を実行する。ステップS50において、上述したステップS30と同様の処理を実行する。すなわち、CPU10は、入力装置8の回転を示す回転行列Mを取得する。次に、CPU10は、ステップS51の処理を実行する。
ステップS51において、CPU10は、補正値に基づいたピッチ方向の姿勢を算出する。具体的には、CPU10は、以下の式(7)又は式(8)を用いて補正値を算出する。
補正値A=Zx×Zx ・・・(7)
補正値A=−Zx×Zx ・・・(8)
ここで、Zxが正の値である場合、式(7)を用いて補正値Aを算出し、Zxが負の値である場合は式(8)を用いて補正値Aを算出する。Zxが零である場合は、補正値Aは零となる。そして、CPU10は、ピッチ方向の姿勢を以下の式(9)を用いて算出する。
ピッチ方向の姿勢=ArcTan((Zy+補正値A)/Zz) ・・・(9)
式(9)では、上記式(6)に補正値Aが追加されている。以下、補正値Aを追加する理由を説明する。
入力装置8を基準姿勢から水平方向に振る間、Zyの値は0近辺になるため、上記式(6)を用いて算出されるピッチ方向の姿勢は、0近辺の値になる。すなわち、入力装置8を水平方向に所定の角度だけ振っても入力装置8は、xz平面上を回転するため、Zyの値は0のままである。しかしながら、プレイヤが入力装置8を水平方向に振る場合、実際には、入力装置8は上下方向(y軸方向)にもぶれるため、Zyの値は0を境にして正又は負の微小な値を示す。ここで、小さい角度の範囲で入力装置8を基準姿勢から水平方向に振る場合は、Zy/Zzの値は、0に近い値となり、式(6)を用いて算出されるピッチ方向の姿勢は、0度に近い値となる。しかしながら、基準姿勢に対して水平方向に90度に近い角度まで入力装置8を振る場合、Zzの値は0に近づく。すると、Zy/Zzの値は、分母が0に近くなるため、Zyが僅かに大きくなっただけでも急激に上昇し、非常に大きな正の値になる。この場合、式(6)を用いて算出されるピッチ方向の姿勢は、90度に近い値となる。一方、Zzの値が0に近い値の場合において、Zyが負の値を示す場合(すなわち、入力装置8の先端が僅かに下方向にぶれた場合)、Zy/Zzの値は、非常に大きな負の値を示す。すなわち、基準姿勢に対して水平方向に90度に近い角度まで入力装置8を振る場合において、入力装置8の先端が上下方向に僅かにぶれると、Zy/Zzの値は、無限大の値とマイナス無限大の値との間を往復する。従って、式(6)を用いて算出されるピッチ方向の姿勢は、90度の値と−90度の値とを往復することになる。そうすると、ピッチ方向の姿勢に基づいてモーション画像が設定されるため、画面上に表示されるプレイヤキャラクタは、ある姿勢から全く逆の別の姿勢に瞬時に移動することになる。従って、式(6)を用いてピッチ方向の姿勢を算出すると、プレイヤキャラクタは不自然な動きをする可能性がある。このような不自然なプレイヤキャラクタの動きを防止するため、ステップS51においては、式(9)を用いてピッチ方向の姿勢を算出する。
なお、上記補正値Aは、どのように求められてもよく、例えば、Yzの値に基づいて求められてもよい。
次に、CPU10は、ステップS52の処理を実行する。ステップS52において、CPU10は、ステップS32の処理と同様、ステップS51で算出したピッチ方向の姿勢を履歴としてメインメモリに保存する。そして、CPU10は、Yawリセット後のピッチ姿勢算出処理を終了し、処理を図18で示す投球処理に戻す。
図18に戻り、CPU10は、ステップS16の処理を実行する。ステップS16において、CPU10は、現在のステートが投球中か否かを判定する。具体的には、CPU10は、現在の状態を示すステート変数が投球前を示す値(例えば、2)か否かを判定する。判定結果が肯定の場合、CPU10は、次にステップS17の処理を実行する。判定結果が否定の場合、CPU10は、次にステップS20の処理を実行する。
ステップS17において、CPU10は、投球中ステート処理を実行する。ステップS17では、投球中の状態における処理である。ステップS17における投球中ステート処理の詳細を、図22を用いて説明する。図22は、投球中ステート処理(ステップS17)の詳細を示したフローチャートである。
まず、ステップS60において、CPU10は、ピッチ方向の姿勢に基づいて現在のモーションを設定する。具体的には、CPU10は、上述したステップS40の処理と同様、ステップS51で算出したピッチ方向の姿勢をメインメモリから取得し、取得したピッチ方向の姿勢に応じたモーション画像を現在のモーションとして設定する。次に、CPU10は、ステップS61において、ステップS41の処理と同様、入力装置8のヨー方向の姿勢に応じて、プレイヤキャラクタの手の位置及びボールの位置を補正する。そして、次にCPU10は、ステップS62の処理を実行する。
ステップS62において、CPU10は、自動投球判定の処理を実行する。ステップS62においては、入力装置8の振りの速さ(強さ)が極大になった場合において、その極大値が所定の閾値より大きいとき、プレイヤによってボールが投球されたと判定される。プレイヤが、図10〜図12に示されるような投球動作を行う場合、ジャイロセンサ55及び56が検出する角速度は変化する。ステップS62における処理は、変化する角速度に基づいて、ボールが投球されたか否かを判定する処理である。ステップS62における自動投球判定の詳細な処理を、図23を用いて説明する。図23は、自動投球判定処理(ステップS62)の詳細を示したフローチャートである。
まず、ステップS70において、CPU10は、現在のX軸及びY軸周りの角速度の長さ、1サンプル前のX軸及びY軸周りの角速度の長さ、及び、2サンプル前のX軸及びY軸周りの角速度の長さを、それぞれ算出し、それぞれ変数AV0、AV1、及び、AV2として設定する。具体的には、CPU10は、メインメモリの角速度データ63を参照して、最新のX軸周りの角速度とY軸周りの角速度とを取得し、XY方向の角速度の長さ(X軸周りの角速度とY軸周りの角速度とによって定められる角速度ベクトルの大きさ)を算出する。そして、算出したXY方向の角速度の長さを変数AV0に格納し、メインメモリに記憶する。同様に、CPU10は、メインメモリの角速度データ63を参照して、1サンプル前のX軸周りの角速度とY軸周りの角速度とを取得し、1サンプル前のXY方向の角速度の長さを変数AV1として、メインメモリに記憶する。さらに、同様に、CPU10は、2サンプル前のXY方向の角速度の長さを変数AV2として、メインメモリに記憶する。次に、CPU10は、ステップS71の処理を実行する。
ステップS71において、CPU10は、AV1≧AV0、且つ、AV1>AV2が成り立つか否かを判定する。ステップS71での処理は、1サンプル前のXY方向の角速度の長さが極大値であるか否かを判定する処理である。すなわち、ここでは、入力装置8の振りの速さ(強さ)が極大か否かが判定される。プレイヤは、図12に示すボールを投球する瞬間、ボールに力を加えるようにして入力装置8を振ると考えられ、その瞬間において、XY方向の角速度の長さは極大になると考えられる。判定結果が肯定の場合、CPU10は、ボールの投球がなされた可能性があると考えられるため、次に、ステップS72の処理を実行する。一方、判定結果が否定の場合、CPU10は、自動投球判定の処理を終了し、処理を図22に示す投球中ステート処理に戻す。なお、角速度の長さが極大値か否かは、どのようにして判定されてもよい。
ステップS72において、CPU10は、現在のピッチ方向の姿勢を変数Rot0に、1サンプル前のピッチ方向の姿勢を変数Rot1にそれぞれ設定する。具体的には、CPU10は、メインメモリのピッチ姿勢データ71を参照して、ステップS51で算出した最新のピッチ方向の姿勢を取得し、変数Rot0に格納して、メインメモリに記憶する。同様に、CPU10は、メインメモリのピッチ姿勢データ71を参照して、1サンプル前のピッチ方向の姿勢を取得し、変数Rot1に格納して、メインメモリに記憶する。次に、CPU10は、ステップS73の処理を実行する。
ステップS73において、CPU10は、Rot0>Rot1か否かを判定する。ステップS73での処理は、現在のピッチ方向の姿勢が、1サンプル前のピッチ方向の姿勢よりも大きいか否かを判定する処理である。ここでの処理は、現在、バックスイング中かフォワードスイング中かを判定する処理である。プレイヤが図10に示すバックスイングを行っている場合、ピッチ方向の姿勢(図28及び図29参照)は、小さくなる方向に変化していると考えられる。一方、プレイヤが図11に示すフォワードスイングを行っている場合、ピッチ方向の姿勢は、大きくなる方向に変化していると考えられる。従って、判定結果が肯定の場合、CPU10は、ピッチ方向の姿勢は大きくなる方向に変化していると判定し、次に、ステップS74の処理を実行する。一方、判定結果が否定の場合、CPU10は、ピッチ方向の姿勢は小さくなる方向に変化していると判定し、次に、ステップS75の処理を実行する。
ステップS74において、CPU10は、AV1がフォワードスイングの閾値より大きいか否かを判定する。ステップS74での処理は、XY方向の角速度の長さが極大値を示しており、かつ時点でのXY方向の角速度の長さが、フォワードスイング時の閾値よりも大きいか否かを判定する処理である。XY方向の角速度の長さが極大値を示している場合においても、その時点でのXY方向の角速度の長さが所定の閾値以下である場合、CPU10はボールを投球したと判定しない。すなわち、XY方向の角速度の長さが極大値を示している場合でも、プレイヤが所定の速さよりも速く入力装置8を振っていない場合、CPU10は、ボールを投球したと判定しない。判定結果が肯定の場合、CPU10は、次に、ステップS76の処理を実行する。判定結果が否定の場合、CPU10は、自動投球判定の処理を終了し、処理を図22に示す投球中ステート処理に戻す。
一方、ステップS73において、判定結果が否定の場合、プレイヤはバックスイングを行っていると判断されて、ステップS75の処理が実行される。ステップS75において、CPU10は、AV1がバックスイングの閾値より大きいか否かを判定する。ステップS75での処理は、ステップS74での処理と同様、XY方向の角速度の長さが極大値を示しており、かつその時点でのXY方向の角速度の長さが、バックスイング時の閾値よりも大きいか否かを判定する処理である。判定結果が肯定の場合、CPU10は、次に、ステップS76の処理を実行する。判定結果が否定の場合、CPU10は、自動投球判定の処理を終了し、処理を図22に示す投球中ステート処理に戻す。なお、バックスイング時の閾値は、ステップS74におけるフォワードスイング時の閾値よりも大きく設定される。これは、バックスイング時において自動投球判定がなされることによって、投球方向とは反対方向にボールが飛ぶことを極力避けるためである。なお、他の実施例では、フォワードスイング時にのみ投球判定が行われ、バックスイング時には投球判定が行われないようにしてもよい。
ステップS76において、CPU10は、ボールの投球が成立したとして、投球判定の成立を示す値をメインメモリに記憶する。上記ステップS74において、判定結果が肯定の場合、その後の処理においてボールは投球方向に転がる。一方、上記ステップS75において、判定結果が肯定の場合、その後の処理においてボールは投球方向と反対方向に転がる。従って、ステップS76においては、直前にステップS74又はステップS75の何れの処理が実行されたかが区別できるようにして、投球判定の成立を示す値がメインメモリに記憶される。その後、CPU10は、自動投球判定の処理を終了し、処理を図22に示す投球中ステート処理に戻す。
図22に戻り、ステップS63において、CPU10は、自動投球が成立したか否かを判定する。具体的には、CPU10は、メインメモリを参照して投球判定が成立したことを示す値(ステップS76で記憶した値)が格納されているか否かを判定する。判定結果が肯定の場合、CPU10は、次に、ステップS64の処理を実行する。判定結果が否定の場合、CPU10は、投球中ステート処理を終了し、処理を図18に示す投球処理に戻す。
ステップS64において、CPU10は、過去所定サンプルの加速度に基づいて「振りの強さ」を算出する。具体的には、CPU10は、メインメモリの加速度データ64を参照して、過去所定サンプル(例えば、過去24サンプル)のうち、各加速度ベクトル(3軸に関する各加速度値を各成分とするベクトル)の大きさを算出し、その最大値を算出する。そして、CPU10は、その最大値を振りの強さとしてメインメモリに記憶する。次に、CPU10は、ステップS65の処理を実行する。
ステップS65において、CPU10は、上下方向の射出ベクトルを算出する。具体的には、CPU10は、ピッチ方向の姿勢に基づいて、仮想ゲーム空間における上下方向の射出角度を算出する。例えば、CPU10は、ピッチ方向の姿勢と射出角度との関係を予め定めたテーブルを参照して、射出角度を算出する。そして、CPU10は、算出した射出角度に基づいて、仮想ゲーム空間における射出ベクトル(0,sin(射出角度),cos(射出角度))を算出し、メインメモリに記憶する。次に、CPU10は、ステップS66の処理を実行する。
ステップS66において、CPU10は、ボールに力を加える。具体的には、CPU10は、ステップS65で算出した射出ベクトルにステップS64で算出した振りの強さをかけることによって、仮想ゲーム空間における投球方向(ピンの方向)及び上下方向の力を算出する。そして、CPU10は、算出した力をボールに加える処理を行う。次に、CPU10は、ステップS67の処理を実行する。
ステップS67において、CPU10は、ステップS64で算出した振りの強さを、「ボールに加えた力」としてメインメモリに記憶する。次に、CPU10は、ステップS68の処理を実行する。
ステップS68において、CPU10は、ボールに横方向の力を加える処理を行う。ここでの処理は、ボールにヨー方向の姿勢(y軸周りの回転量)に応じて仮想ゲーム空間において横方向に力を加える処理である。すなわち、プレイヤが前後方向(z軸方向)に対して平行ではなく斜め方向に入力装置8を振った場合、入力装置8は基準姿勢の状態からy軸周りに回転するため、CPU10は、そのヨー方向の回転に応じてボールに横方向の力を加える。具体的には、CPU10は、メインメモリの回転行列データ67を参照して、最新の回転行列Mの要素Zxから1サンプル前の回転行列Mの要素Zxを引いた値を「横方向の力」として算出する。そして、CPU10は、算出した横方向の力をボールに加える処理を行う。次に、CPU10は、投球中ステート処理を終了し、処理を図18に示す投球処理に戻す。
図18に戻り、ステップS18において、CPU10は、自動投球したか否かを判定する。具体的には、CPU10は、メインメモリを参照して投球判定が成立したことを示す値(ステップS76で記憶した値)が格納されているか否かを判定する。判定結果が肯定の場合、CPU10は、次に、ステップS19の処理を実行する。判定結果が否定の場合、CPU10は、投球処理を終了する。
ステップS19において、CPU10は、現在のステートを投球後に設定する。具体的には、CPU10は、メインメモリに記憶されたステート変数に、投球後の状態を表す値(例えば、3)を格納する。次に、CPU10は、図18に示す投球処理を終了する。
一方、ステップS16において、判定結果が否定の場合、すなわち、現在のステートが投球中でない場合、現在のステートは投球前でも投球中でもないため、CPU10は、次にステップS20の処理を実行する。ステップS20では、投球後に検出される角速度又は/及び加速度に基づいて、ボールの軌道や速度等を補正する。ステップS20における投球後ステート処理の詳細を、図24を用いて説明する。図24は、投球後ステート処理(ステップS20)の詳細を示したフローチャートである。
まず、ステップS80において、CPU10は、投球後経過時間をインクリメントする。次にCPU10は、ステップS81において、投球後経過時間が32より小さいか否かを判定する。判定結果が肯定の場合、CPU10は、次にステップS82の処理を実行する。判定結果が否定の場合、CPU10は、次にステップS83の処理を実行する。
ステップS82において、CPU10は、パワー更新処理を実行する。ここでの処理は、投球後の所定期間に加速度センサ37によって検出された加速度の大きさに応じて、「ボールに加えた力」を補正する処理である。ステップS82におけるパワー更新処理の詳細を、図25を用いて説明する。図25は、パワー更新処理(ステップS82)の詳細を示したフローチャートである。
まず、ステップS90において、CPU10は、現在の加速度ベクトルの大きさに基づいて「振りの強さ」を算出する。具体的には、CPU10は、メインメモリの加速度データ64を参照して、最新の加速度ベクトルの大きさを算出し、現在の振りの強さとしてメインメモリに記憶する。次に、CPU10は、ステップS91の処理を実行する。
ステップS91において、CPU10は、ボールに加えた力が振りの強さよりも小さいか否かを判定する。ここでの処理は、現在ボールに加わっている力が現在加速度センサ37によって検出された加速度ベクトルの大きさよりも小さいか否かを判定する処理である。具体的には、CPU10は、メインメモリを参照して「ボールに加えた力」がステップS90で算出した現在の「振りの強さ」より小さいか否かを判定する。判定結果が肯定の場合、CPU10は、次にステップS92の処理を実行する。判定結果が否定の場合、CPU10は、パワー更新処理を終了する。
ステップS92において、CPU10は、ステップS90で算出した「振りの強さ」から「ボールに加えた力」を引いた力をボールに加える。ここでの処理は、「振りの強さ」が「ボールに加えた力」よりも大きい場合、その差分をボールに追加的に加える処理である。そして、次に、CPU10は、ステップS93において、ステップS90で算出した「振りの強さ」を「ボールに加えた力」としてメインメモリに記憶し、パワー更新処理を終了する。
このように、ボールの投球後、パワー更新処理を実行することにより、投球後の所定期間に加速度センサ37によって検出された加速度に応じて、追加的にボールに力を加えることができる。
図24に戻り、ステップS83において、CPU10は、投球後経過時間が24に等しいか否かの判定を行う。判定結果が肯定の場合、CPU10は、次にステップS84の処理を実行する。判定結果が否定の場合、CPU10は、次にステップS85の処理を実行する。
ステップS84において、CPU10は、カーブ計算を行う。ここでの処理は、ボールに回転を加えることによってボールの軌道を変化させる処理である。ステップS84におけるカーブ計算の処理の詳細を、図26を用いて説明する。図26は、カーブ計算処理(ステップS84)の詳細を示したフローチャートである。
まず、ステップS100において、CPU10は、X方向の加速度の積算値とロール方向の角速度の積算値とに基づいてカーブ量を算出する。具体的には、CPU10は、メインメモリの加速度データ64及び角速度データ63を参照して、過去所定サンプル(例えば、過去48サンプル)のX軸方向の加速度及びZ軸回り(ロール方向)の角速度を取得する。次に、CPU10は、取得したX軸方向の加速度の絶対値の和を加速度の積算値として算出する。同様に、CPU10は、取得したZ軸回りの角速度の和を角速度の積算値として算出する。そして、CPU10は、カーブ量を以下の式(10)に基づいて算出する。
カーブ量=加速度の積算値×α+角速度の積算値の絶対値×β ・・・(10)
ここで、α及びβは所定の係数である。次に、CPU10は、ステップS101の処理を実行する。
ステップS101において、CPU10は、角速度の積算値の絶対値が所定値よりも大きいか否かの判定を行う。ここでの処理は、過去所定サンプル内にプレイヤが入力装置8をZ軸周りに回転させたか否かを判定する処理である。すなわち、Z軸回りの角速度の積算値の絶対値が所定値より大きい場合、プレイヤが意図的に入力装置8をZ軸周りに回転させた(捻る動作をした)と考えられる。一方、Z軸回りの角速度の積算値の絶対値が所定値以下の場合、プレイヤは意図的に入力装置8をZ軸周りに回転させていない(捻る動作をしていない)と考えられる。判定結果が肯定の場合、CPU10は、次にステップS102の処理を実行する。判定結果が否定の場合、CPU10は、次にステップS103の処理を実行する。
ステップS102において、CPU10は、角速度の積算値の符号に基づいてカーブ方向を決定する。ここで、カーブ方向とは、ボールが投球方向(ピンに向かう方向)に対してカーブする方向である。具体的には、CPU10は、ステップS100で算出した角速度の積算値の符号に基づいて、カーブ方向を決定する。例えば、角速度の積算値の符号がマイナスの場合、カーブ方向はマイナスに設定される。これにより、プレイヤが入力装置8をZ軸周りに回転させた方向と同じ方向にカーブ方向が設定される。次に、CPU10は、ステップS104の処理を実行する。
一方、ステップS103において、CPU10は、入力装置8の姿勢に基づいてカーブ方向を決定する。ステップS103においては、直前のステップS102において、プレイヤは意図的に入力装置8をZ軸周りに回転させていないと判定されているため、Z軸周りの角速度に基づいてカーブ方向を決定せず、この時点での入力装置8の姿勢に基づいてカーブ方向を算出する。すなわち、実際のボウリングの投球動作では、ボールを捻る動作よりもボールのリリース時における掌の向きによってカーブをかける場合がある。例えば、実際に右手でボールを投球するプレイヤは、左方向にカーブをかける際、リリース直前からリリース直後においては、掌をピンの方向に向けるようにして投球するのではなく、掌をピンの方向に対して垂直な方向(ピンの方向に対して左方向)に向けるようにして投球する場合がある。従って、本ゲームにおいても、投球後における入力装置8の上面(ボタン面)が投球方向に対して左方向を向いている場合、プレイヤは左方向にカーブをかけているとして、カーブ方向を左方向に設定する。具体的には、ステップS103において、CPU10は、メインメモリを参照して現在の回転行列Mの要素Xyの符号に基づいて、カーブ方向を決定する。これにより、カーブ方向は、入力装置8の上面が向いている方向と同じ方向に設定され、その結果、ボールは入力装置8の上面が向いている方向にカーブする。次に、CPU10は、ステップS104の処理を実行する。
ステップS104において、CPU10は、ステップS100で算出したカーブ量、及び、ステップS102又はステップS103で設定したカーブ方向に基づいて、ボールに回転をかける。すなわち、CPU10は、ボールに対して「カーブ方向」に「カーブ量」の回転を加える処理を行う。そして、CPU10は、カーブ計算の処理を終了する。
図24に戻り、ステップS85において、CPU10は、投球後経過時間が200より小さいか否かを判定する。判定結果が肯定の場合、CPU10は、次にステップS86の処理を実行する。判定結果が否定の場合、CPU10は、投球後ステート処理を終了する。
ステップS86において、CPU10は、ストレート判定済みか否かを判定する。ステップS86の処理では、後述するステップS87のストレート補正処理が実行されることによって、ストレート成立又はストレート不成立の判定がなされたか否かを判定する処理である。具体的には、CPU10は、メインメモリを参照することによって、ストレート判定の判定結果を示す値が、ストレート成立を示す値(例えば、1)又はストレート不成立を示す値(例えば、−1)であるか否かを判定する。判定結果が否定の場合、CPU10は、次にステップS87の処理を実行する。判定結果が肯定の場合、CPU10は、投球後ステート処理を終了する。
ステップS87において、CPU10は、ストレート補正処理を実行する。ここでの処理は、入力装置8を振る動作が終了したと考えられる時点(フィニッシュの状態の時点)における入力装置8の姿勢に基づいてボールの転がる方向をストレートに補正する処理である。ステップS87におけるストレート補正処理の詳細を、図27を用いて説明する。図27は、ストレート補正処理(ステップS87)の詳細を示したフローチャートである。
まず、ステップS110において、CPU10は、現在のXY方向の角速度の長さが0.3より小さいか否かを判定する。ここでの処理は、現在入力装置8が振られていないことを判定する処理である。図13に示すようなプレイヤが投球動作を終了した時点では、入力装置8は、略静止した状態(XYZ軸方向の角速度が略0の状態)である。ステップS110では、現在略静止した状態であるか否かを判定することにより、プレイヤが入力装置8を振り終わった状態であるか否かを判定する。具体的には、CPU10は、メインメモリの角速度データ63を参照して、最新のX軸周りの角速度及びY軸周りの角速度を取得する。そして、取得したX軸周りの角速度及びY軸周りの角速度を各成分とする角速度ベクトルの大きさが、所定の値(例えば、0.3)よりも小さいか否かを判定する。判定結果が肯定の場合、CPU10は、プレイヤが入力装置8を振り終わっていると判定して、次にステップS111の処理を行う。判定結果が否定の場合、CPU10は、プレイヤが入力装置8を振り終わっていないと判定し、ストレート補正処理を終了する。なお、判定結果が否定の場合、ストレート判定の判定結果を示す値は、ストレート成立を示す値(例えば、1)及びストレート不成立を示す値(例えば、−1)の何れでもない値(例えば、0)に設定される。
ステップS111において、CPU10は、ループカウンタiの値を0に設定する。次に、ステップS112〜ステップS117の処理が実行される。ステップS112〜ステップS117では、プレイヤが入力装置8を振り終わった時点から前8サンプルの期間、次に示す2つの条件が満たされるか否かを判定し、その期間2つの条件が満たされていた場合、CPU10は、ステップS118において、ボールの回転方向又は/及び回転量の補正を行う。第1の条件は、プレイヤが入力装置8を振り終わった時点から前8サンプルの間に、入力装置8がロール方向に回転していないことである。また、第2の条件は、プレイヤが入力装置8を振り終わった時点から前8サンプルの間に、入力装置8の上面(ボタン面)が地面の方向を向いている場合において、入力装置8のZ軸正方向がプレイヤの真後ろ方向を向いていることである。上記、第1の条件又は第2の条件の何れかが満たされない場合、CPU10は、ボールの回転方向又は/及び回転量の補正を行わない。
まず、ステップS112において、CPU10は、メインメモリの回転行列データ67を参照して、iサンプル前の回転行列Miを取得する。次に、CPU10は、ステップS113の処理を実行する。
ステップS113において、CPU10は、回転行列Miの要素Yxの絶対値が所定の値(例えば、0.3)より小さいか否かを判定する。ステップS113の処理は、上記第1の条件が満たされているか否かを判定する処理である。入力装置8が、ロール方向に回転している場合、回転行列Miの要素Yxの値は、0ではない値となる。従って、要素Yxの絶対値が所定の閾値以上の場合、入力装置8はロール方向に所定の値以上回転しているため、ボールの回転方向又は/及び回転量の補正は行われない。ステップS113において、判定結果が肯定の場合、CPU10は、次にステップS114の処理を実行する。判定結果が否定の場合、CPU10は、次にステップS120の処理を実行する。
続く、ステップS114及びステップS115において、上記第2の条件が満たされているか否かの判定が行われる。まず、ステップS114において、CPU10は、回転行列Miの要素Yyが0より小さいか否かを判定する。ステップS114の処理は、上記第2の条件のうち、入力装置8の上面が地面の方向を向いているか否かを判定する処理である。入力装置8の上面が地面の方向を向いている場合とは、入力装置8の上面に対して垂直に伸びる直線(Y軸正方向)が地面と交わる場合をいう(図15A参照)。要素Yyが0より小さい場合、入力装置8は、図15Aに示されるような姿勢となる。ステップS114において、判定結果が肯定の場合、CPU10は、次にステップS115の処理を実行する。判定結果が否定の場合、CPU10は、次にステップS116の処理を実行する。
ステップS115において、CPU10は、回転行列Miの要素Zzが0より小さく、かつ、回転行列Miの要素Zxの絶対値が0.3より小さいか否かを判定する。ステップS115の処理は、上記第2の条件のうち、入力装置8のZ軸正方向がプレイヤの真後ろ方向を向いているか否かを判定する処理である。入力装置8のZ軸正方向がプレイヤの真後ろ方向を向いていない場合とは、入力装置8の上面が地面の方向を向いている場合において、入力装置8のZ軸がxyz座標系におけるz軸に対してx軸方向に所定の角度傾いている場合である(図15B参照)。要素Zxの絶対値が、所定の値よりも大きい場合、入力装置8のZ軸は、x軸の正方向又は負方向に所定の角度傾いていることを示す。ステップS115において、判定結果が肯定の場合、CPU10は、次にステップS116の処理を実行する。判定結果が否定の場合、CPU10は、次にステップS120の処理を実行する。
ステップS116において、CPU10は、ループカウンタiをインクリメントする。次にCPU10は、ステップS117において、ループカウンタiの値が8よりも小さいか否かを判定する。判定結果が肯定の場合、CPU10は、次にステップS118の処理を行う。判定結果が否定の場合、CPU10は、再びステップS112の処理を実行する。
上記ステップS112〜ステップS117の処理が実行され、ステップS118の処理が実行される場合、プレイヤが入力装置8を振り終わった時点から前8サンプルの間、上記第1の条件及び第2の条件が満たされている。このような場合、プレイヤは、ストレートのボールを投球していると考えられるため、ステップS118において、ボールがストレートになるようにボールの回転方向、回転量の補正を行う。
具体的には、ステップS118において、CPU10は、ボールの回転方向をピンの方向に向ける処理、又は/及び、ボールの回転量を小さくする処理を行う。例えば、ボールが左にカーブする方向に回転している場合、CPU10は、ボールの回転をピンの方向に向けるようにして、ボールが左にカーブしないように補正する。このように補正することにより、ボールは、カーブすることなくピンに対してまっすぐに転がる。次に、CPU10は、ステップS119の処理を実行する。
ステップS119において、CPU10は、ストレート判定の判定結果を示す値を、ストレート成立を示す値(例えば、1)に設定し、メインメモリに記憶する。そして、CPU10は、図27のストレート補正処理を終了し、図24に示す投球後ステート処理を終了する(図18の投球処理も終了し、図17の処理に戻る)。
一方、ステップS113又はステップS115において判定結果が否定の場合、プレイヤはストレートのボールを投球していないと判定され、CPU10は、ボールの回転方向又は/及び回転量の補正(ステップS118の処理)は行わない。ステップS113又はステップS115において判定結果が否定の場合、CPU10は、ステップS120の処理を実行する。ステップS120おいて、CPU10は、ストレート判定の判定結果を示す値を、ストレート不成立を示す値(例えば、−1)に設定し、メインメモリに記憶する。そして、CPU10は、図27のストレート補正処理を終了し、図24に示す投球後ステート処理を終了する(図18の投球処理も終了し、図17の処理に戻る)。
なお、図27に示すストレート補正処理の詳細において用いられた様々な判定のための閾値(例えば、ステップS110、S113〜S115)は、上述した値に限らずどのような値でもよい。
また、上記パワー更新処理(図24のステップS82)、カーブ計算処理(ステップS84)、及びストレート補正処理(ステップS87)は、投球後のどのようなタイミングにおいて実行されてもよい。例えば、上記パワー更新処理は投球成立から所定時間経過後において実行されてもよく、上記カーブ計算処理は投球成立前後の所定期間において実行されてもよい。
図17に戻り、センササンプルループにおいて、所定回数ステップS3及びステップS4の処理が実行された後、ステップS5の処理が実行される。ステップS5において、CPU10は、ゲーム処理を行う。具体的には、CPU10は、ステップS3において設定されたプレイヤキャラクタのモーションや手の位置等に応じて、プレイヤキャラクタを画面上に表示したり、ステップS3において算出したボールに加えた力やその方向に応じて、ボールをゲーム空間内で移動させ、移動後のボールを画面上に表示させたりする。
なお、図17において図示されていないが、上記メインループは、ゲームが終了するタイミングで終了する。ゲームが終了するタイミングとは、プレイヤがゲームを終了するための操作を行った場合や、プレイヤがゲームをクリアした場合等である。メインループの処理が終了後、CPU10は、図17に示すゲーム処理を終了する。以上で、ゲーム処理の説明を終了する。
以上のように、本実施形態では、ジャイロセンサ55及び56によって検出された角速度に基づいて、投球判定を行い(ステップS62)、投球成立前に加速度センサ37によって検出された加速度に基づいて、ボールに加える力(従って、ボールの移動速度)を算出した(ステップS64)。また、投球成立後に検出された加速度に基づいて、ボールに加える力を補正した(ステップS82)。さらに、投球成立前後に検出された加速度及び角速度に基づいて、ボールのカーブ量及びカーブ方向を算出した(ステップS84)。また、投球成立後の入力装置8の姿勢に基づいて、ストレート補正を行った(ステップS87)。このように角速度に基づいて入力装置8の姿勢及び振りの速さを求めることにより、プレイヤによる入力装置8の振り動作をより正確に求めることができる。これにより、プレイヤによる入力装置8の振り動作をより正確にボールの投球速度及び投球方向に反映させることができる。従って、プレイヤは実際の動作のような直感的な動作に基づいて、ゲームを行うことができる。
なお、本実施形態では、XY方向の角速度の大きさが極大となり、かつその値が所定の閾値より大きい場合に、投球が成立したと判定し、加速度に基づいてボールを移動させる処理を行った。他の実施形態では、ジャイロセンサによって検出された角速度が所定の条件を満たした場合に、加速度に基づいて所定のオブジェクトを移動させる処理を行ってもよい。例えば、入力装置8の振り動作が開始されたことをジャイロセンサ55及び56によって検出された角速度に基づいて判定し、その振り動作中に加速度センサ37によって検出される加速度に基づいて、振りの強さを求めてもよい。そして、入力装置8の振り動作の開始に応じて、ゲームオブジェクトを移動させ、さらに、その移動量や移動速度、移動方向の変化量を加速度に基づいて設定してもよい。
また、本実施形態では、入力装置8のジャイロセンサ55及び56によって検出された角速度が所定の条件(角速度が極大、かつ、所定の閾値より大きい)を満たした場合に、加速度センサ37によって検出された加速度に基づいてボールの移動を開始させた(ボールの投球を行った)。他の実施形態では、入力装置8の角速度が所定の条件を満たした場合に、入力装置8の加速度に基づいて、移動しているオブジェクトを加速又は減速させたり、移動しているオブジェクトの移動方向(軌道)を変化させたりしてもよい。例えば、ゲーム空間上を移動しているオブジェクトに対する減速を、入力装置8に対する所定の振り動作に応じて行う場合、入力装置8に対する所定の振り動作を入力装置8の角速度に基づいて検出し、当該振り動作の検出前後に検出される入力装置8の加速度の大きさに応じて、オブジェクトに対する減速の度合いを決定してもよい。
また、本実施形態では、ロール方向の角速度の積算値とX軸方向の加速度の積算値とに基づいて、カーブ量を計算し、ボールに回転をかけた(ステップS100)。他の実施形態では、所定の1軸方向の角速度と所定の1軸方向の加速度とに基づいて、カーブ量を計算してもよいし、所定の2軸(又は3軸)方向の角速度と所定の2軸(又は3軸)方向の加速度とに基づいて、カーブ量を計算してもよい。
また、本実施形態では、入力装置8の角速度が所定の条件を満たした場合に、角速度の積算値と加速度の積算値に基づいて、カーブ量を計算し、角速度の積算値の符号又は入力装置8の姿勢に基づいて、カーブ方向を計算することにより、ボールに回転をかけた(ステップS84)。すなわち、入力装置8の角速度が所定の条件を満たした場合に、入力装置8の角速度及び加速度に基づいて、オブジェクトの移動方向の変化量を計算し、入力装置8の角速度に基づいて、オブジェクトの移動方向の変化する方向を計算した。他の実施形態では、オブジェクトの移動方向の変化する方向は、入力装置8の加速度に基づいて計算されてもよい。この場合、入力装置8に対する重力方向の加速度を除いた加速度を算出し、算出した加速度に基づいて、オブジェクトの移動方向の変化する方向を計算することが好ましい。さらに、他の実施形態では、入力装置8の角速度が所定の条件を満たした場合に、入力装置8の加速度のみに基づいて、オブジェクトの移動方向の変化量及び変化する方向を計算してもよい。
また、本実施形態では、上記ストレート補正処理において、XY方向の角速度の大きさが所定の閾値より小さい場合(ステップS110)に、プレイヤの振り動作が終了したと判定し、ストレート補正を行った。他の実施形態では、加速度センサ37によって検出された加速度の大きさが所定の範囲である場合に、ストレート補正を行ってもよい。加速度センサ37によって検出される加速度は、重力による加速度とプレイヤの振り動作による加速度とが含まれる。プレイヤが入力装置8を振る場合、検出される加速度の大きさは、プレイヤによる振り動作に応じて、重力よりも大きくなったり、小さくなったりする。従って、検出される加速度の大きさが、重力の大きさと略等しい場合、プレイヤの振り動作が終了したと判定することができる。
また、上記ストレート補正処理を行うタイミングは、入力装置8の振り動作が終了したと考えられる場合(ステップS110でYesと判定された場合)のみならず、どのようなタイミングであってもよい。例えば、自動投球判定後の予め定められた時点を基準にした所定期間において、上述した姿勢に関する第1の条件(ステップS114)及び第2の条件(ステップS115)が満たされている場合に、ストレート成立としてストレート補正(ステップS118)を行ってもよい。
また、本実施形態では、ボウリングゲームを例に説明したが、本発明が適用されるゲームはどのようなものであってもよい。例えば、野球ゲームにおける投球動作やゴルフゲームにおけるショット動作、槍投げ動作(陸上競技の槍投げ)等、様々なゲームに本発明を適用することができる。すなわち、プレイヤが入力装置8を振ることにより、その振り方に応じてゲーム世界におけるオブジェクトが移動制御されるゲームに、本発明は広く適用できる。
また、本実施形態では、加速度センサ37によって3軸方向の加速度を検出し、ジャイロセンサ55及び56によって3軸方向の角速度を検出したが、1軸又は2軸方向の加速度又は角速度を検出することによっても本発明を実現することができる。
また、本実施形態では、コントローラ5とゲーム装置3とが無線通信によって接続された態様を用いたが、コントローラ5とゲーム装置3とがケーブルを介して電気的に接続されてもかまわない。
また、本発明のゲームプログラムは、光ディスク4等の外部記憶媒体を通じてゲーム装置3に供給されるだけでなく、有線又は無線の通信回線を通じてゲーム装置3に供給されてもよい。また、ゲームプログラムは、ゲーム装置3内部の不揮発性記憶装置に予め記録されていてもよい。なお、ゲームプログラムを記憶する情報記憶媒体(コンピュータ読み取り可能な記憶媒体)としては、CD−ROM、DVD、あるいはそれらに類する光学式ディスク状の記憶媒体の他に、不揮発性半導体メモリでもよい。
また、本実施形態においては、ゲーム装置3のCPU10がゲームプログラムを実行することによって、上述したフローチャートによる処理が行われた。他の実施形態においては、上記処理の一部又は全部は、ゲーム装置3が備える専用回路によって行われてもよい。