[ゲームシステムの全体構成]
図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は、それに接続される各構成要素間のデータ転送の制御、表示すべき画像の生成、外部装置からのデータの取得等の処理を行う。システムLSI11の内部構成については後述する。揮発性の外部メインメモリ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が設けられる。一方、図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(図7)を有しており、図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(図7)及びアンテナ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は、加速度データ及び後述する角速度データに基づいて入力装置8(コントローラ5)の姿勢を判断する。入力装置8の姿勢は、例えば、入力装置8が存在する空間の所定位置を基準としたxyz座標系の座標値によって表される。ここでは、図1に示されるように、xyz座標系は、入力装置8がマーカ部6の正面に位置することを前提とし、入力装置8の位置からマーカ部6を向く方向をz軸正方向とし、鉛直上向き(重力方向の逆方向)をy軸正方向とし、入力装置8の位置からマーカ部6を見た場合の左方向をx軸正方向とした座標系であるとする。また、ここでは、入力装置8(コントローラ5)を基準としたX軸、Y軸、Z軸が、それぞれx軸、y軸、z軸の向きと一致するときの入力装置8の姿勢を基準姿勢と呼ぶことにする。入力装置8の姿勢は、基準姿勢からZ軸方向を基準としてロール方向(Z軸周り)、ピッチ方向(X軸周り)、ヨー方向(Y軸周り)にそれぞれ入力装置8を回転させた場合のxyz座標系における姿勢である。当該姿勢は、後述する回転行列Mによって表現される。
加速度センサ37が検出した加速度(加速度ベクトル)を示すデータ(加速度データ)は、通信部36へ出力される。
なお、加速度センサ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〜図13を参照して、上記ゲームシステム1において実行されるバスケットボールゲームの概要について説明する。本実施形態において実行されるバスケットボールゲームでは、仮想ゲーム空間に存在するプレイヤキャラクタがプレイヤによる操作に応じてバスケットボールのシュートを所定回数繰り返し、そのシュートの成否に応じてプレイヤに得点が与えられる。プレイヤは、図8に示されるような振り操作を行うことにより、プレイヤキャラクタにボールをシュートさせることができる。
図9は、ゲーム開始直後にテレビ2の画面に表示されるゲーム画像の一例を示している。当該ゲーム画像は、仮想ゲーム空間を所定の視点(仮想カメラ)から見たシーンを示しており、当該ゲーム画像には、仮想ゲーム空間に配置されたプレイヤキャラクタ、ボール、リング等が表示されている。また、当該ゲーム画像には、プレイヤの得点も表示されている。
テレビ2に図9のようなゲーム画像が表示されているときに、プレイヤが入力装置8を下に向けた状態(すなわち、コントローラ5の前端をコントローラ5の後端よりも低くした状態)でコントローラ5のBボタン32iを押すと、図10に示すように、プレイヤキャラクタがボールを掴む。その後、プレイヤがジャンプ操作を行う(すなわち、入力装置8を上に振り上げる)と、プレイヤキャラクタは、図11に示すようにボールを頭の上に構えた状態で真上にジャンプする。
プレイヤキャラクタがジャンプした後、プレイヤがシュート操作を行う(すなわち、入力装置8を図8に示すように前方に振る)と、図12に示すように、プレイヤキャラクタがリングに向けてボールを投げる。このときのボールの投球方向や初速度は、プレイヤによる入力装置8の振り方(すなわち、入力装置8を振る強さ、入力装置8を振るタイミング、入力装置8を振ったときの入力装置8の姿勢、入力装置8を振るときのプレイヤの手首のひねり具合)に応じて変化する。投球されたボールがリングの中央を通過するようなボールの移動方向、移動速度および到達距離が、それぞれ、ボールの目標移動方向、目標移動速度および目標到達距離となる。入力装置8が理想的な振り方、もしくはそれに近い振り方で振られた場合にはシュートが成功して得点が加点され、そうでない場合にはシュートは失敗に終わり、得点は加算されない。
シュートが終了した後、プレイヤが再び入力装置8の前端を下に向けた状態でコントローラ5のBボタン32iを押すと、プレイヤキャラクタは新たなボールを掴む。そして、上記と同様にして、プレイヤの操作に応じてプレイヤキャラクタは再びシュートを行う。このようにして、プレイヤの操作に応じて、プレイヤキャラクタが仮想ゲーム空間において同一の位置からシュートを5回行う。5回分のシュートが終了すると、プレイヤキャラクタは移動し、別の位置からさらにシュートを5回行う。このように、プレイヤキャラクタは、5本のシュートを1セットとして、各セットが終了するごとに場所を移動し、5セット(すなわち25本のシュート)が終了すると、ゲームの結果(プレイヤが獲得した合計得点)が表示され、ゲームが終了する。
上記のように、本実施形態では、ジャンプ操作およびシュート操作を行う際にプレイヤはコントローラ5上のボタンを操作する必要が無く、入力装置8を把持している腕をあたかも自分がシュートするかのように振ることでプレイヤキャラクタにジャンプおよびシュートさせることができるので、非常に直感的なゲーム操作が可能である。また、特にシュート操作の際にコントローラ5上のボタンの操作を必要としないため、プレイヤは入力装置8を5本の指でしっかりと把持した状態で振ることができる。
[ゲーム処理の詳細]
次に、ゲーム装置3において実行されるゲーム処理の詳細について説明する。まず、ゲーム装置3におけるゲーム処理において用いられる主なデータについて図14を用いて説明する。図14は、ゲーム装置3の外部メインメモリ12(ただし内部メインメモリ11eであってもよい)のメモリマップである。図14に示すように、外部メインメモリ12は、ゲームプログラム格納領域61、操作データ格納領域62、姿勢データ格納領域63、難易度格納領域64、振り強さ格納領域65、ひねり量格納領域66、および得点格納領域67として利用される。
ゲームプログラム格納領域61には、上記のようなバスケットボールゲームを実現するためのゲームプログラムが格納される。このゲームプログラムは、ゲーム装置3に電源が投入された後の適宜のタイミングで光ディスク4からその一部または全部が読み込まれて外部メインメモリ12のゲームプログラム格納領域61に記憶される。なお、他の実施形態では、ゲームプログラムは、光ディスク以外の任意のコンピュータ読み取り可能な記憶媒体(たとえば、ゲームカートリッジや磁気ディスク等)を通じてゲーム装置3に供給されて、外部メインメモリ12に記憶されてもよい。また、さらに他の実施形態では、ゲームプログラムは、ゲーム装置3に内蔵されている不揮発性の記憶装置(例えばフラッシュメモリ17)から読み出されて、外部メインメモリ12に記憶されてもよい。さらに他の実施形態では、ゲームプログラムは、他のコンピュータシステム(ゲーム装置やゲームプログラム配信サーバ装置)から無線または有線の通信回線を通じてゲーム装置3に供給されて、外部メインメモリ12に記憶されてもよい。
操作データ格納領域62には、コントローラ5からゲーム装置3へ送信されてくる操作データが記憶される。上述したように、コントローラ5からゲーム装置3へは200分の1秒の周期で操作データが送信されるので、操作データ格納領域62に記憶される操作データは、200分の1秒の周期で更新される。ここで、本実施形態においては、200分の1秒の周期で送信される各回の操作データを1サンプルとして、外部メインメモリ12には、最新の操作データ(すなわち、ゲーム装置3が最後に取得した操作データ)に加えて、過去に取得した所定数の操作データが記憶される。
操作データには、ボタンデータ、角速度データ、加速度データ、及びマーカ座標データが含まれる。ボタンデータは、コントローラ5上の各ボタンが押されたか否かを示すデータである。角速度データは、ジャイロセンサユニット7のジャイロセンサ55及び56によって検出された角速度を示すデータの集合である。すなわち、角速度データは、図3に示すXYZ座標系における各軸回りの角速度であり、現在及び過去に検出された各軸周りの角速度の集合である。また、加速度データは、現在及び過去に加速度センサ37によって検出された加速度(加速度ベクトル)を示すデータの集合である。マーカ座標データは、撮像情報演算部35の画像処理回路41によって算出される座標、すなわち上記マーカ座標を示すデータである。マーカ座標は、撮像画像に対応する平面上の位置を表すための2次元座標系で表現される。
姿勢データ格納領域63には、姿勢データが記憶される。姿勢データは、入力装置8(コントローラ5)の姿勢に関するデータの集合であって、回転行列データ、ロール成分回転データ、ピッチ成分回転データ、ヨー成分回転データ、ピッチ姿勢データ、及びヨー姿勢データを含む。
回転行列データは、基準姿勢(上述したXYZ軸がxyz軸と一致する場合の姿勢)から現在の入力装置8(コントローラ5)の姿勢への回転を表すデータであり、当該回転は、回転行列Mで表される。また、回転行列Mは、入力装置8のXYZ軸方向を示すそれぞれの単位ベクトルをxyz座標系で表して並べたものでもある。回転行列データは、操作データと同様、最新の回転行列Mに加えて、所定サンプルの回転行列Mを示すデータの集合である。回転行列Mは、以下の式(1)に示す3×3の行列で表現される。
ロール成分回転データは、Z軸周りの入力装置8の回転を表すデータであり、ロール成分回転行列Mrで表される。ピッチ成分回転データは、X軸周りの入力装置8の回転を表すデータであり、ピッチ成分回転行列Mpで表される。さらに、ヨー成分回転データは、Y軸周りの入力装置8の回転を表すデータであり、ヨー成分回転行列Myで表される。ロール成分回転行列Mr、ピッチ成分回転行列Mp、及びヨー成分回転行列Myは、それぞれ以下の式(2)〜式(4)に示す3×3の行列で表現される。
ここで、ロール方向(Z軸周り)、ピッチ方向(X軸周り)、ヨー方向(Y軸周り)の回転角をそれぞれθr、θp、θyとした。角度θr、θp、θyは、角速度データに基づいて求められる。すなわち、角度θrは、基準姿勢からのZ軸周りの回転角であり、当該回転角は、上述したように、Z軸周りの角速度の積分を算出することにより求められる。角度θp及びθyも同様に、それぞれX軸周り、Y軸周りの角速度の積分を算出することにより、求められる。なお、ジャイロセンサの出力には一般的にドリフト等による誤差が含まれる可能性があるので、角速度を積分するだけでなく、加速度データに基づいて姿勢を補正することができる。具体的には、入力装置8が静止しているときや、等速運動をしているときは、加速度データが示す加速度が重力であるので、その方向から入力装置8の姿勢を算出し、角速度によって算出された姿勢を加速度から算出された姿勢に近づける補正を行う。その際、加速度の大きさが重力の大きさに近いほど補正の度合いを高くするようにすれば、動いている場合等、加速度から姿勢を算出できない場合の姿勢をあまり反映させないようにすることができる。さらに、マーカ座標データに基づいて補正を行うことも可能である。すなわち、2つのマーカ座標を結ぶ方向によって、入力装置のロール方向の姿勢を算出することが可能であるし、マーカ座標の位置をヨーおよび/またはピッチ方向の姿勢に関連付けることも可能であるので、角速度によって算出された姿勢や加速度によって補正された姿勢を、マーカ座標に基づいて算出された姿勢に所定割合で近づけることで補正を行うことが可能である。
上記回転行列Mは、Z軸を基準としたロール方向、ピッチ方向、ヨー方向の回転を表す回転行列の積である。すなわち、回転行列Mは、上記式(2)〜式(4)で表される各成分の回転行列の積である。本実施形態では、角速度データが更新されるタイミング(200分の1秒の周期)で、回転行列M(回転行列データ)が算出され、外部メインメモリ12に保存されるものとする。
ピッチ姿勢データは、入力装置8のxyz座標系におけるピッチ方向の姿勢を示すデータの集合であり、当該ピッチ方向の姿勢は、上記回転行列Mにより求められる。ここで、xyz座標系におけるピッチ方向の姿勢とは、物体座標系(XYZ座標系)で入力装置8を回転させた後の空間固定座標系(xyz座標系)から見たx軸周りの回転を表す姿勢である。
ヨー姿勢データは、入力装置8のxyz座標系におけるヨー方向の姿勢を示すデータの集合であり、当該ヨー方向の姿勢は、上記回転行列Mにより求められる。ここで、xyz座標系におけるヨー方向の姿勢とは、物体座標系(XYZ座標系)で入力装置8を回転させた後の空間固定座標系(xyz座標系)から見たy軸周りの回転を表す姿勢である。
難易度格納領域64には、ゲームの難易度を示す値が記憶される。本実施形態では、難易度の値は0〜25の範囲の実数値を取り得るものとする。
振り強さ格納領域65には、最新の振り強さP0と、1サンプル前の振り強さP1と、2サンプル前の振り強さP2が記憶される。最新の振り強さP0は、最新の角速度データに基づいて計算された振り強さPである。1サンプル前の振り強さP1は、1サンプル前の角速度データ(すなわち、最新の角速度データの1つ前に取得された角速度データ)に基づいて計算された振り強さPである。同様に、2サンプル前の振り強さP2とは、2サンプル前の角速度データ(すなわち、最新の角速度データの2つ前に取得された角速度データ)に基づいて計算された振り強さPである。振り強さPの計算方法については後述する。
ひねり量格納領域66には、1投目のひねり量R1、2投目のひねり量R2、3投目のひねり量R3、および4投目のひねり量R4が記憶される。1投目のひねり量R1は、上記バスケットボールゲームにおいてプレイヤキャラクタが放つ全25本のシュートの内、最初のシュートを打つ際に角速度データに基づいて計算されたひねり量Rである。2投目のひねり量R2は、上記バスケットボールゲームにおいてプレイヤキャラクタが放つ全25本のシュートの内、2投目のシュートを打つ際に角速度データに基づいて計算されたひねり量Rである。同様に、3投目のひねり量R3は、3投目のシュートを打つ際に角速度データに基づいて計算されたひねり量Rであり、4投目のひねり量R4は、4投目のシュートを打つ際に角速度データに基づいて計算されたひねり量Rである。ひねり量Rの計算方法については後述する。
得点格納領域67には、プレイヤが獲得した得点を示す値が記憶される。
なお、外部メインメモリ12には、上記のようなゲームプログラムおよび各種データの他にも、ゲームに登場する各種オブジェクト(プレイヤキャラクタ、ボール等)の画像データや、オブジェクトの各種パラメータを示すデータ等、ゲーム処理に必要なデータが記憶される。
なお、上記のようなゲームプログラムおよび各種データは、外部メインメモリ12ではなく、内部メインメモリ11eに記憶されてもよい。
また、上述したような各種データの全てが外部メインメモリ12に記憶されている必要はなく、少なくともゲーム処理において必要となるデータさえ外部メインメモリ12に記憶されていればよい。例えば、ゲーム処理においてヨー姿勢データを利用しない場合には、外部メインメモリ12にヨー姿勢データを記憶しないようにしてもよい。
次に、図15〜図16のフローチャートを参照して、前述のゲームプログラムに基いてゲーム装置3のCPU10によって実行されるゲーム処理の流れを説明する。
ゲーム装置3の電源が投入されると、ゲーム装置3のCPU10は、図示しないブートROMに記憶されている起動プログラムを実行し、これによって外部メインメモリ12等の各ユニットが初期化される。そして、光ディスク4に記憶されたゲームプログラムが外部メインメモリ12に読み込まれ、CPU10によって当該ゲームプログラム61の実行が開始される。図15に示すフローチャートは、以上の処理が完了した後に行われる処理を示すフローチャートである。なお、図15および図16のフローチャートでは、説明を簡単にするために、コントローラ5から操作データを周期的に取得して外部メインメモリ12に格納する処理や、当該取得した操作データに基づいて入力装置8の姿勢を表す回転行列等を算出して外部メインメモリ12に格納する処理は省略している。また、図15および図16のフローチャートでは、当業者にとって周知の技術であるプレイヤキャラクタのモーション制御処理やゲーム画像生成処理についても省略している。
ステップS10において、CPU10は、初期化処理を行う。この初期化処理には、外部メインメモリ12に記憶されている各種データを初期値にセットする処理等が含まれる。例えば、難易度は初期値「1」にセットされ、得点は初期値「0」にセットされる。
ステップS11において、CPU10は、コントローラ5の姿勢が下向き(すなわち、コントローラ5の前端がコントローラ5の後端よりも低い状態)か否かを判断する。この判断は、例えば、回転行列MのZy成分が負である場合には、コントローラ5のZ軸がxyz空間内の下方向を向いていることになるので、コントローラ5の姿勢が下向きと判定することができる。また、外部メインメモリ12に格納されているピッチ姿勢データに基づいて行うこともできる。ステップS11において、コントローラ5の姿勢が下向きであると判断された場合には、処理はステップS12に進み、そうでない場合には、コントローラ5の姿勢が下向きであると判断されるまでステップS11を繰り返す。
ステップS12において、CPU10は、コントローラ5のBボタン32iがプレイヤによって押されたか否かを操作データ格納領域62のボタンデータに基づいて判断する。そして、Bボタン32iが押されたと判断された場合には処理はステップS13に進み、そうでない場合には、処理はステップS11に戻る。
ステップS13において、CPU10は、仮想ゲーム空間においてプレイヤキャラクタがボールを掴むように、プレイヤキャラクタのモーションを制御する。
ステップS14において、CPU10は、プレイヤによるジャンプ操作が行われたかどうかを判断する。本実施形態では、プレイヤが入力装置8を上に振り上げたかどうかを、現在のZ軸方向の加速度と、現在のX軸周りの角速度と、現在のY軸周りの角速度と、現在の入力装置8のxyz座標系におけるピッチ方向の姿勢とから総合的に判断し、プレイヤが入力装置8を頭上に振り上げたと判断される場合に、ジャンプ操作が行われたと判断する。そして、ジャンプ操作が行われたと判断された場合には処理はステップS15に進み、そうでない場合には、ジャンプ開始条件を満たしたと判断されるまでステップS14を繰り返す。
ステップS15において、CPU10は、仮想ゲーム空間においてプレイヤキャラクタがジャンプを開始するように、プレイヤキャラクタのモーションを制御する。
ステップS16において、CPU10は、シュート処理を行う。このシュート処理は、プレイヤキャラクタにボールをシュートさせるための処理である。シュート処理の詳細については図16のフローチャートを参照して後述する。ステップS16のシュート処理が終了すると、処理はステップS17に進む。
ステップS17において、CPU10は、規定回数(本実施形態では25回)のシュートが終了したかどうかを判断する。そして、規定回数のシュートが終了した場合には処理はステップS18に進み、そうでない場合には処理はステップS11に戻る。
ステップS18において、CPU10は、プレイヤが獲得した得点等を示す結果画像を生成して、テレビ2の画面に表示し、ゲーム処理を終了する。
次に、図16のフローチャートを参照して、図15のステップS16のシュート処理について詳細に説明する。
シュート処理が開始されると、ステップS20において、CPU10は、最新の角速度データに基づいて振り強さPを計算し、その値を外部メインメモリ12に「最新の振り強さP0」として格納する。このとき、ステップS20の直前まで「最新の振り強さP0」として外部メインメモリ12に記憶されていた値については、「1サンプル前の振り強さP1」として外部メインメモリ12に記憶され、同様に、ステップS20の直前まで「1サンプル前の振り強さP1」として外部メインメモリ12に記憶されていた値については、「2サンプル前の振り強さP2」として外部メインメモリ12に記憶される。
振り強さPとは、プレイヤが入力装置8を振る強さを示す指標であって、本実施形態では、一例として、X軸周りの角速度とY軸周りの角速度に基づいて計算される。具体的には、X軸周りの角速度をRxとし、Y軸周りの角速度をRyとすると、振り強さPは、√(Rx^2+Ry^2)として計算される。このようにして計算される振り強さPは、入力装置8を回転させたときの角速度のX軸周り及び/又はY軸周りの大きさを表している。プレイヤが、バスケットボールにおけるシュート動作のように、入力装置8を把持している腕を図17に示す位置Aから位置Bおよび位置Cを経て位置Dまで振った場合、その過程において、振り強さPの値は図18に示した曲線のように変化する。なお、図18の例では、プレイヤの腕が位置Bにあるときに振り強さPが極大となっているが、振り強さPの極大点は、プレイヤによる入力装置8の振り方によって変化する。なお、図17では、プレイヤは、入力装置8を振ったときに入力装置8がX軸周りに回転するような持ち方で入力装置8を把持しているが、本実施形態では上記のように、X軸周りの角速度とY軸周りの角速度の両方を加味して振り強さPが計算されるので、プレイヤがどのような持ち方で入力装置8を把持していても、プレイヤが入力装置8を振る強さを振り強さPとして適切に検出することができる。
ステップS21において、CPU10は、振り強さPの極大値が投球閾値以上かどうかを判断する。本実施形態では、振り強さPが極大点に達したかどうかは、外部メインメモリ12に記憶されている「最新の振り強さP0」、「1サンプル前の振り強さP1」、および「2サンプル前の振り強さP2」に基づいて判断される。具体的には、「1サンプル前の振り強さP1」の値が「2サンプル前の振り強さP2」の値よりも大きく、なおかつ「最新の振り強さP0」の値が「1サンプル前の振り強さP1」の値以下である場合に、振り強さPが極大点に達したと判断し、そのときの「1サンプル前の振り強さP1」の値が極大値として求まる(ただし、極大値を厳密に求める必要が無い場合には、そのときの「最新の振り強さP0」の値を極大値として扱ってもよい)。例えば、振り強さPが図19に示すように変化した場合、図19の点P1の大きさが、振り強さPの極大値として求まる。なお、振り強さPが極大点に達したかどうかを判断するだけでは、プレイヤがシュート操作を行ったかどうかを正確に判断することはできない。なぜなら、プレイヤが入力装置8を振っていない状態でも振り強さPの値は常時わずかに変動し、そのような場合であっても小さい値で極大点ができるからである。そこで本実施形態では、振り強さPの極大値が所定の投球閾値(図18参照)以上である場合に、プレイヤによるシュート操作が行われたと判断する。なお、振り強さPの極大値が所定の投球閾値“よりも大きい”場合に、プレイヤによるシュート操作が行われたと判断しても、実質的に同じ判断が可能である。ステップS21において、振り強さPの極大値が投球閾値以上であると判断された場合には処理はステップS22に進み、そうでない場合には処理はステップS20に戻る。なお、以下の説明では、振り強さPが投球閾値以上であって且つ極大となった時点(ただし、ここで言う「時点」とは、振り強さPが極大となった“瞬間”を厳密に指すものではない)のことを、単に「投球時」と呼ぶことがある。
ステップS22において、CPU10は、投球時のコントローラ5の姿勢に基づいて、仮想ゲーム空間におけるボールの投球方向の仰角θを決定する。仮想ゲーム空間におけるボールの投球方向とは、図20に示すように、プレイヤキャラクタがボールをシュートするときのボールの射出方向のことである。投球方向の仰角θは、投球方向と仮想ゲーム空間における水平面とがなす角度を表している。
本実施形態では、投球時のコントローラ5のピッチ方向の姿勢に基づいて、投球方向の仰角θを決定する。コントローラ5のピッチ方向の姿勢は、外部メインメモリ12に記憶されているピッチ姿勢データにより表される。CPU10は、例えば図21に示すように、コントローラ5のピッチ方向の姿勢と投球方向の仰角θとの対応関係を定義した関数またはテーブルを用いて、仰角θを決定する。なお、図21の例では、コントローラ5のピッチ方向の姿勢と仰角θとの対応関係が直線(すなわち一次関数)で示されているが、任意の曲線であっても構わない。これは、後述する他の図面(すなわち図22〜図26、図30)についても同様である。本実施形態では、例えばプレイヤが図17に示すように腕を振る場合、振り強さPが極大点に到達するタイミングが早くなるほど仰角θはより大きくなり、振り強さPが極大点に到達するタイミングが遅くなるほど仰角θはより小さくなる。なお、仰角θが大きすぎたり小さすぎたりすると、仮想ゲーム空間においてボールがリングに到達しない。具体的には、仰角θが、図21に示す成功下限仰角θ1よりも小さい場合や、成功上限仰角θ2よりも大きい場合には、ボールがリングに到達不可能となる。したがって、シュートを成功させるためには、投球時のコントローラ5のピッチ方向の姿勢が、図21に示す成功範囲に収まっている必要がある。すなわち、シュートを成功させるためには、プレイヤは、投球時のコントローラ5のピッチ方向の姿勢が、図21に示す成功範囲内にある間に、振り強さPを極大点に到達させる必要がある。
ステップS23において、CPU10は、ステップS22において決定された仰角θに基づいて、成功下限初速度V1および成功上限初速度V2を計算する。成功下限初速度V1とは、プレイヤキャラクタが、リングに向かってステップS22において決定された仰角θの方向にボールを投球したと仮定(なお、左右方向に関してはリングに向かって真っ直ぐに投球したと仮定)したときに、シュートが成功するためのボールの初速度Vの下限値である。言い換えると、ボールの初速度Vが成功下限初速度V1を下回っている場合には、ボールはリングに到達せず、シュートは失敗する。また、成功上限初速度V2とは、プレイヤキャラクタが、リングに向かってステップS22において決定された仰角θの方向にボールを投球したときに、シュートが成功するためのボールの初速度Vの上限値である。言い換えると、ボールの初速度Vが成功上限初速度V2を上回っている場合には、ボールはリングを越えてしまい、シュートは失敗する。
ステップS24において、CPU10は、振り強さPの極大値(すなわち、投球時の振り強さP)に基づいて、ボールの初速度Vを決定する。CPU10は、例えば図22に示すように、振り強さPの極大値とボールの初速度Vとの対応関係を定義した関数またはテーブルを用いて、初速度Vを決定する。本実施形態では、図22に示すように、振り強さPの極大値に一定の成功範囲が定められており、振り強さPの極大値が当該成功範囲の下限(成功下限極大値)に一致する場合には、ボールの初速度Vは、成功下限初速度V1と同じ値となり、振り強さPの極大値が当該成功範囲の上限(成功上限極大値)に一致する場合には、ボールの初速度Vは、成功上限初速度V2と同じ値となる。振り強さPの極大値が成功下限極大値を下回る場合には、ボールの初速度Vは成功下限初速度V1よりも小さくなり、ボールはリングに到達せず、シュートは失敗する。同様に、振り強さPの極大値が成功範囲の上限を上回る場合には、ボールの初速度Vは成功上限初速度V2よりも大きくなり、ボールはリングを越えてしまい、シュートは失敗する。また、振り強さPの極大値が予め定められた成功範囲に収まっている場合には、ボールの初速度Vは、成功下限初速度V1から成功上限初速度V2までの範囲内の値に決定される。
ステップS25において、CPU10は、投球時のZ軸周りの角速度に基づいて、ひねり量Rを計算する。本実施形態では、CPU10は、外部メインメモリ12に記憶されている角速度データから、直近の数サンプル分のZ軸周りの角速度の平均値を、ひねり量Rとして計算する。なお、他の実施形態では、最新のZ軸周りの角速度を、ひねり量Rとして利用してもよい。
ステップS26において、CPU10は、今回のシュートが、バスケットボールゲームが開始されてから5投目以降かどうかを判断し、今回のシュートが5投目以降である場合には処理はステップS27に進み、そうでない場合(すなわち、今回のシュートが1投目〜4投目のいずれかである場合)には処理はステップS28に進む。
ステップS27において、CPU10は、外部メインメモリ12に記憶されている「1投目のひねり量R1」〜「4投目のひねり量R4」に基づいて、今回のひねり量R(すなわち、直前のステップS25で計算したひねり量R)を補正する。ステップS27におけるひねり量Rの補正方法については後述する。
ステップS28において、CPU10は、今回のひねり量R(すなわち、直前のステップS25で計算したひねり量R)の値を、「1投目のひねり量R1」〜「4投目のひねり量R4」のいずれかとして、外部メインメモリ12に記憶する。例えば、今回のシュートが1投目である場合には、今回のひねり量Rを「1投目のひねり量R1」として記憶する。同様に、今回のシュートが2投目である場合には、今回のひねり量Rを「2投目のひねり量R1」として記憶する。
ステップS29において、CPU10は、外部メインメモリ12に記憶されている「難易度」の値に基づいて、成功下限ひねり量Rminおよび成功上限ひねり量Rmaxを決定する。成功下限ひねり量Rminおよび成功上限ひねり量Rmaxは、シュートを成功させるためのひねり量Rの成功範囲の下限および上限をそれぞれ示す変数であり、それらの値は難易度に応じて可変である。本実施形態では、成功下限ひねり量Rminは負の値であり、成功上限ひねり量Rmaxは正の値である。CPU10は、例えば図23に示すように、難易度と成功下限ひねり量Rminとの対応関係を定義した関数またはテーブルを用いて、成功下限ひねり量Rminを決定する。また、CPU10は、例えば図24に示すように、難易度と成功上限ひねり量Rmaxとの対応関係を定義した関数またはテーブルを用いて、成功上限ひねり量Rmaxを決定する。その結果、本実施形態では、難易度がより高くなるほど、ひねり量Rの成功範囲がより狭くなる。
ステップS30において、CPU10は、ステップS27において補正された後のひねり量R(ただし、今回のシュートが1投目〜4投目である場合には、ステップS25において計算されたひねり量R)に基づいて、仮想ゲーム空間におけるボールの投球方向の方位角φを決定する。図20に示すように、投球方向の方位角φは、仮想ゲーム空間においてプレイヤキャラクタから見たリングの方向を表す水平ベクトルを前方ベクトルとしたときに、当該前方ベクトルと水平面に投影した投球方向とがなす角度を表している。
CPU10は、例えば図25に示すように、ひねり量Rと投球方向の方位角φとの対応関係を定義した関数またはテーブルを用いて、方位角φを決定する。本実施形態では、ひねり量Rの目標値は「0」であり、ひねり量Rが「0」のときに方位角φは「0」となる。すなわち、投球時にコントローラ5がZ軸周りに全く回転していなければ、ボールはリングの中心から左右方向にずれることなく、リングの中心に向かって真っ直ぐに放たれる。一方、投球時にコントローラ5がZ軸周りに回転していれば、その角速度に応じて方位角φの絶対値が大きくなり、ボールがリングの中心から左右方向にずれた方向に放たれる。なお、方位角φが大きすぎたり小さすぎたりすると、仮想ゲーム空間においてボールの軌道がリングから外れる。具体的には、方位角φが図25に示す成功下限方位角φ1よりも小さい場合には、ボールの軌道がリングの左側に外れ、方位角φが図25に示す成功上限方位角φ2よりも大きい場合には、ボールの軌道がリングの右側に外れる。したがって、シュートを成功させるためには、ひねり量Rが図25に示す成功範囲(すなわち目標範囲)に収まっている必要がある。
なお、ひねり量Rの成功範囲の下限(すなわち、成功下限ひねり量Rmin)および上限(すなわち、成功上限ひねり量Rmax)は、ステップS29において難易度に基づいて決定されたものである。したがって、現在の難易度に応じて、ひねり量Rの成功範囲は変化する。図25は、難易度が「5」であるときのひねり量Rと方位角φの関係を示しており、図26は、難易度が「20」であるときのひねり量Rと方位角φの関係を示している。図25および図26から明らかなように、難易度が高いほど、ひねり量Rの成功範囲が狭くなる。すなわち、難易度が高いほど、シュートを成功させるためにより高精度のシュート操作がプレイヤに要求されることになる。逆に、難易度が低いほど、ひねり量Rの成功範囲が広がるので、同じフォームでシュート操作を行ったとしても、難易度が低いほどボールの軌道がリングの中央に大きく近づくように投球方向の方位角φが補正される。
ステップS31において、CPU10は、仮想ゲーム空間においてプレイヤキャラクタがシュートするように、プレイヤキャラクタのモーションを制御する。そして、CPU10は、ステップS22で決定された投球方向の仰角θ、ステップS24で決定された初速度V、およびステップS30で決定された投球方向の方位角φに基づいて、ボールの移動制御を行う。
ステップS32において、CPU10は、シュートの成否に応じて、外部メインメモリ12に記憶されている難易度と得点を更新する。具体的には、投球時のコントローラ5のピッチ方向の姿勢が図21に示す成功範囲に収まっており、かつ振り強さPの極大値が図22に示す成功範囲に収まっており、かつ投球時のひねり量Rが図25に示す成功範囲に収まっている場合(この場合、プレイヤキャラクタが放ったボールは結果的にリングを通過する)には、CPU10はシュートが成功したと判断し、そうでない場合には、CPU10はシュートが失敗したと判断する。
上記のステップS32において、難易度は基本的に、シュートが成功したときには増加され、シュートが失敗したときには減少される。ただし、難易度の更新方法としては種々のバリエーションが考えられる。以下、ステップS32における難易度の更新方法のバリエーションを説明する。
図27は、シュートが成功した場合には現在の難易度に所定値(図27の例では「1」)を加算し、シュートが成功した場合には現在の難易度から所定値(図27の例では「1」)を減算する例である。このようにすることで、プレイヤの熟練度に応じて難易度が適応的に設定されるので、プレイヤにとって、ゲームが易しすぎたり難しすぎたりすることがなくなる。
図28は、シュートが成功した場合には現在の難易度に所定値(図28の例では「1」)を加算し、シュートが失敗した場合には難易度を初期値(図28の例では「1」)にリセットする例である。このようにすることで、シュートに失敗したときに難易度が初期値に戻るので、シュートが連続して失敗する可能性が低くなり、プレイヤにとって快適なゲームプレイが可能となる。
図29は、シュートが成功した場合には現在の難易度に所定値(図27の例では「1」)を加算し、シュートが成功した場合には現在の難易度から所定値(図27の例では「1」)を減算するとともに、シュートの成否に関わらず、1セット(図29の例では5本分のシュート)が終了する毎に難易度を初期値(図28の例では「1」)にリセットする例である。通常、プレイヤが前回のシュート操作から時間間隔をあまり空けずに次のシュート操作を行う場合には比較的高精度のシュート操作が可能であるが、前回のシュート操作から或る程度の時間間隔をおいてから次のシュート操作を行う場合にはシュート操作の精度が落ちる傾向にある。そこで、図29の例のように、1セットが終了する毎に難易度を初期値にリセットすることで、例えば各セット間のプレイヤキャラクタの移動演出などによって各セット間の時間間隔が大きく空く場合でも、各セットにおける最初のシュートが外れる可能性が低くなり、プレイヤにとって快適なゲームプレイが可能となる。
なお、本実施形態では、上記のようにシュートの成否に応じて難易度を更新しているが、シュートの成否だけでなく、さらに他の条件も加味して難易度を決定するようにしてもよい。例えば、プレイヤが所望の位置にプレイヤキャラクタを移動させてシュートを行わせることができるようなバスケットボールゲームにおいて、上記のようにシュートの成否に応じて更新される難易度を「基本難易度」として外部メインメモリ12に記憶しておき、ステップS29において成功上限ひねり度Rmaxおよび成功下限ひねり度Rminを決定する際には、基本難易度に対して、プレイヤキャラクタとリングの間の距離に応じた難易度オフセットを加算したものを用いて、成功上限ひねり度Rmaxおよび成功下限ひねり度Rminを決定するようにしてもよい。この場合、CPU10は、例えば図30のような関数またはテーブルを用いて難易度オフセットを決定することができる。
上記のステップS32が終了すると、シュート処理は終了する。
次に、図16のステップS27におけるひねり量Rの補正方法について説明する。
本実施形態では、1投目〜4投目のシュートを行った際のひねり量Rを、外部メインメモリ12にそれぞれ「1投目のひねり量R1」〜「4投目のひねり量R4」として記憶しておき、5投目以降のシュート処理時には、これらの「1投目のひねり量R1」〜「4投目のひねり量R4」を利用して、今回のひねり量R(すなわち、直前のステップS25において計算されたひねり量R)を補正する。より具体的には、「1投目のひねり量R1」〜「4投目のひねり量R4」の平均値を算出し、当該算出された平均値を今回のひねり量Rから減算する。
なお、本実施形態では、ゲームにおいて要求されるひねり量Rの目標値は「0」であるため、ひねり量Rは、投球時のZ軸回りの角速度と目標角速度との間のずれを表している。したがって、「1投目のひねり量R1」〜「4投目のひねり量R4」の平均値は、1投目〜4投目のシュートにおいて、投球時のZ軸回りの角速度が目標角速度から平均してどれだけずれていたかを表している。つまり、「1投目のひねり量R1」〜「4投目のひねり量R4」の平均値を計算することによって、シュート操作時のプレイヤの癖を知ることができる(すなわち、投球時のZ軸回りの角速度が目標角速度からどれだけずれる傾向にあるかを知ることができる)。すなわち、本実施形態では、シュート操作に応じて検出されるひねり量Rがゲームにおいて要求されるひねり量Rの目標値(本実施形態では「0」)に対してどのようにずれる傾向にあるかを示す指標(以下、ずれ傾向値と呼ぶ)として、「1投目のひねり量R1」〜「4投目のひねり量R4」の平均値を利用している。ただし、ずれ傾向値の計算方法は、これに限定されない。
上記のようにずれ傾向値に基づいてひねり量Rを補正することで、5投目以降のシュートの際に、プレイヤ毎に固有のシュート操作の癖(すなわち、シュート操作を行う際の腕や手首の動きの癖)を相殺することができる。従来のボタンスイッチの操作などでは、プレイヤ毎に固有の癖が問題になることは無いが、本実施形態のように入力装置8の角速度を利用するゲームでは、プレイヤの腕や手首の動きの癖が大きく影響するため、プレイヤ毎に有利不利が生じてしまう。たとえば、安定した投球動作を繰り返すことができるプレイヤであっても、投球の検出タイミング付近において必ずひねりが発生するような癖を持っているだけで、シュートを成功させることが困難になってしまう。そこで、本実施形態では、1投目〜4投目のシュート操作の際のひねり量Rからプレイヤの癖(すなわち、シュート操作を行ったときのひねり量Rの傾向)を検出し、5投目以降のシュート操作の際には、当該検出したプレイヤの癖を相殺するようにひねり量Rを補正する。これにより、プレイヤに固有の癖が原因で1投目〜4投目のシュートが失敗したとしても、プレイヤが常に一定のフォームでシュート操作を行ってさえいれば、5投目以降のボールの投球方向の方位角φは目標値である「0」になり、シュートが成功することになる。
なお、本実施形態では、バスケットボールゲームにおいて全25本のシュートを行う際に、1投目〜4投目のシュート操作に基づいてプレイヤの癖(すなわちずれ傾向値)を検出しているが、いずれの投球回のシュート操作に基づいてプレイヤの癖を検出するかは任意である。例えば、1投目のシュートから前回のシュートまでのシュート操作に基づいてプレイヤの癖を検出するようにしてもよい。
また、本実施形態では、5投目以降のシュートの際に、ひねり量Rを補正しているが、5投目よりも前のシュート(例えば3投目のシュート)の際にも、それ以前の投球回のシュート操作(例えば1投目および2投目のシュート操作)に基づいてプレイヤの癖を検出して、ひねり量Rを補正するようにしてもよい。
また、本実施形態では、「1投目のひねり量R1」〜「4投目のひねり量R4」の平均値を算出し、今回のひねり量Rから当該算出された平均値を減算しているが、単純な平均値の代わりに、加重平均値や、最頻値や、中央値など、用途に応じて任意の代表値を利用してもよい。平均を算出する回数は5回に限らず、他の回数であってもよいし、常に最新の所定回数の平均を用いるようにしてもよい。
また、本実施形態では、ひねり量Rに関してのみプレイヤの癖を相殺するように補正を行っているが、角速度データに基づいて決定される任意のパラメータに関して、プレイヤの癖を相殺するように補正を行ってもよい。例えば、1投目〜4投目のシュートの際に検出された「振り強さPの極大値」に基づいて、振り強さPの極大値が理想値(例えば、図22の成功範囲の中央値)に対してどのようにずれる傾向にあるかを示すずれ傾向値を計算し、5投目以降のシュートの際に当該ずれ傾向値を用いて「振り強さPの極大値」を補正するようにしてもよい。ステップS22で用いられる「投球時のコントローラのピッチ方向の姿勢」についても同様である。
以上のように、本実施形態によれば、プレイヤが入力装置8を振ってシュート操作を行ったときのボールの投球方向の方位角φの成功範囲を、難易度に応じて変更することができるので、ゲームが単調になりすぎることがない。なお、本実施形態では難易度に応じて方位角φの成功範囲を変化させているが、他の実施形態では、難易度に応じて仰角θの成功範囲または初速度Vの成功範囲を変化させてもよい。
また、本実施形態によれば、シュートの成否に応じて難易度を変化させることができるので、プレイヤにとってゲームが簡単すぎたり難しすぎたりすることがない。なお、本実施形態ではシュートの成否に応じて難易度を変化させているが、他の実施形態では、角速度を利用した任意のゲーム操作の成否に応じて難易度を変化させてもよい。
また、本実施形態によれば、プレイヤがバスケットボールゲームをプレイしている最中にプレイヤのシュート操作の癖を学習して、入力装置8のZ軸回りの角速度を補正するので、プレイヤ毎に固有の癖を相殺することができる。なお、本実施形態では入力装置8のZ軸回りの角速度を補正しているが、他の実施形態では、入力装置8のX軸回りの角速度またはY軸回りの角速度を補正してもよい。
なお、本実施形態ではゲーム装置3においてバスケットボールゲームを実行する場合について説明したが、本発明はバスケットボール以外のゲームにも適用できることは言うまでもない。
例えば、プレイヤが入力装置8を振ることによって、仮想ゲーム空間におけるプレイヤキャラクタがゴルフクラブをスイングしてゴルフボールを飛ばすようなゴルフゲームにおいて、ゴルフボールがフェアウェイで止まったかラフで止まったかによって、各回のスイングの成否を判定し、その判定結果に応じて次回のスイング操作の難易度(すなわちプレイヤによるスイング操作の際に要求される入力装置8の角速度の成功範囲)を変更するようにしてもよい。
また例えば、上記のようなゴルフゲームにおいて、全18ホールのゴルフコースを回るときに、例えば第1ホールにおけるプレイヤのスイング操作に基づいてプレイヤのスイング操作の癖を学習し、第2ホール以降におけるプレイヤのスイング操作の際に、当該プレイヤの癖が相殺されるように、プレイヤによるスイング操作の際に検出される入力装置8の角速度を補正するようにしてもよい。
なお、本実施形態のバスケットボールゲームは、一人のプレイヤによってプレイされるものであったが、他の実施形態では、複数のプレイヤが対戦プレイするゲームにおいて、プレイヤ毎に難易度を個別に設定および更新するものであってもよい。例えば、第1プレイヤおよび第2プレイヤの2人のプレイヤが、バスケットボールゲームにおいて互いに異なるチームを操作して対戦プレイを行う場合、第1プレイヤによるシュート操作の成否に応じて第1プレイヤ用の難易度を更新し、第2プレイヤによるシュート操作の成否に応じて第2プレイヤ用の難易度を更新してもよい。これにより、熟練度の異なるプレイヤ同士で対戦プレイする場合でも、プレイヤ毎に、各の熟練度に応じた適切な難易度が設定されるため、一方的なゲーム展開になることを効果的に回避することができる。
なお、本実施形態では、振り強さPが極大となり、かつその値が投球閾値より大きい場合に、プレイヤキャラクタにシュートを行わせているが、プレイヤキャラクタにシュートを行わせるタイミングはこれに限定されない。
また、本実施形態では、難易度の初期値を「1」としているが、難易度の初期値は他の値(例えば「5」)であってもよい。
また、本実施形態では、プレイヤによるシュート操作に基づいて、ボールの初速度および投球方向を決定しているが、本発明はこれに限定されず、ボール以外の任意のオブジェクトを、プレイヤによって操作される入力装置(コントローラ)の所定軸回りの角速度に基づいて移動制御しても構わない。
また、本実施形態では、ジャイロセンサ55及び56によって3軸方向の角速度を検出したが、1軸又は2軸方向の角速度を検出することによっても本発明を実現することができる。
また、本実施形態では、入力装置8とゲーム装置3とが無線通信によって接続された態様を用いたが、入力装置8とゲーム装置3とがケーブルを介して電気的に接続されてもかまわない。
また、本実施形態においては、ゲーム装置3のCPU10がゲームプログラムを実行することによって、上述したフローチャートによる処理が行われたが、他の実施形態においては、上記処理の一部又は全部は、ゲーム装置3が備える専用回路によって行われてもよい。