図1を参照して、本発明の一実施形態に係るゲーム装置について説明する。以下、説明を具体的にするために、当該ゲーム装置を用いたゲームシステム1を一例として説明する。なお、図1は、当該ゲームシステム1を説明するための外観図である。以下、据置型ゲーム装置を一例にして、当該ゲームシステム1について説明する。
図1において、当該ゲームシステム1は、家庭用テレビジョン受像機等のスピーカ2aを備えたディスプレイ(以下、モニタと記載する)2に、接続コードを介して接続される据置型ゲーム装置(以下、単にゲーム装置と記載する)3および当該ゲーム装置3に操作情報を与えるコントローラ7によって構成される。ゲーム装置3は、接続端子を介して受信ユニット6が接続される。受信ユニット6は、コントローラ7から無線送信される送信データを受信し、コントローラ7とゲーム装置3とは無線通信によって接続される。また、ゲーム装置3には、当該ゲーム装置3に対して交換可能に用いられる情報記憶媒体の一例の光ディスク4が脱着される。ゲーム装置3の上部主面には、当該ゲーム装置3の電源ON/OFFスイッチ、ゲーム処理のリセットスイッチ、およびゲーム装置3上部の蓋を開くOPENスイッチが設けられている。ここで、プレイヤがOPENスイッチを押下することによって上記蓋が開き、光ディスク4の脱着が可能となる。
また、ゲーム装置3には、セーブデータ等を固定的に記憶するバックアップメモリ等を搭載する外部メモリカード5が必要に応じて着脱自在に装着される。ゲーム装置3は、光ディスク4に記憶されたゲームプログラムなどを実行することによって、その結果をゲーム画像としてモニタ2に表示する。さらに、ゲーム装置3は、外部メモリカード5に記憶されたセーブデータを用いて、過去に実行されたゲーム状態を再現して、ゲーム画像をモニタ2に表示することもできる。そして、ゲーム装置3のプレイヤは、モニタ2に表示されたゲーム画像を見ながら、コントローラ7を操作することによって、ゲーム進行を楽しむことができる。
コントローラ7は、その内部に備える通信部75(後述)から受信ユニット6が接続されたゲーム装置3へ、例えばBluetooth(ブルートゥース;登録商標)の技術を用いて送信データを無線送信する。コントローラ7は、主にモニタ2に表示されるゲーム空間に登場するプレイヤオブジェクトを操作するための操作手段である。コントローラ7は、複数の操作ボタン、キー、およびスティック等の操作部が設けられている。また、後述により明らかとなるが、コントローラ7は、当該コントローラ7から見た画像を撮像する撮像情報演算部74を備えている。また、撮像情報演算部74の撮像対象の一例として、モニタ2の表示画面近傍に2つのLEDモジュール(以下、マーカと記載する)8Lおよび8Rが設置される。これらマーカ8Lおよび8Rは、それぞれモニタ2の前方に向かって赤外光を出力する。なお、本実施例では、撮像情報演算部74による撮像情報を用いないため、マーカ8Lおよび8Rを設置しなくてもかまわない。
次に、図2を参照して、ゲーム装置3の構成について説明する。なお、図2は、ゲーム装置3の機能ブロック図である。
図2において、ゲーム装置3は、各種プログラムを実行する例えばリスク(RISC)CPU(セントラルプロセッシングユニット)30を備える。CPU30は、図示しないブートROMに記憶された起動プログラムを実行し、メインメモリ33等のメモリの初期化等を行った後、光ディスク4に記憶されているゲームプログラムの実行し、そのゲームプログラムに応じたゲーム処理等を行うものである。CPU30には、メモリコントローラ31を介して、GPU(Graphics Processing Unit)32、メインメモリ33、DSP(Digital Signal Processor)34、およびARAM(Audio RAM)35が接続される。また、メモリコントローラ31には、所定のバスを介して、コントローラI/F(インターフェース)36、ビデオI/F37、外部メモリI/F38、オーディオI/F39、およびディスクI/F41が接続され、それぞれ受信ユニット6、モニタ2、外部メモリカード5、スピーカ2a、およびディスクドライブ40が接続されている。
GPU32は、CPU30の命令に基づいて画像処理を行うものあり、例えば、3Dグラフィックスの表示に必要な計算処理を行う半導体チップで構成される。GPU32は、図示しない画像処理専用のメモリやメインメモリ33の一部の記憶領域を用いて画像処理を行う。GPU32は、これらを用いてモニタ2に表示すべきゲーム画像データやムービ映像を生成し、適宜メモリコントローラ31およびビデオI/F37を介してモニタ2に出力する。
メインメモリ33は、CPU30で使用される記憶領域であって、CPU30の処理に必要なゲームプログラム等を適宜記憶する。例えば、メインメモリ33は、CPU30によって光ディスク4から読み出されたゲームプログラムや各種データ等を記憶する。このメインメモリ33に記憶されたゲームプログラムや各種データ等がCPU30によって実行される。
DSP34は、ゲームプログラム実行時にCPU30において生成されるサウンドデータ等を処理するものであり、そのサウンドデータ等を記憶するためのARAM35が接続される。ARAM35は、DSP34が所定の処理(例えば、先読みしておいたゲームプログラムやサウンドデータの記憶)を行う際に用いられる。DSP34は、ARAM35に記憶されたサウンドデータを読み出し、メモリコントローラ31およびオーディオI/F39を介してモニタ2に備えるスピーカ2aに出力させる。
メモリコントローラ31は、データ転送を統括的に制御するものであり、上述した各種I/Fが接続される。コントローラI/F36は、例えば4つのコントローラI/F36a〜36dで構成され、それらが有するコネクタを介して嵌合可能な外部機器とゲーム装置3とを通信可能に接続する。例えば、受信ユニット6は、上記コネクタと嵌合し、コントローラI/F36を介してゲーム装置3と接続される。上述したように受信ユニット6は、コントローラ7からの送信データを受信し、コントローラI/F36を介して当該送信データをCPU30へ出力する。ビデオI/F37には、モニタ2が接続される。外部メモリI/F38には、外部メモリカード5が接続され、その外部メモリカード5に設けられたバックアップメモリ等とアクセス可能となる。オーディオI/F39にはモニタ2に内蔵されるスピーカ2aが接続され、DSP34がARAM35から読み出したサウンドデータやディスクドライブ40から直接出力されるサウンドデータをスピーカ2aから出力可能に接続される。ディスクI/F41には、ディスクドライブ40が接続される。ディスクドライブ40は、所定の読み出し位置に配置された光ディスク4に記憶されたデータを読み出し、ゲーム装置3のバスやオーディオI/F39に出力する。
図3および図4を参照して、本発明の入力装置の一例であるコントローラ7について説明する。なお、図3は、コントローラ7の上面後方から見た斜視図である。図4は、コントローラ7を下面後方から見た斜視図である。
図3および図4において、コントローラ7は、例えばプラスチック成型によって形成されたハウジング71を有しており、当該ハウジング71に複数の操作部72が設けられている。ハウジング71は、その前後方向を長手方向とした略直方体形状を有しており、全体として大人や子供の片手で把持可能な大きさである。
ハウジング71上面の中央前面側に、十字キー72aが設けられる。この十字キー72aは、十字型の4方向プッシュスイッチであり、矢印で示す4つの方向(前後左右)に対応する操作部分が十字の突出片にそれぞれ90°間隔で配置される。プレイヤが十字キー72aのいずれかの操作部分を押下することによって前後左右いずれかの方向を選択される。例えばプレイヤが十字キー72aを操作することによって、仮想ゲーム世界に登場するプレイヤキャラクタ等の移動方向を指示したり、カーソルの移動方向を指示したりすることができる。
なお、十字キー72aは、上述したプレイヤの方向入力操作に応じて操作信号を出力する操作部であるが、他の態様の操作部でもかまわない。例えば、リング状に4方向の操作部分を備えたプッシュスイッチとその中央に設けられたセンタスイッチとを複合した複合スイッチを上記十字キー72aの代わりに設けてもかまわない。また、ハウジング71上面から突出した傾倒可能なスティックを倒すことによって、傾倒方向に応じて操作信号を出力する操作部を上記十字キー72aの代わりに設けてもかまわない。さらに、水平移動可能な円盤状部材をスライドさせることによって、当該スライド方向に応じた操作信号を出力する操作部を、上記十字キー72aの代わりに設けてもかまわない。また、タッチパッドを、上記十字キー72aの代わりに設けてもかまわない。また、少なくとも4つの方向(前後左右)をそれぞれ示すスイッチに対して、プレイヤによって押下されたスイッチに応じて操作信号を出力する操作部を上記十字キー72aの代わりに設けてもかまわない。
ハウジング71上面の十字キー72aより後面側に、複数の操作ボタン72b〜72gが設けられる。操作ボタン72b〜72gは、プレイヤがボタン頭部を押下することによって、それぞれの操作ボタン72b〜72gに割り当てられた操作信号を出力する操作部である。例えば、操作ボタン72b〜72dには、Xボタン、Yボタン、およびBボタン等としての機能が割り当てられる。また、操作ボタン72e〜72gには、セレクトスイッチ、メニュースイッチ、およびスタートスイッチ等としての機能が割り当てられる。これら操作ボタン72b〜72gは、ゲーム装置3が実行するゲームプログラムに応じてそれぞれの機能が割り当てられるが、本発明の説明とは直接関連しないため詳細な説明を省略する。なお、図3に示した配置例では、操作ボタン72b〜72dは、ハウジング71上面の中央前後方向に沿って並設されている。また、操作ボタン72e〜72gは、ハウジング71上面の左右方向に沿って操作ボタン72bおよび72dの間に並設されている。そして、操作ボタン72fは、その上面がハウジング71の上面に埋没しており、プレイヤが不意に誤って押下することのないタイプのボタンである。
また、ハウジング71上面の十字キー72aより前面側に、操作ボタン72hが設けられる。操作ボタン72hは、遠隔からゲーム装置3本体の電源をオン/オフする電源スイッチである。この操作ボタン72hも、その上面がハウジング71の上面に埋没しており、プレイヤが不意に誤って押下することのないタイプのボタンである。
また、ハウジング71上面の操作ボタン72cより後面側に、複数のLED702が設けられる。ここで、コントローラ7は、他のコントローラ7と区別するためにコントローラ種別(番号)が設けられている。例えば、LED702は、コントローラ7に現在設定されている上記コントローラ種別をプレイヤに通知するために用いられる。具体的には、コントローラ7から受信ユニット6へ送信データを送信する際、上記コントローラ種別に応じて複数のLED702のうち、種別に対応するLEDが点灯する。
一方、ハウジング71下面には、凹部が形成されている。後述で明らかとなるが、ハウジング71下面の凹部は、プレイヤがコントローラ7を把持したときに当該プレイヤの人差し指や中指が位置するような位置に形成される。そして、上記凹部の後面側傾斜面には、操作ボタン72iが設けられる。操作ボタン72iは、例えばAボタンとして機能する操作部であり、シューティングゲームにおけるトリガスイッチや、プレイヤオブジェクトを所定オブジェクトに対して注目させる操作等に用いられる。
また、ハウジング71前面には、撮像情報演算部74の一部を構成する撮像素子743が設けられる。ここで、撮像情報演算部74は、コントローラ7が撮像した画像データを解析してその中で輝度が高い場所を判別してその場所の重心位置やサイズなどを検出するためのシステムであり、例えば、最大200フレーム/秒程度のサンプリング周期であるため比較的高速なコントローラ7の動きでも追跡して解析することができる。また、ハウジング70の後面には、コネクタ73が設けられている。コネクタ73は、例えば32ピンのエッジコネクタであり、例えば接続ケーブルと嵌合して接続するために利用される。なお、本発明は、この撮像情報演算部74からの情報を使用しなくても実現可能であるため、ここではこれ以上の説明を省略する。
ここで、説明を具体的にするために、コントローラ7に対して設定する座標系について定義する。図3および図4に示すように、互いに直交するXYZ軸をコントローラ7に対して定義する。具体的には、コントローラ7の前後方向となるハウジング71の長手方向をZ軸とし、コントローラ7の前面(撮像情報演算部74が設けられている面)方向をZ軸正方向とする。また、コントローラ7の上下方向をY軸とし、ハウジング71の上面(十字キー72a等が設けられた面)方向をY軸正方向とする。さらに、コントローラ7の左右方向をX軸とし、ハウジング71の左側面(図3では表されずに図4で表されている側面)方向をX軸正方向とする。
次に、図5を参照して、コントローラ7の内部構造について説明する。なお、図5(a)は、コントローラ7の上筐体(ハウジング71の一部)を外した状態を示す斜視図である。図5(b)は、コントローラ7の下筐体(ハウジング71の一部)を外した状態を示す斜視図である。ここで、図5(b)に示す基板700は、図5(a)に示す基板700の裏面から見た斜視図となっている。
図5(a)において、ハウジング71の内部には基板700が固設されており、当該基板700の上主面上に操作ボタン72a〜72h、加速度センサ701、LED702、水晶振動子703、無線モジュール753、およびアンテナ754等が設けられる。そして、これらは、基板700等に形成された配線(図示せず)によってマイコン751(図6参照)に接続される。加速度センサ701は、コントローラ7が配置された3次元空間における傾きや振動等の算出に用いることができる加速度を検出して出力する。
より詳細には、図6に示すように、コントローラ7は3軸の加速度センサ701を備えていることが好ましい。この3軸の加速度センサ701は、3方向、すなわち、上下方向(図3に示すY軸)、左右方向(図3に示すX軸)、および前後方向(図3に示すZ軸)で直線加速度を検知する。また、他の実施形態においては、ゲーム処理に用いる制御信号の種類によっては、X軸とY軸(または他の対になった軸)のそれぞれに沿った直線加速度のみを検知する2軸の加速度検出手段を使用してもよい。例えば、この3軸または2軸の加速度センサ701は、アナログ・デバイセズ株式会社(Analog Devices, Inc.)またはSTマイクロエレクトロニクス社(STMicroelectronics N.V.)から入手可能であるタイプのものでもよい。加速度センサ701は、シリコン微細加工されたMEMS(Micro Electro Mechanical Systems:微小電子機械システム)の技術に基づいた静電容量式(静電容量結合式)であることが好ましい。しかしながら、既存の加速度検出手段の技術(例えば、圧電方式や圧電抵抗方式)あるいは将来開発される他の適切な技術を用いて3軸または2軸の加速度センサ701が提供されてもよい。
当業者には公知であるように、加速度センサ701に用いられるような加速度検出手段は、加速度センサの持つ各軸に対応する直線に沿った加速度(直線加速度)のみを検知することができる。つまり、加速度センサ701からの直接の出力は、その2軸または3軸のそれぞれに沿った直線加速度(静的または動的)を示す信号である。このため、加速度センサ701は、非直線状(例えば、円弧状)の経路に沿った動き、回転、回転運動、角変位、傾斜、位置、または姿勢等の物理特性を直接検知することはできない。
しかしながら、加速度センサ701から出力される加速度の信号に対して追加の処理を行うことによって、コントローラ7に関するさらなる情報を推測または算出(判定)することができることは、当業者であれば本明細書の説明から容易に理解できるであろう。例えば、静的な加速度(重力加速度)が検知されると、加速度センサ701からの出力を用いて、傾斜角度と検知された加速度とを用いた演算によって重力ベクトルに対する対象(コントローラ7)の傾きを判定することができる。このように、加速度センサ701をマイコン751(または他のプロセッサ)と組み合わせて用いることによって、コントローラ7の傾き、姿勢または位置を判定することができる。同様に、加速度センサ701を備えるコントローラ7が例えば後述するようにユーザの手で動的に加速されて動かされる場合に、加速度センサ701によって生成される加速度信号を処理することによって、コントローラ7のさまざまな動きおよび/または位置を算出することができる。他の実施例では、加速度センサ701は、信号をマイコン42に出力する前に内蔵の加速度検出手段から出力される加速度信号に対して所望の処理を行うための、組込み式の信号処理装置または他の種類の専用の処理装置を備えていてもよい。例えば、組込み式または専用の処理装置は、加速度センサが静的な加速度(例えば、重力加速度)を検出するためのものである場合、検知された加速度信号をそれに相当する傾斜角(あるいは、他の好ましいパラメータ)に変換するものであってもよい。
また、無線モジュール753およびアンテナ754を有する通信部75によって、コントローラ7がワイヤレスコントローラとして機能する。なお、水晶振動子703は、後述するマイコン751の基本クロックを生成する。
一方、図5(b)において、基板700の下主面上の前端縁に撮像情報演算部74が設けられる。撮像情報演算部74は、コントローラ7の前方から順に赤外線フィルタ741、レンズ742、撮像素子743、および画像処理回路744によって構成されており、それぞれ基板700の下主面に取り付けられる。また、基板700の下主面上の後端縁にコネクタ73が取り付けられる。そして、操作ボタン72iが撮像情報演算部74の後方の基板700の下主面上に取り付けられていて、それよりさらに後方に、電池705が収容される。電池705とコネクタ73との間の基板700の下主面上には、バイブレータ704が取り付けられる。このバイブレータ704は、例えば振動モータやソレノイドであってよい。バイブレータ704が作動することによってコントローラ7に振動が発生するので、それを把持しているプレイヤの手にその振動が伝達され、いわゆる振動対応ゲームが実現できる。
次に、図6を参照して、コントローラ7の内部構成について説明する。なお、図6は、コントローラ7の構成を示すブロック図である。
撮像情報演算部74は、赤外線フィルタ741、レンズ742、撮像素子743、および画像処理回路744を含んでいる。赤外線フィルタ741は、コントローラ7の前方から入射する光から赤外線のみを通過させる。レンズ742は、赤外線フィルタ741を透過した赤外線を集光して撮像素子743へ出射する。撮像素子743は、例えばCMOSセンサやあるいはCCDのような固体撮像素子であり、レンズ742が集光した赤外線を撮像する。したがって、撮像素子743は、赤外線フィルタ741を通過した赤外線だけを撮像して画像データを生成する。撮像素子743で生成された画像データは、画像処理回路744で処理される。具体的には、画像処理回路744は、撮像素子743から得られた画像データを処理して高輝度部分を検知し、それらの位置座標や面積を検出した結果を示す処理結果データを通信部75へ出力する。なお、これらの撮像情報演算部74は、コントローラ7のハウジング71に固設されており、ハウジング71自体の方向を変えることによってその撮像方向を変更することができる。
加速度センサ701は、上述したようにコントローラ7の上下方向(Y軸方向)、左右方向(X軸方向)、および前後方向(Z軸方向)の3軸成分に分けてそれぞれ加速度を検知して出力するセンサである。加速度センサ701が検知した3軸成分の加速度を示すデータは、それぞれ通信部75へ出力される。この加速度センサ701から出力される加速度データに基づいて、コントローラ7の動きを判定することができる。なお、加速度センサ701は、特定のアプリケーションで必要なデータに応じて何れか2軸に対してそれぞれ加速度を検出する加速度センサが用いられてもかまわない。
通信部75は、マイクロコンピュータ(Micro Computer:マイコン)751、メモリ752、無線モジュール753、およびアンテナ754を含んでいる。マイコン751は、処理の際にメモリ752を記憶領域として用いながら、送信データを無線送信する無線モジュール753を制御する。
コントローラ7に設けられた操作部72からの操作信号(キーデータ)、加速度センサ701からの3軸方向の加速度信号(X、Y、およびZ軸方向加速度データ)、および撮像情報演算部74からの処理結果データは、マイコン751に出力される。マイコン751は、入力した各データ(キーデータ、X、Y、およびZ軸方向加速度データ、処理結果データ)を受信ユニット6へ送信する送信データとして一時的にメモリ752に格納する。ここで、通信部75から受信ユニット6への無線送信は、所定の周期毎に行われるが、ゲームの処理は1/60秒を単位として行われることが一般的であるので、それよりも短い周期で送信を行うことが必要となる。具体的には、ゲームの処理単位は16.7ms(1/60秒)であり、ブルートゥース(登録商標)で構成される通信部75の送信間隔は5msである。マイコン751は、受信ユニット6への送信タイミングが到来すると、メモリ752に格納されている送信データを一連の操作情報として出力し、無線モジュール753へ出力する。そして、無線モジュール753は、例えばBluetooth(ブルートゥース;登録商標)の技術を用いて、所定周波数の搬送波を用いて操作情報をその電波信号としてアンテナ754から放射する。つまり、コントローラ7に設けられた操作部72からのキーデータ、加速度センサ701からのX、Y、およびZ軸方向加速度データ、および撮像情報演算部74からの処理結果データがコントローラ7から送信される。そして、ゲーム装置3の受信ユニット6でその電波信号を受信し、ゲーム装置3で当該電波信号を復調や復号することによって、一連の操作情報(キーデータ、X、Y、およびZ軸方向加速度データ、および処理結果データ)を取得する。そして、ゲーム装置3のCPU30は、取得した操作情報とゲームプログラムとに基づいて、ゲーム処理を行う。なお、Bluetooth(登録商標)の技術を用いて通信部75を構成する場合、通信部75は、他のデバイスから無線送信された送信データを受信する機能も備えることができる。
次に、ゲーム装置3が行う具体的な処理を説明する前に、本ゲーム装置3で行うゲームの概要について説明する。図7に示すように、コントローラ7は、全体として大人や子供の片手で把持可能な大きさである。そして、ゲームシステム1でコントローラ7を用いてゲームをプレイするためには、コントローラ7の前面がプレイヤの前方方向に向くようにプレイヤが一方の手(例えば右手)でコントローラ7を把持する。例えば、プレイヤは、親指をコントローラ7の左側面に添え、手のひらをコントローラ7の上面に添え、人差し指、中指、薬指、小指をコントローラ7下面に添えて、コントローラ7の前面がプレイヤの前方方向に露出させて、あたかもテニスラケットを握っているようにコントローラ7を把持する。
プレイヤは、モニタ2で表現されているゲーム画像に合わせて、コントローラ7を把持している腕を当該プレイヤから見て右から左へ振ったり(以下、「左振り」と記載する)、コントローラ7を把持している腕を当該プレイヤから見て左から右へ振ったり(以下、「右振り」と記載する)することによって、コントローラ7から操作情報(例えば、X、Y、およびZ軸方向加速度データ)をゲーム装置3に与える。プレイヤは、上述した左振りや右振りに加えて、コントローラ7を下から上へ振り上げながらの左振りや右振り、コントローラ7を上から下へ振り下ろしながらの左振りや右振り、コントローラ7を右や左にひねりながらの左振りや右振り等を行うことによって、コントローラ7から様々なX、Y、およびZ軸方向加速度データをゲーム装置3に与えることができる。本発明は、コントローラ7から与えられた入力に応じてゲームオブジェクトの状態を変化させるゲームを実現するものであるが、プレイヤがコントローラ7の本体を動かすことを入力の一例とし、そのコントローラ7の動きに応じた加速度データの推移を用いてゲームオブジェクトの状態を変化させるゲーム例を用いて説明する。
図8に示すように、コントローラ7から受信したX、Y、およびZ軸方向加速度データに応じて、モニタ2にテニスゲーム等が表現される。具体的には、仮想ゲーム空間に設定されたテニスコートが3次元のゲーム画像としてモニタ2に表現される。そして、仮想ゲーム空間に、プレイヤが操作するプレイヤキャラクタPC、当該プレイヤキャラクタPCの相手選手となる相手キャラクタEC、およびテニスコート上で移動するテニスボールを示すボールキャラクタBC等が配置されてモニタ2に表現される。なお、プレイヤキャラクタPCおよびボールキャラクタBCが、コントローラ7から与えられた入力に応じて状態が変化する本発明のオブジェクトに相当する。以下、説明を具体的にするためにテニスゲームを表現するゲームプログラムが光ディスク4に記憶されており、CPU30がテニスゲーム処理の中でコントローラ7の動きをオブジェクト(プレイヤキャラクタPCやボールキャラクタBC)の状態に反映する処理について説明する。
プレイヤキャラクタPCは、テニスラケットを持っており、仮想ゲーム空間に設定されたテニスコート上に配置される。そして、プレイヤがコントローラ7を振る動作に応じて、プレイヤキャラクタPCもテニスラケットを振るアニメーションが表現される。そして、到来するボールキャラクタBCをプレイヤキャラクタPCがテニスラケットで打ち返した場合、当該テニスラケットで打撃されたボールキャラクタBCが相手キャラクタEC側のコートに向かって飛んでいく。つまり、プレイヤがコントローラ7を把持して振る動作を行うことによって、同様にテニスラケットを振る動作をプレイヤキャラクタPCが表現することになり、プレイヤはあたかもテニスラケットを振ってテニスをしているような仮想的なスポーツゲームを体験できる。
例えば、プレイヤキャラクタPCが右打ちのテニスプレイヤを表現している場合、プレイヤがコントローラ7を把持して「左振り」することによって、プレイヤキャラクタPCがフォアハンドでテニスラケットをスイングする。一方、プレイヤがコントローラ7を把持して「右振り」することによって、プレイヤキャラクタPCがバックハンドでテニスラケットをスイングする。つまり、プレイヤがコントローラ7を振る方向に応じて、プレイヤキャラクタPCが同じ方向にテニスラケットをスイングする動作を行う。
また、プレイヤがコントローラ7を振るタイミングや速度に応じて、プレイヤキャラクタPCがスイングしたテニスラケットで打撃されたボールキャラクタBCが飛ぶ方向や速度が変化する。さらに、プレイヤがコントローラ7を上下に振り上げ/振り下ろしながら左振りや右振りをすることによって、ボールキャラクタBCの軌道高さが変化する。また、プレイヤがコントローラ7を右や左にひねりながら振ることによって、いわゆるトップスピンやアンダースピンを加えたようなボールキャラクタBCを相手キャラクタECに打ち返すことができる。後述により明らかとなるがこれらの動作は、コントローラ7から出力されるX、Y、およびZ軸方向加速度データを用いて区別および判定することが可能であり、プレイヤがコントローラ7に加えた様々な動作を反映したテニスゲームを表現することができる。
まず、コントローラ7が振られたか否かを判定する方法について説明する。まず、Z軸方向加速度データが閾値を越えるZ軸正方向の値を示しているとき、ゲーム装置3は、プレイヤがコントローラ7を振ったと判定する。例えば、コントローラ7が静止状態である場合、加速度センサ701は、重力加速度9.8m/s2を超える加速度を検出することはない。一方、上述したようにプレイヤがコントローラ7を把持して腕を振った場合、コントローラ7の前端部が円弧状の軌跡を描いて移動するため、遠心力の影響によってZ軸正方向(図3参照)の加速度が検出される。本実施例では、重力加速度以上の閾値を設定し、Z軸方向加速度データが当該閾値を超える加速度を示している場合、プレイヤがコントローラ7を振っていると判定する。
次に、図9を参照して、コントローラ7を振られていると判定されているときに、XおよびY軸方向加速度データによって、コントローラ7が振られている方向を判定する方法について説明する。なお、図9(a)〜図9(d)は、XおよびY軸方向加速度データがそれぞれ示す加速度の正負および大きさをX軸およびY軸としたグラフの一例である。そして、所得時間毎(例えば5ms毎)に同時に得られたXおよびY軸方向加速度データが示す加速度を順にX−Y座標系にプロットしている。図9(a)〜図9(d)では、同時に得られたXおよびY軸方向加速度データが示す加速度をそれぞれ点Pとして示しており、データが得られた順に矢印で結んで示している。また、図9(a)〜図9(d)は、重力加速度を含む一切の加速度が加速度センサ701に付加されていない状態の加速度データの値を原点(X、Y)=(0,0)で示し、重力加速度の大きさを「1」(破線で示す位置に対応)として示している。
コントローラ7を把持して振った場合、振り始めは加速して振り終わりは減速となる。したがって、コントローラ7には、振り始めで振っている方向と同じ方向の加速度が生じた後、徐々に加速度の大きさが減少して、振り終わりで振っている方向とは逆の方向に加速度が生じる。一方、一般的に、加速度センサ701から出力される加速度ベクトル(あるいは、加速度の正負)は、コントローラ7の加速方向とは真逆のベクトルとなる。したがって、加速度センサ701は、コントローラ7の振り始めで振っている方向とは逆の方向に加速度を検出した後、徐々に加速度の大きさが減少して、振り終わりで振っている方向と同じ方向に加速度を検出する。
例えば、コントローラ7の上面を上に向けて水平に左振りで加速(つまり、コントローラ7の加速方向がX軸正方向)したとき、加速度センサ701から得られる加速度ベクトルとしてはX軸負方向のベクトルが得られることになる。したがって、振っている際に同時に得られたXおよびY軸方向加速度データが示す加速度をX−Y座標系にプロットしていくと、コントローラ7の振り始めの加速時はX軸負方向からプロットが始まる。そして、コントローラ7の振り終わりは減速となるためX軸正方向にプロットされる。さらに、加速度センサ701には、常に重力加速度が作用しているため、鉛直方向(ここでは、Y軸負方向)に大きさ「1」の加速度を検出している。したがって、コントローラ7の上面を上に向けて水平に左振りしたとき、X軸方向の加速度がX軸負方向からX軸正方向(X+方向)へ順次推移しながらY軸方向の加速度が「−1」で一定となった点Pが順にX−Y座標系にプロットされる(図9(a))。
また、コントローラ7の上面をプレイヤから見て左90°方向に向けて水平に左振りで加速(つまり、コントローラ7の加速方向がY軸正方向)したとき、加速度センサ701から得られる加速度ベクトルとしてはY軸負方向のベクトルが得られることになる。したがって、振っている際に同時に得られたXおよびY軸方向加速度データが示す加速度をX−Y座標系にプロットしていくと、コントローラ7の振り始めの加速時はY軸負方向からプロットが始まる。そして、コントローラ7の振り終わりは減速となるためY軸正方向にプロットされる。さらに、加速度センサ701には、常に重力加速度が作用しているため、鉛直方向(ここでは、X軸正方向)に大きさ「1」の加速度を検出している。したがって、コントローラ7の上面をプレイヤから見て左90°方向に向けて水平に左振りしたとき、X軸方向の加速度が「+1」一定でY軸方向の加速度がY軸負方向からY軸正方向(Y+方向)へ順次推移する点Pが順にX−Y座標系にプロットされる(図9(b))。
また、コントローラ7の上面を下に向けて水平に左振りで加速(つまり、コントローラ7の加速方向がX軸負方向)したとき、加速度センサ701から得られる加速度ベクトルとしてはX軸正方向のベクトルが得られることになる。したがって、振っている際に同時に得られたXおよびY軸方向加速度データが示す加速度をX−Y座標系にプロットしていくと、コントローラ7の振り始めの加速時はX軸正方向からプロットが始まる。そして、コントローラ7の振り終わりは減速となるためX軸負方向にプロットされる。さらに、加速度センサ701には、常に重力加速度が作用しているため、鉛直方向(ここでは、Y軸正方向)に大きさ「1」の加速度を検出している。したがって、コントローラ7の上面を下に向けて水平に左振りしたとき、X軸方向の加速度がX軸正方向からX軸負方向(X−方向)へ順次推移しながらY軸方向の加速度が「+1」で一定となった点Pが順にX−Y座標系にプロットされる(図9(c))。
さらに、コントローラ7の上面をプレイヤから見て右90°方向に向けて水平に左振りで加速(つまり、コントローラ7の加速方向がY軸負方向)したとき、加速度センサ701から得られる加速度ベクトルとしてはY軸正方向のベクトルが得られることになる。したがって、振っている際に同時に得られたXおよびY軸方向加速度データが示す加速度をX−Y座標系にプロットしていくと、コントローラ7の振り始めの加速時はY軸正方向からプロットが始まる。そして、コントローラ7の振り終わりは減速となるためY軸負方向にプロットされる。さらに、加速度センサ701には、常に重力加速度が作用しているため、鉛直方向(ここでは、X軸負方向)に大きさ「1」の加速度を検出している。したがって、コントローラ7の上面をプレイヤから見て右90°方向に向けて水平に左振りしたとき、X軸方向の加速度が「−1」一定でY軸方向の加速度がY軸正方向からY軸負方向(Y−方向)へ順次推移する点Pが順にX−Y座標系にプロットされる(図9(d))。
このように、プレイヤがコントローラ7を把持して左振りを行ったとき、プレイヤがコントローラ7を把持する方向によって、XおよびY軸方向加速度データから得られる加速度の変化傾向が異なる。しかしながら、図9(a)〜図9(d)を見れば明らかなように、プレイヤがコントローラ7を左振りしたとき、点Pが全てX−Y座標系の原点を中心に右回りに推移している。一方、プレイヤがコントローラ7を右振りしたとき、加速度が左振りとは逆の傾向を示すことは明らかであり、点Pが全てX−Y座標系の原点を中心に左回りに推移することになる。つまり、X−Y座標系の原点を基準にプロット点Pが推移していく周回方向を算出すれば、プレイヤがコントローラ7を振っている方向(コントローラ7の移動方向)を判定することが可能となる。プロット点Pが推移していく周回方向とコントローラ7が振られている方向との関係は、座標軸の設定、加速度センサの特性、X−Y座標系の設定等によって変わるものであり、適宜各設定に応じて関係を調整すればよい。具体的には、得られた加速度データに基づいた重力加速度の方向(図9(a)〜図9(d)に示す破線矢印方向)を基準とし、当該重力加速度の方向に対する加速度データの推移方向を解析すれば、コントローラ7が振られている方向を正確に判定することができる。
しかしながら、現実にはプレイヤがコントローラ7を振る前に行うバックスイング(振りかぶり)やひねり等の影響によって、上記X−Y座標系にプロットされる点Pの推移は、図10に示すような複雑な曲線を描く場合が多い。例えば、図10は左振りによる推移の一例であるが、振り始めに原点に対して左回りの推移(点P1〜点P3;推移L)が現れた後に、右回りの推移(点P3〜点P10;推移R)が現れるため、推移Lの時点で振り方向を判定すると右振りと判定されてしまう。推移Lは、加速度の大きさが相対的に小さいデータ群であるが、これはバックスイングの振りの強さが弱いからである。また、原点から放射方向に近い推移をしているが、これは右振りや左振りとは異なる方向にコントローラ7が振られることによるものである。したがって、このように加速度の大きさが相対的に小さく、原点から放射方向に近い推移をするデータ群は、振り方向を判断するには信頼性の低いデータであるといえる。したがって、推移Rのように、加速度の大きさが相対的に大きいデータ群であり、原点を中心とした周回方向に近い推移を用いて判断すれば、正確に振り方向を判定できるといえる。換言すると、振り方向を判断するには、加速度の大きさが相対的に大きなデータほど信頼度が高く、原点を中心とした周回方向に近い推移ほど信頼度が高くなることになる。
上記信頼度は、時系列的に連続する2つの加速度データと原点とを結ぶ三角形の面積で表すことができる。例えば、図11に示すように、時系列的に隣接する点P4およびP5と原点とをそれぞれ結ぶ直線で囲まれた三角形の面積A45を考える。この場合、加速度の大きさが相対的に大きな点Pを用いて三角形を形成すると、面積A45が大きくなる。また、原点を中心とした周回方向に近い推移をする点Pを用いて三角形を形成すると、面積A45が大きくなる。つまり、面積A45の大きさによって、上記信頼度を表すことができることがわかる。
図12は、図10で示した時系列的に連続する点P1〜P3において、隣接するそれぞれの2点と原点とによって形成された三角形を累積した領域の面積A13と、点P3〜P6において、隣接するそれぞれの2点と原点とによって形成された三角形を累積した領域の面積A36(面積A13は、面積A36の一部に重複)とを示す図である。図12に示すように、面積A13は、原点に対して左回りの推移を示す点P1〜P3を用いて算出された三角形の累積面積である。一方、面積A36は、原点に対して右回りの推移を示す点P3〜P6を用いて算出された三角形の累積面積である。図12から明らかなように、面積A13は、面積A36より極めて小さくなっている。本実施例では、右回りの三角形の面積および左回りの三角形の面積を時系列に沿って累計し、一方の累計が閾値を超えた場合、当該超えた累計面積を形成している三角形に含まれる点Pの推移が右回りか左回りかに基づいて、振り方向を判定する。これによって、信頼度の低いデータの影響を排除しながら正確な振り方向を判定することができる。ここで、振り始めから振り終わりまでの全ての点Pを解析すれば、より正しい振り方向の判定が可能であると考えられるが、本実施例では、振り動作の途中の早い段階で振り方向の判定を行うために閾値を基準とした判定が行われる。つまり、プレイヤがコントローラ7を振り終わる前(モーション認識処理途中)に振り方向の判定が行われ、コントローラ7が振られたと判定されてからコントローラ7の振り方向を判定するまでの期間が本発明の第1の判定期間に相当する。
次に、プレイヤがコントローラ7を振る速度の判定について説明する。プレイヤがコントローラ7を速く振ると、加速から減速までの期間が相対的に短くなる。一方、プレイヤがコントローラ7を遅く振ると、加速から減速までの期間が相対的に長くなる。つまり、同じ振り幅でプレイヤがコントローラ7を振った場合、プレイヤがコントローラ7を速く振るほどX−Y座標系にプロットされる点Pの間隔(以下、データ間隔と記載することがある)が広くなる。したがって、時系列的に連続する点Pの間隔をそれぞれ判定して、プレイヤがコントローラ7を振る速度を算出することができる。本実施例では、振り始めから振り終わりまでの全ての点Pを解析して、時系列的に連続する点Pの間隔のうち、最も間隔が広いものを抽出して振る速度を算出する。
次に、図13〜図15を参照して、コントローラ7が振られているときに、XおよびY軸方向加速度データによって、コントローラ7がひねられている方向を判定する方法について説明する。なお、図13は、コントローラ7のひねり方向を説明するための斜視図である。図14(a)〜図14(c)は、コントローラ7に加えられたひねりに応じて、XおよびY軸方向加速度データがそれぞれ示す加速度の値を示すグラフの一例である。図15は、図14(a)〜図14(c)の角度θに応じて算出されるスピンパラメータSの一例を示すグラフである。なお、図14(a)〜図14(c)は、図9と同様に点Pが得られた順に矢印で結んで示し、重力加速度を含む一切の加速度が加速度センサ701に付加されていない状態の加速度データの値を原点(X、Y)=(0、0)としている。
図13において、プレイヤは、コントローラ7を把持して左振りまたは右振りでスイングするとき、さらにZ軸を中心として「左ひねり」または「右ひねり」をコントローラ7に加えることができる。ここで、「左ひねり」とは、プレイヤから見てZ軸を中心とした反時計方向にコントローラ7を回転させることを示している。また、「右ひねり」とは、プレイヤから見てZ軸を中心とした時計方向にコントローラ7を回転させることを示している。これらのひねり判定の結果は、ボールキャラクタBCに加えられるスピン(トップスピンやバックスピン)に反映される。
ここで、コントローラ7が振られているときに、コントローラ7がひねられた角度を判定するには、振り始めから振り終わりまでのXおよびY軸方向加速度データを解析する必要がある。本実施例では、振り始めに得られるXおよびY軸方向加速度データを示す点Ps(つまり、X−Y座標系へ最初にプロットする始点)と振り終わりに得られるXおよびY軸方向加速度データを示す点Pe(つまり、X−Y座標系へ最後にプロットする終点)とを用いて、コントローラ7がひねられた角度を判定する。
例えば、図14(a)は、コントローラ7の上面を上に向けた状態を維持(つまり、「ひねりなし」)して水平に左振りしたときに、振り始めから振り終わりまでに得られるXおよびY軸方向加速度データの一例を示している。そして、始点Psおよび原点を結ぶ直線から終点Peおよび原点を結ぶ直線までの間に形成される角度θ(以下、始点Psから終点Peまでの角度θと記載する)を算出し、当該角度θに応じたスピンパラメータSを設定する。この場合、コントローラ7に作用する重力方向が一定であるため、中程度の角度θが得られる。ここで、角度θは、X−Y座標系の原点から始点Psに向かうベクトルと原点から終点Peに向かうベクトルとが成す角度の絶対値を算出することによって求めることができる。
図14(b)は、コントローラ7の上面を上に向けた状態から「左ひねり」を加えながら水平に左振りしたときに、振り始めから振り終わりまでに得られるXおよびY軸方向加速度データの一例を示している。この場合、コントローラ7に作用する重力方向がひねりに応じて右回りに変化していくため、「ひねりなし」で得られる角度θより「左ひねり」で得られる始点Psから終点Peまでの角度θが大きくなる。
図14(c)は、コントローラ7の上面を上に向けた状態から「右ひねり」を加えながら水平に左振りしたときに、振り始めから振り終わりまでに得られるXおよびY軸方向加速度データの一例を示している。この場合、コントローラ7に作用する重力方向がひねりに応じて左回りに変化していくため、「ひねりなし」で得られる角度θより「右ひねり」で得られる始点Psから終点Peまでの角度θが小さくなる。
このように、始点Psから終点Peまでの角度θに注目すれば、振っているときにコントローラ7に加えられたひねり方向やひねり角度を判定することができる。例えば、コントローラ7が「左振り」されているとき、角度θが閾値より大きい場合「左ひねり」、角度θが閾値より小さい場合「右ひねり」と判定することができる。なお、コントローラ7が「右振り」されているときは、これらの傾向が逆に現れる。すなわち、コントローラ7が「右振り」されているとき、角度θが閾値より大きい場合「右ひねり」、角度θが閾値より小さい場合「左ひねり」と判定することができる。つまり、X軸方向加速度データおよびY軸方向加速度データがX−Y座標系における座標点として示す始点Psおよび終点Peを用いて、X軸およびY軸に対して互いに直交するZ軸を回転軸としたコントローラ7の回転動作を判定することができる。このように、プレイヤがコントローラ7を振った速度やひねりながら振った回転動作の判定は、振り終わった後(モーション認識処理終了後)に行われる。なお、コントローラ7が振られたと判定されてからコントローラ7の振り速度や回転動作を判定するまで(つまり、プレイヤがコントローラ7を振り終わるまで)の期間が本発明の第2の判定期間に相当する。
また、「ひねりなし」で得られる角度θの大きさ(図14(a))を基準とした角度θの大きさの差に応じて、プレイヤがコントローラ7をひねった回転の量を決定することができる。本実施例では、所定の変換テーブルを用いて、ひねり認識に用いた角度θを当該角度θの大きさに応じてスピンパラメータSに置き換えて、その後のゲーム処理を行っている。スピンパラメータSは、例えば角度θの大きさに応じて決定される−1.0〜1.0の浮動小数である。そして、ゲーム処理においては、S=−1.0のときにバックスピンの最大効果を与え、S=1.0のときにトップスピンの最大効果を与えるものとする。
例えば、図15に示すように、角度θ≦30°のときは、スピンパラメータS=−1.0に変換する。30°<角度θ≦70°のときは、スピンパラメータS=−1.0〜0.0の間で線形に変化させて変換する。70°<角度θ≦120°のときは、スピンパラメータS=0.0に変換する。120°<角度θ≦160°のときは、スピンパラメータS=0.0〜1.0の間で線形に変化させて変換する。160°<角度θのときは、スピンパラメータS=1.0に変換する。これらの変換テーブルを調整することによって、コントローラ7に対するひねりをゲーム処理に反映させる効果を調整することができる。
次に、図16および図17を参照して、コントローラ7が振り上げられているまたは振り下ろされている状態を判定する方法について説明する。なお、図16(a)〜図16(c)は、コントローラ7の上下方向に傾けた状態とそれらの座標軸との関係を説明するための図である。図17は、Z軸方向加速度データに応じて算出される上下角度UDの一例を示すグラフである。
本実施例では、振り始め前のコントローラ7の上下方向に基づいて、コントローラ7が振り上げられているまたは振り下ろされているかを判定している。例えば、プレイヤがコントローラ7を振り始める前に当該コントローラ7の前面を水平から所定の角度以上に下方向へ向けていたとき、プレイヤがコントローラ7を振り上げてスイングしたと判定する。一方、プレイヤがコントローラ7を振り始める前に当該コントローラ7の前面を水平から所定の角度以上に上方向へ向けていたとき、プレイヤがコントローラ7を振り下ろしてスイングしたと判定する。
具体的には、コントローラ7が振られていると判定されたとき、その直前の数フレームに対して得られたZ軸方向加速度データに基づいて、振り始め前のコントローラ7の上下方向を判定する。例えば、図16(a)に示すように、プレイヤがコントローラ7を振り始める前に当該コントローラ7が水平である場合、重力加速度がY軸負方向に作用するためZ軸方向加速度データには当該重力加速度の影響が現れない。一方、図16(b)に示すように、プレイヤがコントローラ7を振り始める前に当該コントローラ7の前面を水平から上方向に向けている場合、重力加速度がY軸負方向およびZ軸負方向に作用するためZ軸方向加速度データが当該重力加速度の影響によってZ軸負方向の加速度を示す。また、図16(c)に示すように、プレイヤがコントローラ7を振り始める前に当該コントローラ7の前面を水平から下方向に向けている場合、重力加速度がY軸負方向およびZ軸正方向に作用するためZ軸方向加速度データが当該重力加速度の影響によってZ軸正方向の加速度を示す。つまり、プレイヤがコントローラ7を振り始める前のZ軸方向加速度データを解析すれば、プレイヤがコントローラ7を振り始める前の上下方向が判定できる。
本実施例では、得られたZ軸方向加速度データをメインメモリ33に格納し、コントローラ7が振られていると判定されたときに、その直前の30フレーム分に対して得られたZ軸方向加速度データの平均値Zaveをコントローラ7の上下角度UDに変換し、その後のゲーム処理を行っている。
例えば、図17に示すように、平均値Zave≦−0.2Gのときは、上下角度UD=60°に変換する。−0.2G<平均値Zave≦1.0Gのときは、上下角度UD=60°〜−60°の間で線形に変化させて変換する。1.0G<平均値Zaveのときは、上下角度UD=−60°に変換する。ここで、平均値Zaveに対して変換される上下角度UDのバランスがZ軸正方向に寄っているが、これは振り始めでは必ずZ軸方向加速度データがZ軸正方向に振れているため、その影響を考慮したためである。これらの変換テーブルを調整することによって、コントローラ7の振り始め前に得られたZ軸方向加速度データをゲーム処理に反映させる効果を調整することができる。
次に、ゲームシステム1において行われるゲーム処理の詳細を説明する。まず、図18を参照して、ゲーム処理において用いられる主なデータについて説明する。なお、図18は、ゲーム装置3のメインメモリ33に記憶される主なデータを示す図である。
図18に示すように、メインメモリ33には、加速度データDa、上下角度データDb、左回り累積面積データDc、右回り累積面積データDd、第1ボール軌道データDe、第2ボール軌道データDf、第1ダミーボールデータDg、第2ダミーボールデータDh、ボールキャラクタデータDi、始点−終点角度データDj、スピンパラメータDk、最大プロット間隔データDl、カウントデータDm、および画像データDn等が記憶される。なお、メインメモリ33には、図18に示す情報に含まれるデータの他、ゲームに登場するプレイヤキャラクタPCや相手キャラクタEC等に関するデータ(位置データ等)や仮想ゲーム空間に関するデータ(地形データ等)等、ゲーム処理に必要なデータが記憶される。
加速度データDaは、コントローラ7から送信データとして送信されてくる一連の操作情報に含まれる加速度データであり、得られた加速度データを所定フレーム分(例えば、ゲーム処理間隔である1フレーム(1/60秒)に対して30フレーム分)格納する。加速度データDaには、加速度センサ701がX、Y、およびZ軸の3軸成分に分けてそれぞれ検出したX軸方向加速度データDa1、Y軸方向加速度データDa2、およびZ軸方向加速度データDa3が含まれる。なお、ゲーム装置3に備える受信ユニット6は、コントローラ7から所定間隔例えば5msごとに送信される操作情報に含まれる加速度データDaを受信し、受信ユニット6に備える図示しないバッファに蓄えられる。その後、ゲーム処理間隔である1フレーム毎に読み出されてメインメモリ33に記憶される。
上下角度データDbは、振り始め前にコントローラ7から得られたZ軸方向加速度データDa3に応じて算出された上下角度UD(図16、図17参照)を示すデータである。左回り累積面積データDcは、X−Y座標系において、原点に対して左回りに推移する加速度データを用いて形成された三角形の面積(図12参照)を累積したデータである。右回り累積面積データDdは、X−Y座標系において、原点に対して右回りに推移する加速度データを用いて形成された三角形の面積(図12参照)を累積したデータである。
第1ボール軌道データDeは、後述するモーション認識処理における初期段階(第1の判定期間)におけるデータに基づいて、ボールキャラクタBCが仮想ゲーム空間内を移動する軌道(第1ボール軌道TR1;本発明の第1挙動情報の一例)を算出したデータである。第2ボール軌道データDfは、モーション認識処理の全期間(第2の判定期間)において得られたデータに基づいて、ボールキャラクタBCが仮想ゲーム空間内を移動する軌道(第2ボール軌道TR2;本発明の第2挙動情報の一例)を算出したデータである。第1ダミーボール位置データDgは、第1ダミーボール速度データDg1および第1ダミーボール位置データDg2を含み、第1ボール軌道データDeで示される軌道に沿って移動させる第1ダミーボールの速度および位置を示す仮想ゲーム空間に対する速度ベクトルデータおよび位置座標データである。第2ダミーボール位置データDhは、第2ダミーボール速度データDh1および第2ダミーボール位置データDh2を含み、第2ボール軌道データDfで示される軌道に沿って移動させる第2ダミーボールの速度および位置を示す仮想ゲーム空間に対する速度ベクトルデータおよび位置座標データである。ボールキャラクタデータDiは、ボールキャラクタ速度データDi1およびボールキャラクタ位置データDi2を含み、ボールキャラクタBCの現在の速度および位置を示す仮想ゲーム空間に対する速度ベクトルデータおよび位置座標データである。
始点−終点角度データDjは、上記X−Y座標系において、始点Psから終点Peまでの角度θ(図14参照)を示すデータである。スピンパラメータDkは、角度θを置き換えることによって得られるスピンパラメータS(図15参照)を示すデータである。最大プロット間隔データDlは、モーション認識処理の全期間において得られたXおよびY軸方向加速度データに基づいて、X−Y座標系にプロットした場合に時系列的に連続する間隔が最大となるデータ間隔を示すデータである。カウントデータDmは、後述するフローチャートで用いられるカウント値を示すデータである。
画像データDnは、プレイヤキャラクタ画像データDn1およびボール画像データDn2等を含み、仮想ゲーム世界にプレイヤキャラクタPCやボールキャラクタBCを配置してゲーム画像を生成するためのデータである。
次に、図19〜図26を参照して、ゲーム装置3において行われるゲーム処理の詳細を説明する。なお、図19は、ゲーム装置3において実行されるゲーム処理の流れを示すフローチャートである。図20は、図19におけるステップ51の初期モーション認識処理の詳細な動作を示すサブルーチンである。図21は、図19におけるステップ52のアニメーション開始処理の詳細な動作を示すサブルーチンである。図22は、図19におけるステップ53の第1挙動処理の詳細な動作を示すサブルーチンである。図23は、図19におけるステップ54の第2挙動処理の詳細な動作を示すサブルーチンである。図24は、モーション認識処理、アニメーション処理、およびボール挙動処理がそれぞれ行われるタイミングを示す図である。図25は、スピンパラメータSに応じて決定されるボール挙動の一例を示す図である。図26は、第1ボール軌道TR1および第2ボール軌道TR2の一例を示す図である。なお、図19〜図23に示すフローチャートにおいては、ゲーム処理のうち、プレイヤがコントローラ7を振ることによるゲーム操作に基づいて行われるゲーム処理について説明し、本願発明と直接関連しない他のゲーム処理については詳細な説明を省略する。また、図19〜図23では、CPU30が実行する各ステップを「S」と略称する。
ゲーム装置3の電源が投入されると、ゲーム装置3のCPU30は、図示しないブートROMに記憶されている起動プログラムを実行し、これによってメインメモリ33等の各ユニットが初期化される。そして、光ディスク4に記憶されたゲームプログラムがメインメモリ33に読み込まれ、CPU30によって当該ゲームプログラムの実行が開始される。図12〜図15に示すフローチャートは、以上の処理が完了した後に行われるゲーム処理を示すフローチャートである。
図19において、CPU30は、初期モーション認識処理(ステップ51)、アニメーション開始処理(ステップ52)、第1挙動処理(ステップ53)、および第2挙動処理(ステップ54)を順に行う。なお、これらの詳細な動作内容については、後述する。そして、CPU30は、ゲームを終了するか否かを判断する(ステップ55)。ゲームを終了する条件としては、例えば、ゲームオーバーとなる条件(例えば、プレイヤキャラクタがプレイするテニスゲームが終了する等)が満たされたことや、プレイヤがゲームを終了する操作を行ったこと等がある。CPU30は、ゲームを終了しない場合に上記ステップ51に戻って処理を繰り返し、ゲームを終了する場合に当該フローチャートによる処理を終了する。
図20を参照して、上記ステップ51における初期モーション認識処理の動作について説明する。まず、CPU30は、コントローラ7から受信した操作情報に含まれる加速度データを取得し(ステップ61)、処理を次のステップに進める。そして、CPU30は、取得した加速度データを加速度データDaとしてメインメモリ33に記憶する。ここで、ステップ61で取得される加速度データには、加速度センサ701がX、Y、およびZ軸の3軸成分に分けてそれぞれ検出したX、Y、およびZ軸方向加速度データが含まれている。ここでは、通信部75は、所定の時間間隔(例えば5ms間隔)で操作情報をゲーム装置3へ送信しており、受信ユニット6に備える図示しないバッファに少なくとも加速度データが蓄えられる。そして、CPU30は、ゲーム処理単位である1フレーム毎にバッファに蓄えられた加速度データを取得してメインメモリ33に格納する。
次に、CPU30は、取得した加速度データを用いて、コントローラ7がプレイヤによって振られたか否かを判断する(ステップ62)。具体的には、CPU30は、上記ステップ61で取得したZ軸方向加速度データが閾値を越えたZ軸正方向の値を示しているとき、プレイヤがコントローラ7を振ったと判定する。そして、CPU30は、コントローラ7が振られている場合、処理を次のステップ63に進める。一方、CPU30は、コントローラ7が振られていない場合、上記ステップ61に戻って処理を繰り返す。
ステップ63において、CPU30は、振り始め前のコントローラ7の上下方向を判定し、処理を次のステップに進める。具体的には、CPU30は、メインメモリ33に格納されている過去数フレーム(例えば、30フレーム)分のZ軸方向加速度データDa3の平均値Zaveを算出する。そして、CPU30は、平均値Zaveを上下角度UDに変換(図17参照)して、当該上下角度UDを示すデータを上下角度データDbとして格納する。
次に、CPU30は、コントローラ7から受信した操作情報に含まれる加速度データをステップ61と同様の処理によって取得し(ステップ64)、当該取得した加速度データのZ軸方向データが閾値以下であるかどうかに基づいてプレイヤがコントローラ7を振る動作を終了したか否かを判断する(ステップ65)。そして、CPU30は、コントローラ7を振る動作が継続している場合、処理を次のステップ66に進める。一方、CPU30は、コントローラ7を振る動作が終了している場合、上記ステップ51に戻って処理を繰り返す。
ステップ66において、CPU30は、上記ステップ64で所得した加速度データに基づいて、X−Y座標系における原点との間で形成される三角形面積を累積し、処理を次のステップに進める。具体的には、図12を参照して説明したように、上記ステップ64で所得した加速度データがX−Y座標系の原点に対して左回りに推移している場合、CPU30は、適宜形成された三角形の面積を左回り累積面積データDcに累積して格納する。一方、CPU30は、上記ステップ64で所得した加速度データがX−Y座標系の原点に対して右回りに推移している場合、適宜形成された三角形の面積を右回り累積面積データDdに累積して格納する。
次に、CPU30は、上記ステップ64で所得した加速度データによってX−Y座標系にプロットされる間隔(データ間隔)を判定し(ステップ67)、処理を次のステップに進める。具体的には、CPU30は、得られたデータ間隔が、現在最大プロット間隔データDlに格納されているデータ間隔より広い場合、当該最大プロット間隔データDlを得られたデータ間隔に更新する。一方、CPU30は、得られたデータ間隔が、現在最大プロット間隔データDlに格納されているデータ間隔と同じまたは狭い場合、そのまま処理を次のステップに進める。
次に、CPU30は、左回り累積面積データDcが示す累積面積および右回り累積面積データDdが示す累積面積の何れか一方が閾値を超えたか否かを判断する(ステップ68)。そして、CPU30は、累積面積の何れか一方が閾値を超えた場合、当該サブルーチンによる処理を終了して上記ステップ52に処理を進める。一方、CPU30は、累積面積が何れも閾値を超えていない場合、上記ステップ64に戻って処理を繰り返す。
図21を参照して、上記ステップ52におけるアニメーション開始処理の動作について説明する。上記ステップ68の処理の後、CPU30は、コントローラ7に対して振られた方向を判定し(ステップ71)、処理を次のステップに進める。例えば、上記ステップ68において、左回り累積面積データDcが示す累積面積が閾値を超えたと判定された場合、加速度データが上述したX−Y座標系の原点を中心に左回りに推移しているとしてプレイヤがコントローラ7を「右振り」(図7参照)していると判定される。一方、上記ステップ68において、右回り累積面積データDdが示す累積面積が閾値を超えたと判定された場合、加速度データが上述したX−Y座標系の原点を中心に右回りに推移しているとしてプレイヤがコントローラ7を「左振り」(図7参照)していると判定する。
これらステップ68およびステップ71による処理から明らかなように、上記ステップ71は、左回り累積面積データDcが示す累積面積および右回り累積面積データDdが示す累積面積の何れか一方が閾値を超えた場合に実行され、プレイヤがコントローラ7を振り終わることによって実行される処理ではない。図24に示すように、プレイヤがコントローラ7を振り始めてから振り終わるまでの動作を認識する処理(モーション認識処理)は、時刻T1〜T4まで行われている。一方、プレイヤキャラクタPCがテニスラケットを振るアニメーションを表現する処理(アニメーション処理)は、時刻T2以降に行われ、モーション認識処理の途中から開始される。つまり、コントローラ7に対する振り方向がコントローラ7を振り始めてから振り終わるまでの途中段階(第1の判定期間終了時)で判定されて、ゲーム画像に反映されることになる。ここで、上記ステップ51の初期モーション認識処理は、モーション認識処理のうち、時刻T1〜T2で行われる処理となる。
なお、閾値を超えた累積面積の区別とコントローラ7が振られている方向との関係は、コントローラ7における座標軸の設定、加速度センサの特性、X−Y座標系の設定等によって変わるものであり、適宜各設定に応じて関係を調整すればよい。具体的には、得られた加速度データに基づいた重力加速度の方向を基準として、閾値を超えた累積面積の区別と振り方向との関係を解析すれば、コントローラ7が振られている方向を正確に判定することができる。
次に、CPU30は、プレイヤキャラクタPCがボールキャラクタBCを打ち返す当たりを判定し(ステップ72)、プレイヤキャラクタPCが空振りするか否かを判断する(ステップ73)。ここで、ここまで実行したステップでは、プレイヤキャラクタPCがラケットを振る動作を開始していない。しかしながら、CPU30は、現時点のプレイヤキャラクタPCの位置およびその後の予想位置と、現時点のボールキャラクタBCの位置およびその後の予想軌道と、プレイヤキャラクタPCがテニスラケットを振る方向等とのデータから、到来するボールキャラクタBCを今回のスイングによって打ち返す当たりを予測して判定することが可能である。そして、CPU30は、プレイヤキャラクタPCが空振りすると予測される場合、プレイヤキャラクタPCが空振りするアニメーションをモニタ2に表示する処理を開始し(ステップ76)、上記ステップ55に進んで処理を行う。一方、CPU30は、プレイヤキャラクタPCがボールキャラクタBCを打ち返すと予測される場合、処理を次のステップ74に進める。
ステップ74において、CPU30は、現時点からプレイヤキャラクタPCがボールキャラクタBCを打ち返すまでの時間tを算出し、カウントを開始してカウントデータDnを更新する。そして、CPU30は、プレイヤキャラクタPCがボールキャラクタBCを打ち返すアニメーションをモニタ2に表示する処理を開始し(ステップ75)、処理を次のステップに進める。なお、打ち返すアニメーションは、上下角度UDに応じたスイングで表現される。つまり、上下角度UDで示される上下方向に向けてプレイヤキャラクタPCがテニスラケットを振り上げるまたは振り下ろすようなアニメーションが表現される。なお、プレイヤがコントローラ7を振り終わる前に判定された情報に基づいて表示されるアニメーションは、予め決められたプレイヤキャラクタPCの一連の動作であって、本発明の第1挙動情報の一例に相当する。
次に、CPU30は、コントローラ7から受信した操作情報に含まれる加速度データを取得し(ステップ77)、当該取得した加速度データに基づいてプレイヤがコントローラ7を振る動作を終了したか否かを判断する(ステップ78)。そして、CPU30は、コントローラ7を振る動作が継続している場合、処理を次のステップ79に進める。一方、CPU30は、コントローラ7を振る動作が終了している場合、処理を次のステップ101に進める。なお、ステップ77における加速度データの取得処理については、上述したステップ61と同様であるため詳細な説明を省略する。また、ステップ78における振り判定方法についても、ステップ77で取得した加速度データを用いることを除いて上述したステップ62と同様であるため、詳細な説明を省略する。
ステップ79において、CPU30は、上記ステップ77で所得した加速度データによってX−Y座標系にプロットされる間隔(データ間隔)を判定する。なお、ステップ79におけるデータ間隔判定処理については、ステップ77で取得した加速度データを用いることを除いて上記ステップ67と同様であるため詳細な説明を省略する。次に、CPU30は、現在のカウントデータDnのカウント値が時間tに到達したか否かを判断する(ステップ80)。そして、CPU30は、現在のカウント値が時間tに未到達である場合、カウントデータDnのカウント値を更新して(ステップ81)、上記ステップ77に戻って処理を繰り返す。一方、CPU30は、現在のカウント値が時間tに到達した場合、当該サブルーチンによる処理を終了して上記ステップ53に処理を進める。
図22を参照して、上記ステップ53における第1挙動処理の動作について説明する。上記ステップ80の処理の後、CPU30は、ボールキャラクタBCを打ち返す初速度、方向、および位置を算出して当該位置にボールキャラクタBCを表示し(ステップ91)、処理を次のステップに進める。具体的には、CPU30は、ボールキャラクタBCの速度および方向を速度ベクトル(vx、vy、vz)で示し、当該速度ベクトルを示すデータをボールキャラクタ速度データDi1に格納する。ここで、速度ベクトル(vx、vy、vz)は、その大きさは固定値で設定される。そして、速度ベクトル(vx、vy、vz)の方向は、プレイヤがコントローラ7を振る方向、コントローラ7を振り始めたタイミングとボールキャラクタBCが到来するタイミングとの関係、および上下角度UD等に基づいて設定される。具体的には、ボールキャラクタBCが打ち返される左右方向は、プレイヤキャラクタPCがテニスラケットを振る左右方向(つまり、コントローラ7の振り方向)とボールキャラクタBCを打撃するタイミング(つまり、コントローラ7の振り始めのタイミング)で決定される。また、ボールキャラクタBCが打ち返される上下方向は、プレイヤキャラクタPCがテニスラケットを振る上下方向(つまり、上下角度UD)で決定される。例えば、上下角度UDが正の角度であるときは振り下ろしであるため、ボールキャラクタBCの速度ベクトルが当該上下角度UDの数値に応じた低い方向に設定される。また、上下角度UDが負の角度であるときは振り上げであるため、ボールキャラクタBCの速度ベクトルが当該上下角度UDの数値に応じた高い方向に設定される。また、CPU30は、ボールキャラクタBCがプレイヤキャラクタPCのテニスラケットで打撃された位置を仮想ゲーム空間の位置座標(x、y、z)で示し、当該位置座標を示すデータをボールキャラクタ位置データDi2に格納する。
次に、CPU30は、コントローラ7から受信した操作情報に含まれる加速度データを取得する(ステップ92)。そして、CPU30は、上記ステップ92で所得した加速度データによってX−Y座標系にプロットされる間隔(データ間隔)を判定して(ステップ93)、処理を次のステップに進める。なお、ステップ92における加速度データの取得処理については、上述したステップ61と同様であるため詳細な説明を省略する。また、ステップ93におけるデータ間隔判定処理については、ステップ92で取得した加速度データを用いることを除いて上記ステップ67と同様であるため詳細な説明を省略する。
次に、CPU30は、現在のボールキャラクタ速度データDi1およびボールキャラクタ位置データDi2に格納された速度ベクトル(vx、vy、vz)および位置座標(x、y、z)に基づいて第1ボール軌道TR1を算出し、ボールキャラクタBCを当該第1ボール軌道TR1に沿って移動させてモニタ2に表示する(ステップ94)。CPU30は、仮想ゲーム空間に現実世界の物理法則(例えば、重力、空気の抵抗、風の影響)を擬似的に、または厳密に定義し、速度ベクトル(vx、vy、vz)、位置座標(x、y、z)、スピンパラメータS(ここでは、S=0.0)、および当該物理法則に基づいて第1ボール軌道TR1を算出して第1ボール軌道データDeに格納する。そして、第1ボール軌道TR1に沿って移動するようにボールキャラクタBCの速度ベクトル(vx、vy、vz)および位置座標(x、y、z)を新たに算出する。そして、CPU30は、新たな速度ベクトル(vx、vy、vz)および位置座標(x、y、z)をボールキャラクタ速度データDi1およびボールキャラクタ位置データDi2に格納して、位置座標(x、y、z)にボールキャラクタBCをモニタ2に表示する。そして、CPU30は、処理を次のステップに進める。このように、第1ボール軌道TR1は、プレイヤがコントローラ7を振り終わる前(第1の判定期間)に取得されたコントローラ7からの操作情報に応じて算出され、以降の時間経過に応じてボールキャラクタBCの位置(状態)を制御する情報(第1挙動情報)となる。
次に、CPU30は、上記ステップ92で取得した加速度データに基づいてプレイヤがコントローラ7を振る動作を終了したか否かを判断する(ステップ95)。そして、CPU30は、コントローラ7を振る動作が継続している場合、上記ステップ92に戻って処理を繰り返す。一方、CPU30は、コントローラ7を振る動作が終了している場合、処理を次のステップ54に進める。なお、ステップ95における振り判定方法については、ステップ92で取得した加速度データを用いることを除いて上述したステップ62と同様であるため、詳細な説明を省略する。
上記ステップ91〜ステップ95の処理から明らかなように、第1挙動処理とはボールキャラクタBCが打撃されてからプレイヤがコントローラ7を振り終わるまでの処理である。図24に示すように、ボールキャラクタBCが打ち返される挙動を表現する処理(ボール挙動処理)は、時刻T3以降に行われ、モーション認識処理の途中から開始される。つまり、コントローラ7を振り始めてから振り終わるまでの途中段階で判定された操作情報(加速度データ)に基づいて、ボールキャラクタBCが打ち返される様子がゲーム画像に反映されることになる。ここで、上記ステップ52のアニメーション開始処理は、アニメーション処理のうち、時刻T2〜T3で行われる処理となる。また、上記ステップ53の第1挙動処理は、ボール挙動処理のうち、時刻T3〜T4で行われる処理となる。また、後述する第2挙動処理は、プレイヤがコントローラ7を振り終わった後にボールキャラクタBCが打ち返される挙動を表現する処理であり、ボール挙動処理のうち、時刻T4以降に行われる処理となる。
図23を参照して、上記ステップ54における第2挙動処理の動作について説明する。上記ステップ95の処理の後、CPU30は、始点Psから終点Peまでの角度θ(図14参照)を算出し、始点−終点角度データDjに格納する(ステップ101)。次に、CPU30は、角度θをスピンパラメータSに変換(図15参照)し、スピンパラメータDkに格納する(ステップ102)。そして、CPU30は、最大プロット間隔データDlに格納されたデータ間隔に基づいて、第2ダミーボールの速度ベクトル(v2x、v2y、v2z)を算出し、第2ダミーボール速度データDh1に格納して(ステップ103)、処理を次のステップに進める。
ここで、第2ダミーボールの速度ベクトル(v2x、v2y、v2z)は、プレイヤキャラクタPCがテニスラケットでボールキャラクタBCを打撃した時点(図24に示す時刻T3)まで遡り、上記データ間隔(つまり、コントローラ7を振った速度)による影響を加えてボールキャラクタBCの速度ベクトルを再算出するものである。したがって、速度ベクトル(v2x、v2y、v2z)の大きさは、上記データ間隔に応じて設定される。具体的には、上記データ間隔が相対的に広いときは速度ベクトルの大きさを相対的に大きく設定し、上記データ間隔が相対的に狭いときは速度ベクトルの大きさを相対的に狭く設定する。そして、速度ベクトル(v2x、v2y、v2z)の方向は、上記ステップ91と同様に設定する。
次に、CPU30は、上記ステップ75で開始しているプレイヤキャラクタPCがボールキャラクタBCを打ち返すアニメーションを調整する処理を行ってモニタ2に表示し(ステップ104)、処理を次のステップに進める。これは、上記ステップ75(図24に示す時刻T2)ではプレイヤがコントローラ7を振った左右および上下方向および振るタイミングが判明しているだけであるため、それらの情報のみに基づいたアニメーションが開始されている。しかしながら、ステップ104(図24に示す時刻T4)ではプレイヤがコントローラ7に加えたひねり角度やコントローラ7を振った速度がさらに判明しているため、より多くの情報に基づいたアニメーションを再現できる。つまり、上記ステップ104からは、上記ステップ75から開始されているアニメーションを、ひねり角度から判明したトップスピンやバックスピンを加えるスイングや上記データ間隔から判明したスイング速度が反映されたアニメーションに調整してモニタ2に表示する。なお、プレイヤがコントローラ7を振り始めてから振り終わるまでの情報に基づいて調整されるアニメーションは、予め決められたプレイヤキャラクタPCの一連の動作であって、本発明の第2挙動情報の一例に相当する。
次に、CPU30は、ボールキャラクタ位置データDi2を参照し、ボールキャラクタBCが仮想ゲーム空間における所定の空間まで到達したか否かを判断する(ステップ105)。ここで、所定の空間とは、例えば、仮想ゲーム空間に設定された相手コート上の空間やテニスコート外(アウト)の空間である。そして、CPU30は、ボールキャラクタBCが所定の空間まで到達していない場合、処理を次のステップ106に進める。一方、CPU30は、ボールキャラクタBCが所定の空間に到達している場合、処理を次のステップ109に進める。
ステップ106において、CPU30は、第1ボール軌道TR1および第2ボール軌道TR2を算出し、第1ボール軌道TR1から第2ボール軌道TR2へボールキャラクタBCの軌道を補間する処理を行う。そして、CPU30は、補間された軌道に沿ってボールキャラクタBCを移動させてボールキャラクタ速度データDi1およびボールキャラクタ位置データDi2を更新し、当該ボールキャラクタBCをモニタ2に表示して(ステップ107)、処理を次のステップ108に進める。
図25および図26を参照して、第2ボール軌道TR2および補間処理について説明する。上記ステップ94で算出される第1ボール軌道TR1は、初期モーション認識処理で認識された情報(コントローラ7の左右および上下振り方向、振るタイミング)のみで算出されたボールキャラクタBCの軌道である。一方、第2ボール軌道TR2は、モーション認識処理全体で認識可能な情報(コントローラ7へのひねり角度および振り速度)を加えて算出されるボールキャラクタBCの軌道である。
第2ボール軌道TR2は、第1ボール軌道TR1と同様に仮想ゲーム空間に現実世界の物理法則を定義して、速度ベクトル(v2x、v2y、v2z)、位置座標(x2、y2、z2)、スピンパラメータS、および当該物理法則に基づいて算出され第2ボール軌道データDfに格納される。CPU30は、ボールキャラクタBCがプレイヤキャラクタPCのテニスラケットで打撃された位置を位置座標(x2、y2、z2)および上記ステップ103で求められた速度ベクトル(v2x、v2y、v2z)を用いて、第1ボール軌道TR1と同様に算出される軌道にスピンパラメータSの影響を加えて第2ボール軌道TR2を算出する。このように、第2ボール軌道TR2は、プレイヤがコントローラ7を振り始めてから振り終わるまで(第2の判定期間)に取得されたコントローラ7からの操作情報に応じて算出され、以降の時間経過に応じてボールキャラクタBCの位置(状態)を制御する情報(第2挙動情報)となる。
図25に示すように、プレイヤがコントローラ7に「左ひねり」を加えながら「左振り」する、またはプレイヤがコントローラ7に「右ひねり」を加えながら「右振り」すると、スピンパラメータS>0.0となって「トップスピン」が表現される。一方、プレイヤがコントローラ7に「右ひねり」を加えながら「左振り」する、またはプレイヤがコントローラ7に「左ひねり」を加えながら「右振り」すると、スピンパラメータS<0.0となって「バックスピン」が表現される。CPU30は、スピンパラメータSがトップスピンを示す場合(S>0.0)、軌道が縦方向に急降下するように変化させる。また、CPU30は、スピンパラメータSがバックスピンを示す場合(S<0.0)、縦方向に飛距離が増加するように、かつ、振り方向に応じて横方向に曲がる(「左振り」では右に曲がり、「右振り」では左に曲がる)ように軌道を変化させる。そして、CPU30は、スピンパラメータSがスピンなしを示す場合(S=0.0)、軌道にスピンパラメータSによる変化を加えない。
図24および図26に示すように、第2ボール軌道TR2は、コントローラ7が振り終わった時刻T4で算出されるため、モニタ2に表示されているボールキャラクタBCが既に第1ボール軌道TR1に沿って移動している(図26の時刻T3〜T4間の太線)。一方、プレイヤがコントローラ7をスイングして得られたデータを全て反映した軌道は第2ボール軌道TR2であるため、ボールキャラクタBCの軌道を第1ボール軌道TR1から第2ボール軌道TR2に変更して移動させるのが望ましい。したがって、プレイヤに違和感を与えずにボールキャラクタBCを第2ボール軌道TR2に沿って移動させるためには、第1ボール軌道TR1から第2ボール軌道TR2までスムーズに接続しなければならない(図26の時刻T4〜T5間の太線)。本実施例では、第1ボール軌道TR1から第2ボール軌道TR2まで接続する過程(図16に示す時刻T4〜T5)で、それぞれの軌道に沿って表示されないダミーボールを飛ばし、それらのダミーボール位置の間を補間する位置をボールキャラクタBCの位置としている。
CPU30は、第1ボール軌道TR1に沿って飛ばすダミーボールを第1ダミーボールB1とし、第1ダミーボール速度(v1x、v1y、v1z)および第1ダミーボール位置(x1、y1、z1)を第1ダミーボールのボールパラメータとする。また、CPU30は、第2ボール軌道TR2に沿って飛ばすダミーボールを第2ダミーボールB2とし、第2ダミーボール速度(v2x、v2y、v2z)および第2ダミーボール位置(x2、y2、z2)を第2ダミーボールのボールパラメータとする。そして、補間に要する時間(図26に示す時刻T5−T4)として補間時間Tiを設定する。
まず、時刻T4において、CPU30は、ボールキャラクタデータDiに格納されているボールキャラクタ速度(vx、vy、vz)およびボールキャラクタ位置(x、y、z)をそれぞれ第1ダミーボール速度(v1x、v1y、v1z)および第1ダミーボール位置(x1、y1、z1)として、第1ダミーボールデータDgに格納する。一方、第2ダミーボールデータDhに基づいて、第2ダミーボールB2を第2ボール軌道TR2に沿って時刻T4に相当する位置まで移動させ、第2ダミーボールデータDhを更新する。
時刻T4〜T5の間の時刻Tnにおいて、CPU30は、第1ダミーボールB1および第2ダミーボールB2それぞれのボールパラメータを物理計算で更新し、それぞれ第1ボール軌道TR1および第2ボール軌道TR2に沿ってフレーム毎に移動させる。そして、CPU30は、以下の数式を用いてそれらのダミーボールを補間する位置および速度を算出して、ボールキャラクタ速度データDi1およびボールキャラクタ位置データDi2を更新する(図26の時刻T4〜T5間の太線)。
ratio=(Tn−T4)÷Ti
x = x2 × ratio + x1 × (1.0 − ratio)
y = y2 × ratio + y1 × (1.0 − ratio)
z = z2 × ratio + z1 × (1.0 − ratio)
vx = v2x × ratio + v1x × (1.0 − ratio)
vy = v2y × ratio + v1y × (1.0 − ratio)
vz = v2z × ratio + v1z × (1.0 − ratio)このように、時刻T4〜T5の間のボールキャラクタ速度データDi1およびボールキャラクタ位置データDi2は、経過時刻毎の第1ダミーボールB1および第2ダミーボールB2それぞれの速度および位置を所定割合で重み付けをして平均化して求められている。
時刻T5以降では、CPU30は、第1ダミーボールB1および第2ダミーボールB2を破棄する。そして、CPU30は、現在のボールキャラクタ速度データDi1およびボールキャラクタ位置データDi2に格納された速度ベクトル(vx、vy、vz)および位置座標(x、y、z)に基づいて第2ボール軌道TR2を算出し、第2ボール軌道TR2に沿ってボールキャラクタBCを移動させてボールキャラクタ速度データDi1およびボールキャラクタ位置データDi2を更新し、当該ボールキャラクタBCをモニタ2に表示する(図26の時刻T5以降の太線)。
図23に戻り、ステップ108において、CPU30は、ボールキャラクタBCが相手キャラクタECに打ち返された、またはボールキャラクタBCがアウトになった(コート外に直接出る)か否かを判断する。そして、CPU30は、ボールキャラクタBCが相手キャラクタECに打ち返されておらず、アウトにもなっていない場合、上記ステップ106に戻って処理を繰り返す。一方、CPU30は、ボールキャラクタBCが相手キャラクタECに打ち返された。またはアウトになった場合、当該サブルーチンによる処理を終了して、上記ステップ55に処理を進める。
一方、上記ステップ105において、ボールキャラクタBCが所定の空間に到達している場合、CPU30は、ボールキャラクタBCを当該第1ボール軌道TR1に沿って移動させてモニタ2に表示し(ステップ109)、処理を次のステップに進める。CPU30は、現在のボールキャラクタ速度データDi1およびボールキャラクタ位置データDi2に格納された速度ベクトル(vx、vy、vz)および位置座標(x、y、z)に基づいて第1ボール軌道TR1を算出し、ボールキャラクタBCを当該第1ボール軌道TR1に沿って移動させてモニタ2に表示する。このステップ109は、上記ステップ94と同様の処理であるため、これ以上の説明を省略する。
次に、CPU30は、ボールキャラクタBCが相手キャラクタECに打ち返された、またはボールキャラクタBCがアウトになった(コート外に直接出る)か否かを判断する(ステップ110)。そして、CPU30は、ボールキャラクタBCが相手キャラクタECに打ち返されておらず、アウトにもなっていない場合、上記ステップ109に戻って処理を繰り返す。一方、CPU30は、ボールキャラクタBCが相手キャラクタECに打ち返された。またはアウトになった場合、当該サブルーチンによる処理を終了して、上記ステップ55に処理を進める。
このように、コントローラ7を用いてプレイヤが操作入力を行う際、当該操作入力を判定する期間途中でゲームオブジェクトの状態に対して当該操作入力を反映させる処理を開始するため、操作入力に対する遅延を解消でき、操作感が損なわれることがない。また、上記判定する期間終了後に上記期間途中の後に取得した操作入力もゲームオブジェクトの状態に対して反映させる処理を行うため、プレイヤが行った操作入力を正確に反映した処理を行いながら、リアルタイムな演出が可能となる。
なお、第1ボール軌道TR1、第2ボール軌道TR2、およびプレイヤキャラクタPCのアニメーションを設定するために用いられる操作情報を取得する期間として、プレイヤがコントローラ7を振り始めてからモーション認識処理途中で振り方向が判定されるまでの期間(第1の判定期間)と、プレイヤがコントローラ7を振り始めてから振り終わるまでの期間(モーション認識処理全期間;第2の判定期間)とを設定した。しかしながら、他の基準で判定期間を設定してもかまわない。
例えば、モーション認識処理を行う期間に対して、3つ以上の判定期間を設定し、それぞれの判定期間中に取得された操作情報をゲームオブジェクトの状態に反映させてもかまわない。この場合、設定された判定期間に応じて、それぞれボール軌道等が設定されるため、ゲームオブジェクトの状態を変更するための挙動情報がさらに多く設定されることになる。例えば、フレーム毎(ゲーム処理単位毎)に判定期間を設定することによって挙動情報を連続的に設定して、ゲームオブジェクトの状態を連続的に変更してもかまわない。
また、1つの判定期間が分割されていてもかまわない。例えば、上述したコントローラ7のひねり動作の判別は、始点Psと終点Peとを用いて行われるため、ひねり動作のみを判別するための判定期間としてはプレイヤがコントローラ7を振り始めた時点と振り終わった時点だけでもかまわない。この場合、ひねり動作のみを判別するための判定期間は、プレイヤがコントローラ7を振り始めた時点を含む期間と振り終わった時点を含む期間との2つの期間で設定される。
さらに、モーション認識処理に対して設定される複数の判定期間は、一部の期間が重複して設定されてもいいし、重複期間なく互いに連続して設定されてもいいし、判定期間の間に所定の期間をおいて離れて設定されてもかまわない。本発明で設定される判定期間は、モーション認識処理を行う期間に対して設定されるものであり、それらの判定期間中に得られた操作情報をリアルタイムにゲームオブジェクトの状態に反映させればよい。なお、本発明の第2の判定期間は、少なくとも第1の判定期間以降に終了し、第1の判定期間で取得する操作情報より時系列的に新しい操作情報を取得できる期間として設定される。
また、上述した処理手順では、第1ボール軌道TR1および第2ボール軌道TR2の算出をフレーム毎に行う(つまり、ステップ94、ステップ106、およびステップ109で処理ループの中で行う)ように説明したが、他の手順で軌道計算をしてもかまわない。例えば、1度算出された第1ボール軌道TR1および第2ボール軌道TR2をメモリに記憶しておき、適宜記憶された軌道データを利用してもかまわない。この場合、処理ループの前(例えば、ステップ91の後、ステップ103の後)に第1ボール軌道TR1および/または第2ボール軌道TR2を算出しておけば、フレーム毎に軌道計算をする必要がなくなる。
また、上述した説明では、コントローラ7から出力される3軸加速度データを用いてテニスゲームを行う例を説明したが、他のゲーム処理にも用いることができる。例えば、プレイヤキャラクタが何らかのオブジェクトを振るゲーム(卓球、バドミントン、野球、剣で斬る等)に適用できることは言うまでもない。また、上述した説明では、コントローラ7の動きを判別するゲーム装置をゲームシステム1に適用した例を説明したが、加速度センサを備えた入力装置によって操作される一般的なパーソナルコンピュータなどの情報処理装置にも適用することができる。例えば、判別された入力装置の動きに応じて、情報処理装置が表示しているデータが移動したり、情報処理装置が情報を表示しているページを変更したり、図形を描いたりする等、情報処理装置による判別結果に基づいて様々な処理を行うことができる。さらに、ゲーム装置は、判別した入力装置の動きに応じて、当該入力装置の動きを示す動きデータを作成して他の装置に出力してもかまわない。
また、コントローラ7に設けられた加速度センサ701は、好ましくは互いに直交する3軸成分に分けてそれぞれ検出して出力する3軸加速度センサを用いて説明したが、少なくとも直交する2軸成分をそれぞれ検出する加速度センサを用いてもかまわない。例えば、コントローラ7が配置された3次元空間における加速度をXおよびY軸(図3、図4参照)の2軸成分に分けてそれぞれ検出して出力する加速度センサを用いても、上述した左右振り方向の判定やひねり方向の判定を行うことができる。この場合、上述した説明でZ軸成分の加速度を用いて判定していた振り始めおよび振り終わりの判定ができなくなるが、XおよびY軸に対する加速度成分から得られる左右振りによって生じる遠心力成分を用いて振り始めおよび振り終わりを判定してもいいし、加速度センサ701とは異なる他のセンサを用いて振り始めおよび振り終わりを判定してもかまわない。また、プレイヤがコントローラ7をスイングするときは操作ボタン72の何れかを押下するようなゲームルールを設定して、当該操作ボタン72の何れかが押下されている期間に応じて振り始めおよび振り終わりを判定してもかまわない。
また、上述した説明では、プレイヤがコントローラ7の本体を動かすことを入力の一例とし、そのコントローラ7の動きに応じた加速度データの推移を用いてゲームオブジェクトの状態を変化させるゲームを用いて説明したが、他の態様でもかまわない。例えば、プレイヤがコントローラ7の本体を動かすことを入力とし、撮像情報演算部74(図6参照)から出力される処理結果データの推移を用いてゲームオブジェクトの状態を変化させるゲームでもかまわない。撮像情報演算部74から出力される処理結果データは、上記加速度データと同様にコントローラ7の動きに応じて変化するため、同様に本発明に用いることができる。また、コントローラ7の動きを判定する位置センサ等の他のセンサを、コントローラ7に内蔵またはコントローラ7の外部に設置し、当該センサからの出力の推移を用いてゲームオブジェクトの状態を変化させるゲームでもかまわない。
また、上述した説明では、コントローラ7とゲーム装置3とが無線通信によって接続された態様を用いたが、コントローラ7とゲーム装置3とがケーブルを介して電気的に接続されてもかまわない。この場合、コントローラ7に接続されたケーブルをゲーム装置3の接続端子に接続する。
また、コントローラ7から無線送信される送信データを受信する受信手段として、ゲーム装置3の接続端子に接続された受信ユニット6を用いて説明したが、ゲーム装置3の本体内部に設けられた受信モジュールによって当該受信手段を構成してもかまわない。この場合、受信モジュールが受信した送信データは、所定のバスを介してCPU30に出力される。
また、上述したコントローラ7の形状や、それらに設けられている操作部72の形状、数、および設置位置等は、単なる一例に過ぎず他の形状、数、および設置位置であっても、本発明を実現できることは言うまでもない。また、コントローラ7における撮像情報演算部74の位置(撮像情報演算部74の光入射口)は、ハウジング71の前面でなくてもよく、ハウジング71の外部から光を取り入れることができれば他の面に設けられてもかまわない。