図1を参照して、この発明の一実施例であるゲームシステム10は、ビデオゲーム装置(以下、単に「ゲーム装置」ということがある。)12およびコントローラ14を含む。コントローラ14は、ユーザないしプレイヤの入力装置ないし操作装置として機能する。ゲーム装置12とコントローラ14とは無線によって接続される。たとえば、無線通信は、Bluetooth(登録商標)規格に従って実行されるが、赤外線や無線LANなど他の規格に従って実行されてもよい。
ゲーム装置12は、略直方体のハウジング16を含み、ハウジング16の前面にはディスクスロット18および外部メモリカードスロットカバー20が設けられる。ディスクスロット18から、ゲームプログラムおよびデータを記憶した情報記憶媒体の一例である光ディスク22が挿入されて、ハウジング16内のディスクドライブ74(図10)に装着される。外部メモリカードスロットカバー20の内側には外部メモリカード用コネクタ48(図10)が設けられており、その外部メモリカード用コネクタ48には外部メモリカード(図示せず)が挿入される。メモリカードは、光ディスク22から読み出したゲームプログラム等をローディングして一時的に記憶したり、このゲームシステム10を利用してプレイされたゲームのゲームデータ(結果データまたは途中データ)を保存(セーブ)しておいたりするために利用される。また、上記ゲームデータの保存は、外部メモリカードに代えて、たとえばフラッシュメモリ64(図10)等の内部メモリに対して行うようにしてもよい。
ゲーム装置12のハウジング16の後面には、AVケーブルコネクタ(図示せず)が設けられ、当該コネクタを用いて、ゲーム装置12はAVケーブル24を介してモニタ(ディスプレイ)26に接続される。このモニタ26は典型的にはカラーテレビジョン受像機であり、AVケーブル24は、ゲーム装置12からの映像信号をカラーテレビのビデオ入力端子に入力し、音声信号を音声入力端子に入力する。したがって、カラーテレビ(モニタ)26の画面上にたとえば3Dビデオゲームのゲーム画像が表示され、内蔵されるスピーカ28からゲーム音楽や効果音などのステレオゲーム音声が出力される。
また、モニタ26の周辺(この実施例では、モニタ26の上側)には、2つの赤外LED(マーカ)30aおよび30bを備えるマーカ部30が設けられる。このマーカ部30は、電源ケーブル(図示せず)を通してゲーム装置12に接続される。したがって、マーカ部30には、ゲーム装置12から電源が供給される。これによって、マーカ30a,30bは発光し、それぞれモニタ26の前方に向けて赤外光を出力する。
なお、ゲーム装置12の電源は、一般的なACアダプタ(図示せず)によって与えられる。ACアダプタは家庭用の標準的な壁ソケットに接続され、家庭用電源を、ゲーム装置12を駆動するのに適した低いDC電圧信号に変換する。他の実施例では、電源としてバッテリが用いられてもよい。
コントローラ14は、詳細は後述されるが、それぞれが片手で把持可能な第1コントローラ34および第2コントローラ36と、第1コントローラ34に着脱可能に装着されるジャイロセンサユニット100とを含む。第1コントローラ34の後端面にはコネクタ42(図2(A)、図11)が設けられ、第2コントローラ36の後端から延びるケーブル38の先端にはコネクタ40(図1、図5、図11)が設けられ、そしてジャイロセンサユニット100の先端面および後端面にはコネクタ106および108(図6(A)、図6(B)、図7および図11)がそれぞれ設けられる。ジャイロセンサユニット100の先端面側のコネクタ106は第1コントローラ34のコネクタ42と接続可能であり、第2コントローラ36のコネクタ40は第1コントローラ34のコネクタ42またはジャイロセンサユニット100の後端面側のコネクタ108と接続可能である。
コネクタ106をコネクタ42に接続することで、ジャイロセンサユニット100は、第1コントローラ34と物理的および電気的に結合される。こうして第1コントローラ34に装着(一体化)されたジャイロセンサユニット100からは、第1コントローラ34の角速度を示す角速度データが出力される。
こうして第1コントローラ34にジャイロセンサユニット100が装着された場合、第2コントローラ36のコネクタ40は、ジャイロセンサユニット100の後端面側のコネクタ108に接続される。すなわち、コネクタ42は、コネクタ106とコネクタ40の両者を選択的に接続可能な構造であって、コネクタ40は、コネクタ42とコネクタ108の両者に選択的に接続可能な構造である。したがって、ジャイロセンサユニット100に設けられるコネクタ106とコネクタ108とは、同一のハウジングに設けられるため実際は接続できないが、コネクタの形状としては互いに接続可能な形状をしていることになる。第2コントローラ36の入力データは、ケーブル38およびジャイロセンサユニット100を介して第1コントローラ34に与えられる。第1コントローラ34は、第1コントローラ34自身の入力データと、ジャイロセンサユニット100からの角速度データと、第2コントローラ36の入力データとを含むコントローラデータをゲーム装置12に送信する。
なお、コネクタ40をコネクタ42に接続した場合には、第2コントローラ36の操作データないし入力データはケーブル38を介して第1コントローラ34に与えられ、第1コントローラ34は、第1コントローラ34自身の入力データと第2コントローラ36の入力データとを含むコントローラデータをゲーム装置12に送信する。
このとき、第1コントローラ34の入力データと、第2コントローラ36の入力データを送信するシステムにおいて、一度に送信するデータ量を追加することができないように設計されている場合もあるが、ジャイロセンサユニット100を追加した場合に、ジャイロセンサユニット100からの角速度データと、第2コントローラ36からの入力データとを交互に第1コントローラ36へ出力することによって、両者のデータを送信することができる。このデータ制御はジャイロセンサユニット100で行うことができるので、第1コントローラ34や第2コントローラ36には何ら設計の変更をする必要がない。
このように、第1コントローラ34がゲーム装置12から離れて、無線などによって、そのコントローラ34の操作信号や操作データ(データ)だけでなく、第2コントローラ36やジャイロセンサユニット100からの操作信号や操作データ(データ)を、ゲーム装置12に対して入力するので、第1コントローラ34を以下において、「リモコン」と呼ぶこともある。また、第2コントローラ36は、その形態から「ヌンチャク」と愛称されているので、以下において、そのように呼ぶこともある。
このように、ジャイロセンサユニット100は、既存の第1コントローラ34および第2コントローラ36をそのまま利用しながら、第1コントローラ34にジャイロ機能を付加するための拡張ユニットである。
このゲームシステム10において、ゲーム(または他のアプリケーション)をプレイするために、ユーザはまずゲーム装置12の電源をオンし、次いで、ユーザはビデオゲーム(もしくは実行したいと思う他のアプリケーション)を記憶している適宜の光ディスク22を選択し、その光ディスク22をゲーム装置12のディスクスロット18からディスクドライブ74にローディングする。これに応じて、ゲーム装置12がその光ディスク22に記憶されているソフトウェアに基づいてビデオゲームもしくは他のアプリケーションを実行し始めるようにする。ユーザはゲーム装置12に入力を与えるためにコントローラ14を操作する。
図2にはリモコンまたは第1コントローラ34の外観の一例が示される。図2(A)は、第1コントローラ34を上面後方から見た斜視図であり、図2(B)は、第1コントローラ34を下面前方から見た斜視図である。
第1コントローラ34は、たとえばプラスチック成型によって形成されたハウジング44を有している。ハウジング44は、その前後方向(Z軸方向)を長手方向とした略直方体形状を有しており、全体として大人や子供の片手で把持可能な大きさである。一例として、ハウジング44は人間の掌とほぼ同じ長さまたは幅を持つ大きさをしている。プレイヤは、第1コントローラ34を用いて、それに設けられたボタンを押下することと、第1コントローラ34自体の位置や向きを変えることとによって、ゲーム操作を行うことができる。
ハウジング44には、複数の操作ボタンが設けられる。すなわち、ハウジング44の上面には、十字キー46a、1(いち)ボタン46b、2(に)ボタン46c、Aボタン46d、−(マイナス)ボタン46e、ホーム(HOME)ボタン46f、および+(プラス)ボタンないしスタートボタン46gが設けられる。一方、ハウジング44の下面には凹部が形成されており、当該凹部の後方側傾斜面にはBボタン46hが設けられる。これら各ボタン(スイッチ)46a−46hには、ゲーム装置12が実行するゲームプログラムに応じてそれぞれ適宜な機能が割り当てられる。また、ハウジング44の上面には、遠隔からゲーム装置12本体の電源をオン/オフするための電源スイッチ46iが設けられる。第1コントローラ34に設けられる各ボタン(スイッチ)は、包括的に参照符号46を用いて操作手段または入力手段として示されることもある。
十字キー46aは、4方向プッシュスイッチであり、矢印で示す4つの方向、前(または上)、後ろ(または下)、右および左の操作部を含む。この操作部のいずれか1つを操作することによって、プレイヤによって操作可能なキャラクタまたはオブジェクト(プレイヤキャラクタまたはプレイヤオブジェクト)の移動方向を指示したり、カーソルの移動方向を指示したり、単に方向を指示したりすることができる。
1ボタン46bおよび2ボタン46cは、それぞれ、押しボタンスイッチである。たとえば3次元ゲーム画像を表示する際の視点位置や視点方向、すなわち仮想カメラの位置や画角を調整する等のゲームの操作に使用される。または、1ボタン46bおよび2ボタン46cは、Aボタン46dおよびBボタン46hと同じ操作或いは補助的な操作をする場合に用いるようにしてもよい。
Aボタンスイッチ46dは、押しボタンスイッチであり、プレイヤキャラクタまたはプレイヤオブジェクトに、方向指示以外の動作、すなわち、打つ(パンチ)、投げる、つかむ(取得)、乗る、ジャンプするなどの任意のアクションをさせるために使用される。たとえば、アクションゲームにおいては、ジャンプ、パンチ、武器を動かすなどを指示することができる。また、ロールプレイングゲーム(RPG)やシミュレーションRPGにおいては、アイテムの取得、武器やコマンドの選択および決定等を指示することができる。また、Aボタンスイッチ46dは、コントローラ34をポインティングデバイスとして用いる場合に、ゲーム画面上でポインタ(指示画像)が指示するアイコンないしボタン画像の決定を指示するために使用される。たとえば、アイコンやボタン画像が決定されると、これらに対応して予め設定されている指示ないし命令(コマンド)を入力することができる。
−ボタン46e、ホームボタン46f、+ボタン46gおよび電源スイッチ46iもまた、押しボタンスイッチである。−ボタン46eは、ゲームモードを選択するために使用される。ホームボタン46fは、ゲームメニュー(メニュー画面)を表示するために使用される。+ボタン46gは、ゲームを開始(再開)したり、一時停止したりするなどのために使用される。電源スイッチ46iは、ゲーム装置12の電源を遠隔操作によってオン/オフするために使用される。
なお、この実施例では、コントローラ34自体をオン/オフするための電源スイッチは設けておらず、コントローラ34の操作手段ないし入力手段46のいずれかを操作することによってコントローラ34はオンとナリ、一定時間(たとえば、30秒)以上操作しなければ自動的にオフとなるようにしてある。
Bボタン46hもまた、押しボタンスイッチであり、主として、弾を撃つなどのトリガを模した入力を行ったり、コントローラ34で選択した位置を指定したりするために使用される。また、Bボタン46hを押し続けると、プレイヤオブジェクトの動作やパラメータを一定の状態に維持することもできる。また、一定の場合には、Bボタン46hは、通常のBボタンと同様に機能し、Aボタン46dによって決定したアクションやコマンドなどを取り消すなどのために使用される。
ハウジング44内には、図2に示すX、YおよびZの3軸方向(すなわち左右方向、上下方向および前後方向)の加速度を検出する加速度センサ84(図11)が設けられる。なお、加速度センサ84としては、ハウジング44の形状または第1コントローラ34の持たせ方の限定等に応じて、上下方向、左右方向および前後方向のうちいずれか2方向の加速度を検出する2軸加速度センサが用いられてもよい。場合によっては1軸加速度センサが用いられてもよい。
ハウジング44の前面には光入射口44bが形成され、ハウジング44内には撮像情報演算部50がさらに設けられる。撮像情報演算部50は、赤外線を撮像するカメラと撮像対象の画像内での座標を算出する演算部とによって構成され、上述のマーカ30aおよび30bを含む被写界を赤外線で捉えて、マーカ30aおよび30bの被写界内における位置座標を算出する。
また、ハウジング44の後面には、上述のコネクタ42が設けられている。コネクタ42は、第1コントローラ34に他の機器を接続するために利用される。この実施例では、コネクタ42には第2コントローラ36のコネクタ40またはジャイロセンサユニット100のコネクタ106が接続される。
ハウジング44の後面にはまた、コネクタ42を左右(X軸方向)に挟んで対向する位置に、一対の孔48aおよび48bが形成されている。この一対の孔48aおよび48bは、ジャイロセンサユニット100をハウジング44の後面に固定するためのフック112Faおよび112Fb(図6(A))が挿入される。ハウジング44の後面にはさらに、ストラップ56(図5)を装着するための孔48cも形成されている。
図3にはヌンチャクまたは第2コントローラ36の本体の外観の一例が示される。図3(A)は、第2コントローラ36を上面後方から見た斜視図であり、図3(B)は、第2コントローラ36を下面前方から見た斜視図である。なお、図3では、第2コントローラ36のケーブル38は省略されている。
第2コントローラ36は、たとえばプラスチック成型によって形成されたハウジング52を有している。ハウジング52は、平面視では、前後方向(Z軸方向)に略細長い楕円形状を有し、後端側の左右方向(X軸方向)の幅が先端側のそれよりも狭くされている。また、ハウジング52は、側面視では、全体として湾曲した形状を有しており、先端側の水平部分から後端側に向かって下がるように湾曲している。ハウジング52は、第1コントローラ34と同様に、全体として大人や子供の片手で把持可能な大きさであるが、長手方向(Z軸方向)の長さは、第1コントローラ34のハウジング44よりもやや短くされている。この第2コントローラ36でも、プレイヤは、ボタンやスティックを操作することと、コントローラ自体の位置や向きを変えることとによって、ゲーム操作を行うことができる。
ハウジング52の上面の先端側には、アナログジョイスティック54aが設けられる。ハウジング52の先端には、後方にやや傾斜する先端面が設けられており、この先端面には、上下方向(図3に示すY軸方向)に並べて、Cボタン54bおよびZボタン54cが設けられる。アナログジョイスティック54aおよび各ボタン54b,54cには、ゲーム装置12が実行するゲームプログラムに応じてそれぞれ適宜な機能が割り当てられる。第2コントローラ36に設けられるアナログジョイスティック54aおよび各ボタン54b,54cは、包括的に参照符号54を用いて示されることもある。
また、第2コントローラ36のハウジング52内には加速度センサ86(図11)が設けられている。この加速度センサ86としては、第1コントローラ34の加速度センサ84と同様の加速度センサが適用される。具体的には、この実施例では3軸加速度センサが適用され、第2コントローラ36の上下方向(Y軸方向)、左右方向(X軸方向)および前後方向(Z軸方向)の3軸方向のそれぞれで加速度を検知する。したがって、第1コントローラ34の場合と同様に、検出された加速度に適宜な演算処理を施すことによって、第2コントローラ36の傾きや回転、重力方向に対する加速度センサ86の姿勢などを算出することができる。また、振り等によって第1コントローラ34に加えられた動きについても同様に算出することができる。
図4には第2コントローラ36のコネクタ40の外観の一例が示される。図4は、コネクタ40を下面前方から見た斜視図である。なお、ここでもケーブル38は省略されている。コネクタ40は、たとえばプラスチック成型によって形成されたハウジング122を有する。ハウジング122の下面にはフック124が設けられている。このフック124は、本来的には、図5に示すように、コネクタ40を第1コントローラ34(のコネクタ42)と直に接続した場合に、第1コントローラ34に装着されたストラップ56のひもを掛け止めるためのものである。
図6にはジャイロセンサユニット100の外観の一例が示される。図6(A)は、ジャイロセンサユニット100を上面前方から見た斜視図であり、図6(B)は、ジャイロセンサユニット100を下面後方から見た斜視図である。
ジャイロセンサユニット100は、たとえばプラスチック成型によって形成されたハウジング110を有している。ハウジング110は、略直方体形状を有しており、その長さは第1コントローラ34のハウジング44の長さのおよそ1/5、その幅および厚みはハウジング44の幅および厚みとほぼ同じである。プレイヤは、第1コントローラ34にジャイロセンサユニット100を装着した状態でも、第1コントローラ34自体の位置や向きを変えることによって、ゲーム操作を行うことができる。
ハウジング110の前面および後面には上述のコネクタ106および108が、ハウジング110の両側面には一対のリリースボタン112aおよび112bが、そしてハウジング110の下面にはロックスイッチ114が、それぞれ設けられている。ハウジング110の前面下端から下面先端にかけては、第1コントローラ34にジャイロセンサユニット100を装着した状態でストラップ56用の孔48cが露見するように(図8)、略球面状の凹部110aが設けられている。
ハウジング110の前面にはまた、コネクタ106を挟んで横方向(X軸方向)に対向する位置に、一対のリリースボタン112aおよび112bとそれぞれ連繋する一対のフック112Faおよび112Fbが設けられている。ジャイロセンサユニット100を第1コントローラ34に装着するべく、コネクタ106をコネクタ42に接続すると、一対のフック112Faおよび112Fbはハウジング44後面の一対の孔48aおよび48b(図2(A))に挿入され、フック112Faおよび112Fbの爪がハウジング44の内壁に引っ掛かる。これによって、ジャイロセンサユニット100は、第1コントローラ34の後面に固定される。
こうして第1コントローラ34に装着されたジャイロセンサユニット100が図8に示される。この状態で一対のリリースボタン112aおよび112bを押せば、爪の引っ掛かりは解け、ジャイロセンサユニット100を第1コントローラ34から取り外せるようになる。
ロックスイッチ114は、このようなリリースボタン112aおよび112bにロックをかけるためのスライドスイッチである。リリースボタン112aおよび112bは、ロックスイッチ114が第1位置(たとえば後ろ寄り)にあるとき押下不能(ロック状態)であり、ロックスイッチ114が第2位置(たとえば前寄り)にあるとき押下可能(解除状態)である。ハウジング110内には、ロックバネ118aおよび118b(図7)が設けられ、リリースボタン112aおよび112bを押下すると反発するように構成され、押下されていないときは爪が引っ掛かった状態を維持するように構成されている。このため、ジャイロセンサユニット100を取り外すには、ユーザは、ロックスイッチ114を第1位置から第2位置にスライドさせたうえで、リリースボタン112aおよび112bを押す必要がある。
このように、ジャイロセンサユニット100は、第1コントローラ34の後面に装着されるため、ゲーム操作中にジャイロセンサユニット100に加わる遠心力は専ら、ジャイロセンサユニット100を第1コントローラ34に押し付けるように作用する。また、ジャイロセンサユニット100をフック112Faおよび112Fbで第1コントローラ34の後面に固定する一方、フック112Faおよび112Fbを開放するためリリースボタン112aおよび112bにはロックスイッチ114を設けたため、ジャイロセンサユニット100を第1コントローラ34に固定することができる。
ハウジング110の後面にはまた、コネクタ108に装着されるコネクタカバー116を収納可能な凹部110bが、このコネクタ108の周囲に形成される。コネクタカバー116は、その主面の一方端部に、前後(Z軸方向)に長細い薄手の(すなわち曲折容易な)突起116aを有する。この突起116aの先端部分がハウジング110と係合されており、コネクタカバー116は、コネクタ108から取り外された状態でもハウジング110に係留される。
コネクタカバー116はまた、その主面の他方端部に、左右(X軸方向)に長細い厚手の(すなわち曲折困難な)突起116bを有する。突起116bの厚み(Z軸方向の高さ)は、第2コントローラ36のコネクタ40に設けられたフック124(図4)の厚み(Y軸方向の高さ)とほぼ同じである。第1コントローラ34にジャイロセンサユニット100を介して第2コントローラ36が接続された場合、コネクタカバー116は、図9に示すように、その主面が水平となって、突起116bがフック124の側面と係合される。コネクタ108から取り外されたコネクタカバー116をこうしてコネクタ40と一体化することで、操作性や見た目が改善されるだけでなく、コネクタ40をジャイロセンサユニット100に固定することができる。
図7にはジャイロセンサユニット100の構成の一例が示される。ジャイロセンサユニット100は、上述したハウジング110、コネクタ106および108、リリースボタン112aおよび112b、フック112Faおよび112Fb、ロックスイッチ114、コネクタカバー116ならびにロックバネ118aおよび118bに加え、ジャイロ基板120および支持部材126を備える。ジャイロ基板120はコネクタ106および108の各々と信号線で接続され、支持部材126はジャイロ基板120ならびにコネクタ106および108を支持する。
ジャイロ基板120にはジャイロセンサ104が設けられる。ジャイロセンサ104は、1軸のジャイロセンサ104aおよび2軸のジャイロセンサ104bの2チップで構成される。ジャイロセンサ104aはヨー角に関する角速度(Y軸周りの角速度)を検出するためのものであり、ジャイロセンサ104bはロール角およびピッチ角に関する2つの角速度(Z軸周りの角速度およびX軸周りの角速度)を検出するためのものである。ジャイロセンサ104aおよび104bは、ジャイロ基板120の上面120aに水平に並べて設けられる。
なお、ジャイロセンサ104aおよび104bの配置は、図7に示されたものに限らない。他の実施例では、ジャイロセンサ104aは、ジャイロ基板120の上面120aおよび下面120bの一方に水平に設けられ、ジャイロセンサ104bは、ジャイロ基板120の上面120aおよび下面120bの他方に水平に、ジャイロ基板120を挟んでジャイロセンサ104aと対向するように設けられる。その他の実施例では、ジャイロセンサ104aはジャイロ基板120の上面120aおよび下面120bの一方に垂直に設けられ、ジャイロセンサ104bはジャイロ基板120の上面120aおよび下面120bの他方に水平に設けられる。
また、ジャイロセンサ104は、2チップ構成とは限らず、3個の1軸ジャイロセンサ(3チップ)で構成してもよく、1個の3軸ジャイロセンサ(1チップ)で構成してもよい。いずれの場合も、上述の3つの角速度を適正に検出できるように、各チップの位置や向きが決定される。さらにまた、場合によっては、ジャイロセンサ104は、1個の2軸ジャイロセンサで構成しても、2個または1個の1軸ジャイロセンサで構成してもよい。
なお、図2に示した第1コントローラ34、図3および図4に示した第2コントローラ36、および図6に示したジャイロセンサユニット100の形状や、ボタン(スイッチまたはスティック等)の形状、数および設置位置等は単なる一例に過ぎず、他の形状、数および設置位置等に適宜変更され得る。
なお、センサは、好ましい実施例ではジャイロセンサ(角速度センサ)であるが、たとえば加速度センサ、速度センサ、変位センサ、回転角センサなど、他のモーションセンサでもよい。モーションセンサ以外にも、傾斜センサ、イメージセンサ、光センサ、圧力センサ、磁気センサ、温度センサなどがあり、いずれのセンサを追加する場合でも、センサの検出対象を利用した操作が可能となる。いずれのセンサを用いた場合でも、従来操作装置に接続されていた他の装置をそのまま使用しながら、操作装置に当該センサを追加することができる。
また、コントローラ14の電源は、第1コントローラ34内に取替可能に収容されるバッテリ(図示せず)によって与えられる。第2コントローラ36には、コネクタ40およびケーブル38を介してこの電源が供給される。第1コントローラ34にジャイロセンサユニット100が接続されている場合、ジャイロセンサユニット100にはコネクタ42および106を介してこの電源が供給される。さらにジャイロセンサユニット100に第2コントローラ36が接続されていれば、第1コントローラ34からジャイロセンサユニット100に供給された電源の一部は、コネクタ108、コネクタ40およびケーブル38を介して第2コントローラ36にも与えられる。
図10は図1実施例のビデオゲームシステム10の電気的な構成を示すブロック図である。図示は省略するが、ハウジング16内の各コンポーネントは、プリント基板に実装される。図2に示すように、ゲーム装置12には、CPU60が設けられ、ゲームプロセッサとして機能する。また、CPU60には、システムLSI62が接続される。このシステムLSI62には、外部メインメモリ66、ROM/RTC68、ディスクドライブ74およびAV IC76が接続される。
外部メインメモリ66は、ゲームプログラム等のプログラムを記憶したり、各種データを記憶したりして、CPU60のワーク領域やバッファ領域として用いられる。ROM/RTC68は、いわゆるブートROMであり、ゲーム装置12の起動用のプログラムが組み込まれるとともに、時間をカウントする時計回路が設けられる。ディスクドライブ74は、光ディスク22からプログラム,画像データや音声データ等を読み出し、CPU60の制御の下で、後述する内部メインメモリ62eまたは外部メインメモリ66に書き込む。
システムLSI62には、入出力プロセッサ62a、GPU(Graphics Processor Unit)62b,DSP(Digital Signal Processor)62c,VRAM62dおよび内部メインメモリ62eが設けられ、図示は省略するが、これらは内部バスによって互いに接続される。入出力プロセッサ(I/Oプロセッサ)62aは、データの送受信を実行したり、データのダウンロードを実行したりする。データの送受信やダウンロードについては後述する。
GPU62bは、描画手段の一部を形成し、CPU60からのグラフィクスコマンド(作画命令)を受け、そのコマンドに従ってゲーム画像データを生成する。ただし、CPU60は、グラフィクスコマンドに加えて、ゲーム画像データの生成に必要な画像生成プログラムをGPU62bに与える。
図示は省略するが、上述したように、GPU62bにはVRAM62dが接続される。GPU62bが作画コマンドを実行するにあたって必要なデータ(画像データ:ポリゴンデータやテクスチャデータなどのデータ)は、GPU62bがVRAM62dにアクセスして取得する。ただし、CPU60は、描画に必要な画像データを、GPU62bを介してVRAM62dに書き込む。GPU62bは、VRAM62dにアクセスして描画のためのゲーム画像データを作成する。
なお、この実施例では、GPU62bがゲーム画像データを生成する場合について説明するが、ゲームアプリケーション以外の任意のアプリケーションを実行する場合には、GPU62bは当該任意のアプリケーションについての画像データを生成する。
また、DSP62cは、オーディオプロセッサとして機能し、内部メインメモリ62eや外部メインメモリ66に記憶されるサウンドデータや音波形(音色)データを用いて、スピーカ28から出力する音、音声或いは音楽に対応するオーディオデータを生成する。
上述のように生成されたゲーム画像データおよびオーディオデータは、AV IC76によって読み出され、AVコネクタ78を介してモニタ26およびスピーカ28に出力される。したがって、ゲーム画面がモニタ26に表示され、ゲームに必要な音(音楽)がスピーカ28から出力される。
また、入出力プロセッサ62aには、フラッシュメモリ64、無線通信モジュール70および無線コントローラモジュール72が接続されるとともに、拡張コネクタ80およびメモリカード用コネクタ82が接続される。また、無線通信モジュール70にはアンテナ70aが接続され、無線コントローラモジュール72にはアンテナ72aが接続される。
図示は省略するが、入出力プロセッサ62aは、無線通信モジュール70を介して、ネットワークに接続される他のゲーム装置や各種サーバと通信することができる。ただし、ネットワークを介さずに、直接的に他のゲーム装置と通信することもできる。入出力プロセッサ62aは、定期的にフラッシュメモリ64にアクセスし、ネットワークへ送信する必要があるデータ(「送信データ」とする)の有無を検出し、当該送信データが有る場合には、無線通信モジュール70およびアンテナ70aを介してネットワークに送信する。また、入出力プロセッサ62aは、他のゲーム装置から送信されるデータ(「受信データ」とする)を、ネットワーク、アンテナ70aおよび無線通信モジュール70を介して受信し、当該受信データをフラッシュメモリ64に記憶する。ただし、受信データが一定の条件を満たさない場合には、当該受信データはそのまま破棄される。さらに、入出力プロセッサ62aは、ダウンロードサーバからダウンロードしたデータ(ダウンロードデータとする)をネットワーク、アンテナ70aおよび無線通信モジュール70を介して受信し、そのダウンロードデータをフラッシュメモリ64に記憶する。
また、入出力プロセッサ62aは、コントローラ34から送信される入力データをアンテナ72aおよび無線コントローラモジュール72を介して受信し、内部メインメモリ62eまたは外部メインメモリ66のバッファ領域に記憶(一時記憶)する。入力データは、CPU60の処理(たとえば、ゲーム処理)によって利用された後、バッファ領域から消去される。
なお、この実施例では、上述したように、無線コントローラモジュール72は、Bluetooth規格に従ってコントローラ34との間で通信を行う。このため、コントローラ14からデータを取得するだけでなく、ゲーム装置12からコントローラ14に所定の命令を送信し、コントローラ14の動作をゲーム装置12から制御することもできる。
さらに、入出力プロセッサ62aには、拡張コネクタ80およびメモリカード用コネクタ82が接続される。拡張コネクタ80は、USBやSCSIのようなインタフェースのためのコネクタであり、外部記憶媒体のようなメディアを接続したり、コントローラ34とは異なる他のコントローラのような周辺機器を接続したりすることができる。また、拡張コネクタ80に有線LANアダプタを接続し、無線通信モジュール70に代えて当該有線LANを利用することもできる。メモリカード用コネクタ82には、メモリカードのような外部記憶媒体を接続することができる。したがって、たとえば、入出力プロセッサ62aは、拡張コネクタ80やメモリカード用コネクタ82を介して、外部記憶媒体にアクセスし、データを保存したり、データを読み出したりすることができる。
詳細な説明は省略するが、電源ボタンがオンされると、システムLSI62には、ゲーム装置12の各コンポーネントに図示しないACアダプタを経て電源が供給され、通常の通電状態となるモード(「通常モード」と呼ぶこととする)が設定される。一方、電源ボタンがオフされると、システムLSI62には、ゲーム装置12の一部のコンポーネントのみに電源が供給され、消費電力を必要最低限に抑えるモード(以下、「スタンバイモード」という)が設定される。
この実施例では、スタンバイモードが設定された場合には、システムLSI62は、入出力プロセッサ62a、フラッシュメモリ64、外部メインメモリ66、ROM/RTC68および無線通信モジュール70、無線コントローラモジュール72以外のコンポーネントに対して、電源供給を停止する指示を行う。したがって、この実施例では、スタンバイモードにおいて、CPU60がアプリケーションを実行することはない。
なお、システムLSI62には、スタンバイモードにおいても電源が供給されるが、GPU62b、DSP62cおよびVRAM62dへのクロックの供給を停止することにより、これらを駆動しないようにして、消費電力を低減するようにしてある。
また、図示は省略するが、ゲーム装置12のハウジング16内部には、CPU60やシステムLSI62などのICの熱を外部に排出するためのファンが設けられる。スタンバイモードでは、このファンも停止される。
ただし、スタンバイモードを利用したくない場合には、スタンバイモードを利用しない設定にしておくことにより、電源ボタンがオフされたときに、すべての回路コンポーネントへの電源供給が完全に停止される。
また、通常モードとスタンバイモードとの切り替えは、コントローラ34の電源スイッチ80iのオン/オフの切り替えによって、遠隔操作によって行うことが可能である。当該遠隔操作を行わない場合には、スタンバイモードにおいて無線コントローラモジュール72aへの電源供給を行わない設定にしてもよい。
リセットボタンもまた、システムLSI62に接続される。リセットボタンが押されると、システムLSI62は、ゲーム装置12の起動プログラムを再起動する。イジェクトボタンは、ディスクドライブ74に接続される。イジェクトボタンが押されると、ディスクドライブ74から光ディスク22が排出される。
図11には、第1コントローラ34と第2コントローラ36とがジャイロセンサユニット100を介して接続されたときのコントローラ14全体の電気的構成の一例が示される。
第1コントローラ34は、その内部に通信部88を備え、通信部88には、操作部46、撮像情報演算部50、加速度センサ84およびコネクタ42が接続される。操作部46は、上述の操作ボタンないし操作スイッチ46a‐46iを示す。操作部46が操作されると、その操作を示すデータが通信部88に出力される。撮像情報演算部50からは、マーカ30aおよび30bの被写界内における位置座標を示すデータが通信部88に出力される。
さらに、上述したように、コントローラ34には、撮像情報演算部50が設けられる。この撮像情報演算部50は、赤外線フィルタ50a、レンズ50b、撮像素子50cおよび画像処理回路50dによって構成される。赤外線フィルタ50aは、コントローラ34の前方から入射する光から赤外線のみを通過させる。上述したように、モニタ26の表示画面近傍(周辺)に配置されるマーカ30aおよび30bは、モニタ26の前方に向かって赤外光を出力する赤外LEDである。したがって、赤外線フィルタ50aを設けることによってマーカ30aおよび30bの画像をより正確に撮像することができる。レンズ50bは、赤外線フィルタ50aを透過した赤外線を集光して撮像素子50cへ出射する。撮像素子50cは、たとえばCMOSセンサあるいはCCDのような固体撮像素子であり、レンズ50bによって集光された赤外線を撮像する。したがって、撮像素子50cは、赤外線フィルタ50aを通過した赤外線だけを撮像して画像データを生成する。以下では、撮像素子50cによって撮像された画像を撮像画像と呼ぶ。撮像素子50cによって生成された画像データは、画像処理回路50dで処理される。画像処理回路50dは、撮像画像内における撮像対象(マーカ30aおよび30b)の位置を算出し、第4所定時間毎に、当該位置を示す各座標値を撮像データ(後述するマーカ座標データ)としてマイコン90に出力する。なお、画像処理回路50dにおける処理については後述する。
図12は、コントローラ34を用いてゲームプレイするときの状態を概説する図解図である。ただし、ゲームプレイのみならず、他のアプリケーションを実行したり、DVDを再生したりする場合も同様である。図12に示すように、ビデオゲームシステム10でコントローラ34を用いてゲームをプレイする際、プレイヤは、一方の手でコントローラ34を把持する。厳密に言うと、プレイヤは、コントローラ34の先端面(撮像情報演算部50が撮像する光の入射口44b側)がマーカ30aおよび30bの方を向く状態でコントローラ34を把持する。ただし、図1からも分かるように、マーカ30aおよび30bは、モニタ26の画面の横方向と平行に配置されている。この状態で、プレイヤは、コントローラ34が指示する画面上の位置を変更したり、コントローラ34と各マーカ30aおよび30bとの距離を変更したりすることによってゲーム操作を行う。
なお、図12では分かり難いが、上述したジャイロユニット100がコントローラ34に接続される場合も同様である。
図13は、マーカ30aおよび30bと、コントローラ34との視野角を説明するための図である。図13に示すように、マーカ30aおよび30bは、それぞれ、視野角θ1の範囲で赤外光を放射する。また、撮像情報演算部50の撮像素子50cは、コントローラ34の視線方向を中心とした視野角θ2の範囲で入射する光を受光することができる。たとえば、マーカ30aおよび30bの視野角θ1は、共に34°(半値角)であり、一方、撮像素子50cの視野角θ2は41°である。プレイヤは、撮像素子50cが2つのマーカ30aおよび30bからの赤外光を受光することが可能な位置および向きとなるように、コントローラ34を把持する。具体的には、撮像素子50cの視野角θ2の中にマーカ30aおよび30bの少なくとも一方が存在し、かつ、マーカ30aまたは30bの少なくとも一方の視野角θ1の中にコントローラ34が存在する状態となるように、プレイヤはコントローラ34を把持する。この状態にあるとき、コントローラ34は、マーカ30aおよび30bの少なくとも一方を検知することができる。プレイヤは、この状態を満たす範囲でコントローラ34の位置および向きを変化させることによってゲーム操作を行うことができる。
なお、コントローラ34の位置および向きがこの範囲外となった場合、コントローラ34の位置および向きに基づいたゲーム操作を行うことができなくなる。以下では、上記範囲を「操作可能範囲」と呼ぶ。
操作可能範囲内でコントローラ34が把持される場合、撮像情報演算部50によって各マーカ30aおよび30bの画像が撮像される。すなわち、撮像素子50cによって得られる撮像画像には、撮像対象である各マーカ30aおよび30bの画像(対象画像)が含まれる。図14は、対象画像を含む撮像画像の一例を示す図である。対象画像を含む撮像画像の画像データを用いて、画像処理回路50dは、各マーカ30aおよび30bの撮像画像における位置を表す座標(マーカ座標)を算出する。
撮像画像の画像データにおいて対象画像は高輝度部分として現れるため、画像処理回路50dは、まず、この高輝度部分を対象画像の候補として検出する。次に、画像処理回路50dは、検出された高輝度部分の大きさに基づいて、その高輝度部分が対象画像であるか否かを判定する。撮像画像には、対象画像である2つのマーカ30aおよび30bに対応する画像30a’および30b’のみならず、窓からの太陽光や部屋の蛍光灯の光によって対象画像以外の画像が含まれていることがある。高輝度部分が対象画像であるか否かの判定処理は、対象画像である画像30a’および30b’と、それ以外の画像とを区別し、対象画像を正確に検出するために実行される。具体的には、当該判定処理においては、検出された高輝度部分が、予め定められた所定範囲内の大きさであるか否かが判定される。そして、高輝度部分が所定範囲内の大きさである場合には、当該高輝度部分は対象画像を表すと判定される。逆に、高輝度部分が所定範囲内の大きさでない場合には、当該高輝度部分は対象画像以外の画像を表すと判定される。
さらに、上記の判定処理の結果、対象画像を表すと判定された高輝度部分について、画像処理回路50dは当該高輝度部分の位置を算出する。具体的には、当該高輝度部分の重心位置を算出する。ここでは、当該重心位置の座標をマーカ座標と呼ぶ。また、重心位置は撮像素子50cの解像度よりも詳細なスケールで算出することが可能である。ここでは、撮像素子50cによって撮像された撮像画像の解像度が126×96であるとし、重心位置は1024×768のスケールで算出されるものとする。つまり、マーカ座標は、(0,0)から(1024,768)までの整数値で表現される。
なお、撮像画像における位置は、撮像画像の左上を原点とし、下向きをY軸正方向とし、右向きをX軸正方向とする座標系(XY座標系)で表現されるものとする。
また、対象画像が正しく検出される場合には、判定処理によって2つの高輝度部分が対象画像として判定されるので、2箇所のマーカ座標が算出される。画像処理回路50dは、算出された2箇所のマーカ座標を示すデータを出力する。出力されたマーカ座標のデータ(マーカ座標データ)は、上述したように、マイコン90によって入力データに含まれ、ゲーム装置12に送信される。
ゲーム装置12(CPU60)は、受信した入力データからマーカ座標データを検出すると、このマーカ座標データに基づいて、モニタ26の画面上におけるコントローラ34の指示位置(指示座標)と、コントローラ34からマーカ30aおよび30bまでの各距離とを算出することができる。具体的には、2つのマーカ座標の中点の位置から、コントローラ34の向いている位置すなわち指示位置が算出される。また、撮像画像における対象画像間の距離が、コントローラ34と、マーカ30aおよび30bとの距離に応じて変化するので、2つのマーカ座標間の距離を算出することによって、ゲーム装置12はコントローラ34と、マーカ330aおよび30bとの間の距離を把握できる。
図11に戻って、加速度センサ84が検出した加速度を示すデータもまた、通信部88へ出力される。加速度センサ84は、たとえば最大200フレーム/秒程度のサンプリング周期を有する。
コネクタ42には、ジャイロセンサユニットのコネクタ106が接続される。ジャイロセンサユニット100は、その内部にマイコン102およびジャイロセンサ104を含む。ジャイロセンサ104は、上述のジャイロセンサ104aおよび104bを示しており、たとえば加速度センサ84と同様のサンプリング周期を有する。マイコン102は、ジャイロセンサ104が検出した角速度を示すデータをコネクタ106およびコネクタ42を介して通信部88に出力する。
ジャイロセンサユニット100のコネクタ108には、第2コントローラ36から延びるケーブル38のコネクタ40が接続される。コネクタ40には、第2コントローラ36の操作部54および加速度センサ86が接続される。操作部54は、上述のスティック54aおよび操作ボタン54b、54cを示す。操作部54が操作されると、その操作を示すデータがケーブル38、コネクタ40およびコネクタ42を介してジャイロセンサユニット100のマイコン102に与えられる。マイコン102は、このデータをコネクタ106、コネクタ42を介して通信部88に出力する。また、加速度センサ86も、加速度センサ84と同様のサンプリング周期を有しており、これにより検出された加速度を示すデータもまた、マイコン102によって通信部88に出力される。
なお、上述した通信部88への各出力は、たとえば1/200秒周期で実行される。したがって、任意の1/200秒間に、操作部46からの操作データと、撮像情報演算部50のからの位置座標データと、加速度センサ84からの加速度データと、ジャイロセンサ104からの角速度データと、操作部54からの操作データと、加速度センサ86からの加速度データとが、1回ずつ通信部88に出力される。
図16には、図11に示した全体構成のうちジャイロセンサユニット100の要部構成が示される。上述のコネクタ42、コネクタ106、コネクタ108およびコネクタ40は、それぞれたとえば6ピンのコネクタであり、この6ピンの中に、コネクタ間の接続状態を示す変数“Attach”を制御するためのAttachピンが含まれている。Attachは、コネクタ間が切断されていることを示す“Low”と、コネクタ間が接続されていることを示す“High”との間で変化する。以下では特に、コネクタ42・コネクタ106間つまり第1コントローラ34・ジャイロセンサユニット100間のAttachを“Attach1”と呼び、コネクタ108・コネクタ40間つまりジャイロセンサユニット100・第2コントローラ36間のAttachを“Attach2”と呼ぶ。
Attach1は、第1コントローラ34にジャイロセンサユニット100が装着されていても、アプリケーションがジャイロ非対応型であり、かつジャイロセンサユニット100に第2コントローラ36が接続されていない場合には、このジャイロ非対応アプリからジャイロセンサユニット100が見えなくなるように、ジャイロセンサユニット100のマイコン102によって“Low”に制御される(スタンバイモード:図14参照)。スタンバイモードでは、ジャイロセンサ104への電源供給は停止され、ジャイロ機能は停止状態となる。マイコン102は専ら、Attach2に基づくモード切り替えと、ジャイロ対応アプリからの指示に基づく電源管理とを行う。
上記6ピンのうち他の2つにはI2Cバスが割り当てられており、ジャイロセンサユニット100は、第1コントローラ34側のI2Cバスと第2コントローラ36側のI2Cバスとを互いに接続/分離するためのバススイッチSWをさらに含む。バススイッチSWは、第2コントローラ36がジャイロセンサユニット100を介して第1コントローラ34に接続された状態で、ジャイロ非対応アプリが実行されるときに、マイコン102によりオンされる。以降、第2コントローラ36からのデータは、マイコン102を経由することなく、I2Cバスを通じて通信部88に出力されるようになる(バイパスモード:図14参照)。したがって、マイコン102は、スタンバイモードと同様、モード切り替えと電源管理とを行えばよく、消費電力が抑制される。また、ジャイロセンサユニット100を装着したままでも、ジャイロ非対応アプリを実行できる。バススイッチSWがオフのときは、バスはマイコン102に接続され、第1コントローラ34に出力するデータは、マイコン102によって制御される。
バススイッチSWはまた、スタンバイモードでもオンされる。これによって、ジャイロ対応型のアプリケーションは、上述のようにAttach1が“Low”に制御されていても、I2Cバスの特別なアドレスを参照することで、第1コントローラ34にジャイロセンサユニット100が装着されているかどうかを確認できる。
なお、ジャイロセンサユニット100には、上述した“スタンバイ”および“バイパス”に加え、“ジャイロ”および“ジャイロ&第2コントローラ”の計4モードが準備されている。後の2つのモードでは、バススイッチSWはオフされる。
ジャイロセンサユニット100のマイコン102は、2種類のA/D変換回路102aおよび102bを含んでおり、ジャイロセンサ104から出力される3軸周りの角速度信号は、これらA/D変換回路102aおよび102bの各々に与えられる。A/D変換回路102aでは、ジャイロセンサ104の検出範囲の全部(たとえば±360度/秒)を対象とする高角速度モードのA/D変換処理が実行され、A/D変換回路102bでは、ジャイロセンサ104の検出範囲の一部(たとえば±90度/秒)を対象とする低角速度モードのA/D変換処理が実行される。マイコン102は、これら2種類のA/D変換結果のいずれか一方を角速度データとして出力する。
具体的には、A/D変換回路102aおよび102bからある時刻に対応する2種類の角速度データが出力されると、マイコン102は最初、このうち低角速度モードの角速度データについて、その値Aが第1閾値Th1から第2閾値Th2(>Th1)までの範囲内にあるかどうか、すなわち条件“Th1≦A≦Th2”が満足されるか否かを、軸毎に、つまりヨー、ロールおよびピッチの各々について判定する。次に、これら3つの判定結果に基づいて、低角速度モードおよび高角速度モードのいずれか1つを選択する。たとえば、3つの判定結果それぞれに関して、YESであれば低角速度モードを選択し、NOであれば高角速度モードを軸ごとに選択する。そして、軸ごとに選択されたモードに従う角速度データを、選択されたモードを示すモード情報と共にそれぞれ出力する。つまり、角速度に応じてデータの精度を変えることによって、同じデータ量であっても、低速のときにはより精度の高いデータを出力することができる。
図16には、ジャイロセンサユニット100が取り扱うデータのフォーマットが示される。図16(A)はジャイロセンサユニット100用データのフォーマットを示し、図16(B)は第2コントローラ36用データのフォーマットを示す。ジャイロセンサユニット100用のデータは、ヨー角速度データ、ロール角速度データおよびピッチ角速度データと、ヨー角速度モード情報、ロール角速度モード情報およびピッチ角速度モード情報と、第2コネクタ接続情報と、ジャイロ・第2コントローラ識別情報とを含む。
ただし、図17に示すように、y軸の回転がヨー角で表わされ、x軸の回転がピッチ角で表わされ、そして、z軸の回転がロール角で表わされるものとする。
ヨー角速度データ、ロール角速度データおよびピッチ角速度データは、ジャイロセンサ104から出力されるヨー角速度信号、ロール角速度信号およびピッチ角速度信号をA/D変換して得られる、たとえば各14ビットのデータである。ヨー角速度モード情報、ロール角速度モード情報およびピッチ角速度モード情報は、それぞれ対応する角速度データのモードを示す各1ビットの情報であり、高角速度モードに対応する“0”と、低角速度モードに対応する“1”との間で変化する。
第2コントローラ接続情報は、コネクタ106に第2コントローラ36が接続されているか否かを示す1ビットの情報であり、非接続を示す“0”と、接続を示す“1”との間で変化する。ジャイロ・第2コントローラ識別情報は、当該データがジャイロセンサユニット100から出力されたデータであるか第2コントローラ36から出力されたデータであるかを識別する1ビットの情報であり、ジャイロセンサユニット100からのデータであることを示す“1”と、第2コントローラ36からのデータであることを示す“0”との間で変化する。
一方、第2コントローラ36用のデータは、左右方向(X軸方向)のスティック操作および前後方向(Z軸方向)のスティック操作をそれぞれ示すXスティック操作データおよびYスティック操作データと、X軸方向の加速度、Y軸方向の加速度およびZ軸方向の加速度をそれぞれ示すX加速度データ、Y加速度データおよびZ加速度データと、ボタン操作データと、第2コネクタ接続情報と、ジャイロ・第2コントローラ識別情報とを含む。
ジャイロセンサユニット100は通信部88に、図16(a)のフォーマットに従うジャイロ用データと、図16(B)のフォーマットに従う第2コントローラ用データとを、それぞれたとえば1/200秒周期で交互に出力する。したがって、片方のフォーマットに関しては、1/100秒周期で出力されることになるが、これはゲームの処理等で一般的な処理期間である1/60秒周期よりも十分短いことから、データを交互に出力してもゲーム処理で両方のデータを1フレームで同時に利用することができる。
図11に示す通信部88は、マイクロコンピュータ(マイコン)90、メモリ92、無線モジュール94およびアンテナ96を含む。マイコン90は、処理の際にメモリ92を記憶領域(作業領域やバッファ領域)として用いながら、無線モジュール94を制御して、取得したデータをゲーム装置12に送信したりゲーム装置12からのデータを受信したりする。
ジャイロセンサユニット100から通信部88に出力されたデータは、マイコン90を経て一時的にメモリ92に格納される。第1コントローラ34内の操作部46、撮像情報演算部50および加速度センサ84から通信部88に出力されたデータもまた、メモリ92に一時的に格納される。マイコン90は、ゲーム装置12への送信タイミングが到来すると、メモリ92に格納されているデータをコントローラデータとして無線モジュール94へ出力する。コントローラデータには、図16(A)および図16(B)に示したジャイロ用データおよび/または第2コントローラ用データに加えて、第1コントローラ用データが含まれる。第1コントローラ用データには、加速度センサ84の出力に基づくX加速度データ、Y加速度データおよびZ加速度データと、撮像情報演算部50の出力に基づく位置座標データと、操作部または入力手段46の出力に基づくボタン操作データ(キーデータ)とが含まれる。
無線モジュール94は、Bluetoothのような近距離無線通信技術を用いて、所定周波数の搬送波をコントローラデータで変調し、その微弱電波信号をアンテナ96から放射する。つまり、コントローラデータは、無線モジュール94で微弱電波信号に変調されて第1コントローラ34から送信される。微弱電波信号はゲーム装置12側のBluetooth通信ユニット74で受信される。受信された微弱電波信号について復調や復号を行うことによって、ゲーム装置12はコントローラデータを取得することができる。ゲーム装置12のCPU60は、コントローラ14から取得したコントローラデータに基づいてゲーム処理を行う。なお、第1コントローラ34とゲーム装置12との無線通信は、無線LANなど他の規格に従って実行されてもよい。
このゲームシステム10では、ボタン操作だけでなく、コントローラ14自体を動かすことによっても、ゲームなどのアプリケーションに対する入力を行うことができる。ゲームをプレイする際には、たとえば図18に示すように、プレイヤは、その右手で第1コントローラ34(具体的にはハウジング44の把持部44a:図2)を持ち、その左手で第2コントローラ36を持つ。上述のように、第1コントローラ34には3軸方向の加速度を検出する加速度センサ84が内蔵され、第2コントローラ36にも同様の加速度センサ86が内蔵されている。第1コントローラ34および第2コントローラ36がそれぞれプレイヤによって動かされると、加速度センサ84および加速度センサ86によって、それぞれのコントローラ自身の動きを示す3軸方向の加速度値が検出される。第1コントローラ34にジャイロセンサユニット100が装着されている場合には、第1コントローラ34自身の動きを示す3軸周りの角速度値がさらに検出される。
これらの検出値は、先述したコントローラデータの態様でゲーム装置12に送信される。ゲーム装置12(図10)では、コントローラ14からのコントローラデータは、入出力プロセッサ62aによってアンテナ72aおよび無線コントローラモジュール72を介して受信され、受信されたコントローラデータは、内部メインメモリ62eまたは外部メインメモリ66のバッファ領域に書き込まれる。CPU44は、内部メインメモリ62eまたは外部メインメモリ66のバッファ領域に格納されたコントローラデータを読み出し、このコントローラデータから検出値つまりコントローラ14によって検出された加速度および/または角速度の値を復元する。
なお、角速度データには高角速度および低角速度の2つのモードがあるため、これら2つのモードにそれぞれ対応する2種類の角速度復元アルゴリズムが準備される。角速度データから角速度の値を復元するにあたっては、当該角速度データのモードに対応する角速度復元アルゴリズムが、角速度モード情報に基づいて選択される。
CPU60はまた、このような復元処理と並行して、復元された加速度からコントローラ14の速度を計算する処理を実行してもよい。さらに並行して、計算された速度からコントローラ14の移動距離ないし位置を求めることもできる。一方、復元された角速度からは、コントローラ14の回転角が求まる。なお、加速度を積算して速度を求めたり、角速度を積算して回転角を求めたりする際の初期値(積分定数)は、たとえば、撮像情報演算部50のからの位置座標データに基づいて計算できる。位置座標データはまた、積算によって蓄積されていく誤差の修正にも用いることができる。
ゲーム処理は、こうして求められた加速度、速度、移動距離、角速度および回転角などの変数に基づいて実行される。したがって、上記の処理は全てを行わなくともよく、ゲーム処理に必要な変数を適宜算出すればよい。なお、角速度や回転角も、原理的には加速度から計算し得るが、そのためには、ゲームプログラムに複雑なルーチンが必要で、CPU60にも重い処理負荷がかかる。ジャイロセンサユニット100を利用することで、プログラム開発が容易になり、CPU60の処理負荷も軽減される。
ところで、ゲームには、第1コントローラ34しか利用しない1コントローラ用ゲームと、第1コントローラ34および第2コントローラ36を利用する2コントローラ用ゲームとがあり、そして各ゲームは、ジャイロ対応およびジャイロ非対応のいずれかに分類される。メインコントローラである第1コントローラ34は、いずれのゲームをプレイする場合にも使用できる。また、拡張コントローラである第2コントローラ36は、2コントローラ用ゲームをプレイするときジャイロセンサユニット100を介して、または直に第1コントローラ34に接続され、1コントローラゲームをプレイするときには通常取り外される。
一方、拡張センサないし拡張コントローラであるジャイロセンサユニット100は、ジャイロ非対応ゲームをプレイする場合には不要であるが、わざわざ取り外さなくてもよい。このため、ジャイロセンサユニット100は通常、第1コントローラ34に装着したままにされ、第1コントローラ34と一体で取り扱われる。第2コントローラ36は、コネクタ40の接続先がコネクタ42からコネクタ108に変わる点を除けば、ジャイロセンサユニット100が介在しない場合と同様に着脱される。
図19には、ジャイロセンサユニット100のマイコン102による制御がモード毎に記載したテーブルが示される。ジャイロセンサユニット100に準備されているモードは、先述した“スタンバイ”、“バイパス”、“ジャイロ”および“ジャイロ&第2コントローラ”の4種類であり、マイコン102の制御対象は、“ジャイロ機能”、“ジャイロ電源”、“バススイッチ”、“拡張コネクタ”、“Attach1”および“I2Cアドレス”の6項目に及ぶ。
ジャイロ機能は、スタンバイおよびバイパスの各モードでは停止状態(No Active)に置かれる一方、ジャイロおよびジャイロ&第2コントローラの各モードでは起動状態(Active)に置かれる。ジャイロ電源つまりジャイロセンサ104への電源供給は、スタンバイおよびバイパスの各モードで停止(OFF)され、ジャイロおよびジャイロ&第2コントローラの各モードではていし停止(ON)される。バススイッチSWは、スタンバイおよびバイパスの各モードで接続(Connect)され、ジャイロおよびジャイロ&第2コントローラの各モードでは切断(Disconnect)される。
拡張コネクタつまりコネクタ108は、バイパスおよびジャイロ&第2コントローラの各モードで起動状態に置かれ、スタンバイおよびジャイロの各モードでは停止状態に置かれる。Attach1は、スタンバイモードで非接続状態を示す“Low”に制御され、バイパス、ジャイロおよびジャイロ&第2コントローラの各モードでは接続状態を示す“High”に制御される。I2Cアドレスに関しては、スタンバイおよびバイパスの各モードに限って、特別なアドレスが注目される。
モード間の切り換えは、図20に示す要領で行われる。図20(A)にはアプリケーションがジャイロ対応である場合の切り換え処理が、図20(B)にはアプリケーションがジャイロ非対応である場合の切り換え処理が、それぞれ示される。図20(A)および図20(B)に共通して、すなわちジャイロ対応アプリかジャイロ非対応アプリかによらず、ジャイロセンサユニット100は、ジャイロセンサユニット100自身が第1コントローラ34に接続されるのに応答して起動し、初期モードであるスタンバイモードに入る。ここで第2コントローラ36が接続されると、スタンバイモードからバイパスモードに移行し、その後に第2コントローラ36が取り外されると、バイパスモードからスタンバイモードに復帰する。
ここで、ジャイロ対応アプリは、必要に応じて角速度データを取得するべく、ジャイロセンサユニット100に対して呼び出しおよびリセットをかける。上述のように、本実施例では、通信によってゲーム機からコントローラを制御することが可能であるので、アプリケーションによってジャイロセンサユニット100を制御することが可能である。このため、図19(A)に示すように、ジャイロセンサユニット100は、スタンバイモードでアプリケーションから呼び出しを受けるとジャイロモードに移行し、ジャイロモードでアプリケーションからリセットを受けるとスタンバイモードに復帰する。ジャイロセンサユニット100はまた、ジャイロモードで第2コントローラ36が接続されるとジャイロ&第2コントローラモードに移行し、ジャイロ&第2コントローラモードで第2コントローラ36が取り外されるとジャイロモードに復帰する。ジャイロセンサユニット100はさらにまた、ジャイロ&第2コントローラモードでアプリケーションからリセットを受けるとバイパスモードに移行し、バイパスモードでアプリケーションから呼び出しを受けるとジャイロ&第2コントローラモードに復帰する。
一方、ジャイロ非対応アプリは、ジャイロセンサユニット100に対して呼び出しやリセットといった働きかけを行う機能がない。このため、ジャイロ非対応アプリを実行する際には、図20(B)に示すように、ジャイロセンサユニット100のモードは、スタンバイモードおよびバイパスモードの間で切り換わるに止まる。
ジャイロセンサユニット100のこのようなモード切り替えは、マイコン102が、図19に示したテーブルを参照して、実現するが、ここではこれ以上の詳細な説明は省略する。
このようなゲームシステム10を用いた仮想ゲームの一例を、図面を参照しながら説明することにする。まず、ゲームの概要について説明をする。図21は、第1の実施例としてのゲームをプレイヤがプレイする様子を示した図である。第1の実施例は、プレイヤが、第1コントローラ34と、第2コントローラ36とを動かすことによってゲーム内の水上バイクを操作するゲームである。図21に示すように、プレイヤは第1コントローラ34と第2コントローラ36とを向かい合わせ、2つを一体となったハンドルであるかのように持つ。そして、水上バイクのゲーム開始後は、2つのコントローラをなるべく一直線上にしたまま、実際の水上バイクのハンドルのように傾ける。実際の水上バイクと同様に、2つのコントローラをプレイヤから見てロール方向に傾ければ機体が傾くとともに進行方向を左右へ曲げることができる。たとえば図21に示すように、プレイヤが両コントローラを左に傾けた場合には、図22(a)に示すように、ゲーム空間内の水上バイク(および水上バイクと一体となったプレイヤオブジェクト)POは左に姿勢を傾けつつ左に曲がる。また、プレイヤが両コントローラをピッチ方向へ傾ければ、機体の姿勢を前後に傾けることができる。たとえば、プレイヤが、上を向く方向に両コントローラを傾ければ、図22(b)に示すように、ゲーム空間内において、水上バイクPOは機体の前部分を浮き上がらせるような姿勢をとる。ただし、図22(b)はゲーム空間内の水上バイクPOを横から示したもので、実際のゲーム画面は図22(a)のように水上バイクPOを後ろから見たものになる。
また、たとえばBボタン46hをアクセルボタンとして、Bボタン46hを押し続けている間は前進できるものとする。したがって、実際の水上バイクのハンドルに設けられたアクセルと同じような感覚でアクセル操作をすることができる。
ところで、水上バイクではなく通常のバイクのハンドルであれば、右手で握る側のハンドルをピッチ方向へひねることによって加速を行うが、本実施例のゲームにおいても、右手のひねりで加速をすることもできる。具体的には、第1コントローラ34がz軸を中心に回転された場合に、ゲーム内の水上バイクPOを加速させる。つまり、右手を本物のバイクのアクセルのようにひねることで加速することができる。本実施例においては、アクセル操作は、上述のBボタン46hの操作を基本とし、さらにひねりを加えることによって、一時的にボタン操作での上限の速度以上に加速できる。
すなわち、プレイヤは実際の水上バイクに近い直感的なハンドル操作とアクセル操作ができる。そしてさらに実際のバイクのアクセル操作に近い操作で水上バイクPOをさらに加速させることもできる。プレイヤは加速のために常にコントローラをひねり続けなくともボタンによって速度の制御ができ、特に加速したいタイミングでひねりを加えることで、通常走行以上の速度を出すことができるようになっているので、常にひねらせることに比べてプレイヤの負担を軽減している。したがって、水上バイクではなく通常のバイクのゲーム等の別実施例において、よりリアルな操作をさせることを優先させる場合には、第1コントローラ34の姿勢のみからアクセルの強さを決定するようにしてもよい。
更に、本実施例では、水上バイクPOが波を乗り越えたときの姿勢によっては、一時的に水上バイクPOが宙に浮いている状態となる(以下、この状態のことをジャンプ状態と呼ぶ)。そして、ジャンプ状態のときに、プレイヤが第1コントローラ34をプレイヤから見たヨー方向(第1コントローラのy軸回り、もしくは場合によりx軸回り)に回転させると、図22(c)に示すように水上バイクPOを横方向に回転(スピン)させることができる。この操作に際しては、第1コントローラ34を手元で回転させてもよいし、プレイヤ自身が2つのコントローラを持ったまま横に一回転してもよい。当該回転操作によって発生した角速度が、水上バイクPOの姿勢に反映されて、水上バイクPOが横に回転する様が描画される。換言すると、本実施例では、ジャンプ状態のときは、ジャイロセンサユニット100から取得されるヨー方向の角速度データを水上バイクPOの姿勢に反映させるような制御を行っている。
図23および図24において、上述のコントローラの姿勢に基づいた操作をより詳細に示す。図23において、M1およびM2は、それぞれ第1コントローラ34および第2コントローラ36の姿勢である。姿勢はたとえば、3次元の回転行列として表され、基準となる状態からどのような回転をした姿勢であるかを表す。基準となる状態は、たとえば第1コントローラ34と第2コントローラ36を向かい合わせて水平にした状態であって、図23(a)に示すような状態である。それぞれの加速度センサの各軸方向を、それぞれ第1コントローラ34に関するものをx1、x1、z1、第2コントローラ36に関するものをx2、y2、z2として示すが、図23(a)の基準状態において、第1コントローラ34と第2コントローラ36の軸方向が一致せずに向かい合うことになる。回転の算出は、加速度センサの座標系ではなくて、空間内に定められた座標系(図23(a)に示すxyz)で表される回転として算出される。本実施例における座標系の設定の例として、座標系のx方向をプレイヤから見て右方向、つまり基準状態のz2方向とし、y方向をプレイヤの上方向、つまり基準状態でのy1およびy2方向、z方向をプレイヤから見て正面方向、つまり基準状態でのx1方向になるように定める。
姿勢M1およびM2は、加速度に基づいて決定される。すなわち、第1コントローラ34および第2コントローラ36からそれぞれ得られる加速度が重力加速度g1およびg2であるとみなして、重力方向は鉛直下方向であるという前提から、コントローラの姿勢M1とM2を算出する。すなわち、加速度データg1およびg2がそれぞれの加速度センサの座標系における3次元のベクトルとして得られ、それらを空間座標系において鉛直下方向、y軸負方向に向ければ、相対的にセンサの各軸が空間座標系で向いている方向が定められ、その姿勢が基準状態からどのような回転をしたものであるかを算出することで姿勢M1、M2も算出される。たとえば、図23(b)に示すように、第1コントローラ34に加えられる加速度がg1’に変化した場合に、g1’のベクトル方向を空間座標系でのy軸負方向へ向けた場合のx1、y1、z1の向きがx1’、y1’、z1’であるので、回転M1’を算出することができる。姿勢M1およびM2が算出された後、M1とM2を平均した姿勢Mmを算出する。平均の姿勢Mmが、ゲームでの水上バイクPOの制御に用いられる。平均の姿勢Mmを制御に用いることで、誤入力等の影響を軽減できるだけでなく、片方のコントローラに並行して他の操作を行っても自然な入力になる。さらに、バイクのハンドルでは、左右のハンドルが一直線上でなく、ハの字状のように所定の角度をなしていたり、並行に近かったりするものもあるが、そのようなハンドルのような向きにプレイヤが2つのコントローラを把持したとしても、平均の姿勢は一直線上にハンドルを把持した場合と同じ姿勢になるので、プレイヤの持ち方のばらつきによる影響を軽減することができる。
図23において、3次元の回転とともに便宜上定めた特定のベクトルの向きがどのように変化するかを示し、各コントローラの回転と平均の回転がどのように変化するか説明する。ここでは第1コントローラ34および第2コントローラ36の姿勢に対して、上述の基準状態においてコントローラの上方向を向く2つのベクトル(ここではそれぞれy1、y2方向)の平均のベクトルをベクトルaveとし、aveを参照して平均の姿勢Mmの説明をする。基準状態である図23(a)においては、平均ベクトルaveは上向き、つまりy軸正方向である。そして、それぞれのコントローラの姿勢の変化により、それぞれのコントローラの上向きベクトルが図23(b)のy1’、y2’となったとき、平均ベクトルは図23(b)のave’となる。図23(b)においては、第1コントローラ34と第2コントローラ36の傾き方が異なっているが、平均ベクトルave’の傾きはそれらの平均となる。そして、この平均ベクトルの姿勢に対応するように水上バイクPOの姿勢も決定されることになる。実際にはベクトルを算出しなくともよく、aveがave’となるような回転Mm’自体を算出すればよい。水上バイクPOの姿勢は、基準状態での姿勢に回転Mm’を加えたものとなり、図23(c)に示すように、右に傾くことになる。水上バイクPOの姿勢は、単に基準状態での姿勢を回転させるのではなく、Mmの値に対応して予め姿勢が定められていてもよい。そのようにすれば、傾きに応じて水上バイクPO上でのプレイヤオブジェクトのポーズ等を詳細に設定することができる。
次に、図24を参照して、第1コントローラ34の角速度に基づいた操作を説明する。まず、第1コントローラ34にひねりを加えることによる水上バイクPOの加速操作について説明する。図24(a)および(b)は、図23と同様にそれぞれ基準状態と操作後におけるコントローラの状態と、平均の回転を示したものであるが、ここではプレイヤの横方向、つまり図23で空間に定義されたx方向に沿って見た図である。図24(a)は、図23(a)同様、基準状態を示す。そして、第1コントローラ34を手前にひねる操作が加えられた状態を図24(b)に示す。つまり、第1コントローラ34をバイクのアクセルに見立てて、水上バイクPOを加速させる操作が行われた状態である。このとき、ジャイロセンサ104によって第1コントローラ34のz軸回り(本実施例では第1コントローラ34を横向きに持っているのでピッチ方向の回転となる)に角速度Rzが検出される。コントローラの姿勢は、第1コントローラ34が大きく傾いた状態となるが、第2コントローラ36は傾いていないので、平均の回転Mm’は少ししか傾かない回転となる。すなわち、水上バイクPOの姿勢を傾ける目的で第1コントローラ34と第2コントローラ36の両方を傾けた場合は傾けた分だけ水上バイクPOが傾くが、加速目的で第1コントローラ34のみをひねった場合は、水上バイクPOの傾きは限定的なものとなり、不自然に傾いてしまうことが抑制される。水上バイクPOは図24(c)に示されるように少しだけ浮き上がるように傾き、それと共に角速度Rzの入力に基づいてゲーム空間内で加速される。すなわち、加速と共に浮き上がるので、水上バイクの挙動としても違和感が無いものとなる。このように、第1コントローラ34の回転を加速操作に用いても、姿勢の反映が軽減され、かつ、加速と共に浮き上がらせるので、コントローラの姿勢によるオブジェクトの姿勢制御と、コントローラの回転によるオブジェクトの加速とを同時に、かつ違和感無く実現することができる。
次に、上述したような、ジャンプ状態のときに水上バイクPOを横に回転させる操作およびこのときの制御処理の概要について説明する。上述のように、本実施例では、ジャンプ状態のような、仮想ゲーム空間内でプレイヤオブジェクト(本実施例では水上バイクPO)が一時的に宙に浮いている状態の時、角速度データに基づいて姿勢制御を行っている。このようにジャンプ状態の時の姿勢制御をジャイロセンサ104からの角速度データを用いて行うことによって、以下のような利点がある。まず、第1コントローラ34のヨー方向の回転に関して、加速度データを用いて検出することが困難な場合がある。例えば、第1コントローラ34を地面と水平な姿勢を維持したまま、その場でヨー方向に回転させた場合、加速度データとしては、重力方向の加速度しか出力されない。そのため、回転操作にかかる姿勢の変化を正確に検出することが困難な場合がある。そのため、本実施例では、このような回転操作については、ジャイロセンサユニット100から角速度データを用いることで、より正確な姿勢変化を検知している。このことによって、コントローラをヨー方向に回転させることで水上バイクPOをヨー方向に回転させるという直感的な操作が実現できる。また、ジャイロセンサ104はその特性上、一般的に誤差が発生しやすい側面があり、また、長期間にわたって姿勢を算出し続けると、角速度による誤差が蓄積して姿勢の誤差が大きくなるという問題がある。したがって、短時間における変化量に基づいて姿勢の変化量を算出した方が、姿勢の誤差が少なくなる。例えば、第1コントローラ34を、1秒間にヨー方向に90度回転させたとき、ジャイロセンサ104からは89度というデータが得られるとする。つまり、実際には90度回転させているにも関わらず、ジャイロセンサ104では89度分の変化しか検出されておらず、1秒で1度の誤差が発生していると仮定する。この場合、例えば10秒分のデータに基づいて姿勢制御を行う場合と、2秒分のデータに基づいて姿勢制御を行う場合では、誤差の蓄積が少ない後者のほうがより姿勢変化量の算出精度が高くなる。本実施例では、ジャンプ状態のような「一時的に」宙に浮いている、すなわち、その状態の継続時間が短時間であるような状態における姿勢制御に角速度データを用いているので、そのような性質を効果的に利用することができる。これにより、第1コントローラ34のより正確な姿勢変化を検出し、水上バイクPOに反映できる。
ところで、本実施例における仮想ゲームでは、基本的なゲーム画面としては、上記図22(a)に示しているように、水上バイクPOを後方から見た視点で描画される。すなわち、仮想カメラの位置が水上バイクPOの後方に配置され、水上バイクPOを追尾するように仮想カメラの位置等が制御される。しかし、上記ジャンプ状態のときに水上バイクPOを回転させた場合、もし回転中も仮想カメラの位置を水上バイクPOの後方の位置に維持したままにすると、カメラの動きとしては、水上バイクPOを中心にその周囲をカメラが大きく回るような動きとなり、水上バイクPOを回転させていることがプレイヤにとってわかりにくくなる。また、回転中にプレイヤの方向感覚が失われて、ジャンプ後着水したときに、自分がどの方向を向いているのかが把握しづらくなり、ゲームの興趣を下げることにもなる。そこで、本実施例では、ジャンプ状態のときは一時的にカメラの位置が固定された状態となり、上記図22(c)に示したように、水上バイクPOが回転する様が客観的に描画されるような制御を行っている。そのため、回転に際して、水上バイクPOを前面や側面から見た画像も描画されることになる。
以下、本実施例のジャンプ状態における制御処理の概要を図25〜図33を用いて説明する。まず、本実施例の処理では、姿勢制御のための制御層を2つ設けている。図25は、当該制御層の概念を示す図である。図25においては、第1制御層301と、その上に重なる第2制御層302とが示されている(水上バイクPOは、更にその上に載っているようなイメージである)。なお、この図は概念図であり、実際のゲーム画面には制御層は表示されない。ゲーム画面に表示されるのは、各制御層で決定された姿勢を反映した水上バイクPOである。
第1制御層301は、水上バイクPOの基本的な動作・姿勢制御を行うための層であり、図23や図24を用いて上述したような第1コントローラ34の姿勢に基づいた操作が反映される制御層である。また、仮想カメラの位置や画角等も当該第1制御層301における姿勢を基準として設定される。
一方、第2制御層302はジャイロセンサユニット100から出力される角速度データに基づいて姿勢を制御するための制御層である。より具体的には、第2制御層302は、ヨー方向における姿勢変化のみが反映される(それ以外の姿勢は第1制御層301と同じものとなる)。ここで、第2制御層302に対する角速度データの反映は、上記のように、ジャンプ状態のときにのみ行われる。そのため、第2制御層302は、ジャンプ中の姿勢制御にのみ用いられるものと言える。また、本実施例では、水上バイクPOから水面から離れ始めてから完全に水面から離れた状態となるまでの間(中間状態と呼ぶ)も、水面と水上バイクPOとの接触度合いに応じて段階的に姿勢変化を反映させる。具体的には、本実施例では、水面と水上バイクとの接触度Dを算出し、当該接触度Dの値に応じて、角速度データを第2制御層302に反映させる度合いを変化させる。本実施形態では、接触度Dの値は”0≦D≦1”の範囲を採る。そして、D=“1”のときは、水上バイクPOが完全に水面に浸かっている状態であり、D=“0”のときは、水上バイクPOが水面から完全に離れている状態を示す。なお、ここでいう”完全に水面に浸かっている状態”とは、水上バイクPOが静止している状態で水面に浮いているときと同じだけ、水上バイクPOの船底が水に浸かっている状態をいうものとする。つまり、Dが“0”のとき(水上バイクPOが宙に浮いている状態)は角速度データ201cが100%の割合で水上バイクPOの姿勢制御に反映されるが、接触度Dが1のとき(ジャンプ状態ではない状態)は、角速度データが反映されない(その結果、Dが1のときは、第2制御層302は第1制御層301の上に乗ったまま移動するようなイメージとなる)。また、中間状態のときは、接触度Dに応じて、例えば角速度データ201cが50%の割合で水上バイクPOの姿勢制御に反映される。
なお、中間状態の時に上記のような段階的(アナログ的)な制御を行うのは、ジャンプ状態と非ジャンプ状態(換言すれば、宙に浮いた状態と接地(接水)している状態)の状態変化が細かく発生するような状況のときに、水上バイクPOに対してジャイロセンサ104の入力値が瞬間的に作用することを防ぐためである。例えば、水面の状況が図26に示すような、ごく小さな傾斜(波)が連続しているような状態の時に、接触度Dを“0”と“1”の2段階だけを用いて制御を行うと、プレイヤにとってジャンプ中の回転操作を行うタイミングが掴みづらくなる。また、中間状態においてもある程度回転操作を反映させた方が、より違和感のないプレイ感覚をプレイヤに提供する事ができる。そのため、回転操作を行うタイミングをプレイヤに把握させやすくし、違和感のないプレイ感覚を提供すべく、上記のような段階的な姿勢制御を行っている。
図27は、水上バイクPOがジャンプ状態ではないときの仮想ゲーム空間を俯瞰して見たときの図である。また、図28は、このときのゲーム画面の一例を示す図である。この状態では、第1制御層301と第2制御層302の姿勢が同じものになっており、結果的に、水上バイクPOの姿勢は第1制御層301の姿勢がそのまま反映されたものとなっている。また、仮想カメラは、第1制御層301から少し距離を置いた真後ろの位置にある。上記のように、仮想カメラは、第1制御層301を真後ろから追いかけるような移動制御が行われる。
次に、図29は、水上バイクPOがジャンプ状態のときの各制御層の状態の一例を示す図である。また、図30は、ジャンプ状態のときの仮想ゲーム空間を俯瞰してみたときの図である。図29および図30では、第2制御層302のみがヨー方向に回転していることが示されている。また、仮想カメラは、第1制御層301の後方(図29では左側)に位置したままである。そして、第2制御層302におけるヨー方向回転の姿勢が水上バイクに反映される。その結果、ゲーム画面としては、図31に示すように、水上バイクPOが宙で回転している様が表示されることになる。
次に、ジャンプ後、水上バイクPOが着水したときの処理概要について説明する。ジャンプ後、着水したときは、必ずしも丁度360度回転をした状態とは限らず、第1制御層301と第2制御層302の姿勢がずれていることがあるため、双方の姿勢を一致させるための処理が実行される。図32は、着水時に実行される処理の概要を示す図である。まず、ジャンプした後、着水した直後の第1制御層301、第2制御層302の姿勢(接触度D=“1”となったとき)が図32(a)に示すような状態とする。図32(a)では、第1制御層はz軸方向を示す矢印が上方向(仮想空間内では正面に相当)を向いた状態であり、第2制御層は、z軸方向を示す矢印がやや右上を向いている状態である。そして、本実施例では、着水後、図32(b)に示すように、第1制御層301と第2制御層302とが互いに引き合うような姿勢制御が行われ、最終的に図32(c)に示すように両者の姿勢が一致すれば、この姿勢を新たな第1制御層301の姿勢とする処理が実行される。その結果、ジャンプして着水したときの水上バイクの姿勢は、図33に示すように、ジャンプ前(図27参照)に比べてやや右向きに変化することになる。このように双方を近づけることで、着水後の姿勢の調整の際に、急激なカメラの変化や急激な水上バイクPOの姿勢変化を抑えることができ、自然な調整を行うことができる。また、ジャンプ操作が必ずしも方向制御に影響しなくともよく、単に演技としてのジャンプ動作のみを行いたい場合には、第1制御層はそのままで、第2制御層を段階的に第1制御層に近づけていくような制御であってもよい。つまり、動作終了後に第2制御層が第1制御層と揃っていればよく、第1制御層が第2制御層へ近づく度合いはゲームの目的に応じて変えてもよい。
このように、本実施例では、仮想ゲーム空間内において水上バイクPOが一時的に宙に浮いている状態のときは、角速度に基づく姿勢制御を行うようにしている。これにより、加速度センサだけでは正確に検出できない姿勢変化を、より正確に検出して、ゲーム処理に反映できる。また、ジャンプ状態のような、短期間における姿勢制御に用いるため、誤差の蓄積による影響を抑制することができ、プレイヤにとって違和感のない姿勢制御を行うことが可能となる。
次に、本実施例で実行されるゲーム処理の詳細を説明する。図34は、本実施例のプログラムの実行に用いられるデータのメモリマップである。これらのデータはゲーム装置12の内部メインメモリ62eや外部メインメモリ66に記憶される。また、内部メインメモリ62eや外部メインメモリ66には、プログラムも記憶されるが、図示を省略している。
操作データ201は、コントローラ14から送信されてくる操作データである。これらの中には、加速度センサ84の出力に基づいた第1コントローラ34の3軸加速度を示す第1加速度データ201a、加速度センサ86の出力に基づいた第2コントローラ36の3軸加速度を示す第2加速度データ201b、ジャイロセンサ104の出力に基づいた第1コントローラ34の3軸の角速度を示す角速度データ201cや、それぞれのボタン操作に基づいたボタンデータ201d等が含まれる。
制御データ202は、操作データ201に基づいて算出される、ゲームの制御のためのデータである。制御データ202には、第1姿勢データ202a、第2姿勢データ202b、平均姿勢データ202c等が含まれる。第1姿勢データ202aは、第1加速度データ201aに基づいて算出される第1コントローラ34の姿勢であって、図23や図24のM1にあたる。第2姿勢データ202bは、第2加速度データ201bに基づいて算出される第2コントローラ36の姿勢であって、図23や図24のM2にあたる。平均姿勢データ202cは、第1姿勢データ202a、第2姿勢データ202bの平均の姿勢であって、図23や図24のMmにあたる。これらの姿勢データは、本実施例においては3次元の回転行列で表されるが、姿勢が特定できれば他の形式のデータで表されてもよい。
オブジェクトデータ203は、ゲーム内のオブジェクトのデータであって、プレイヤオブジェクト(本実施例においては水上バイクPO)のゲーム空間内での姿勢を示すオブジェクト姿勢データ203a、プレイヤオブジェクトのゲーム空間内での速さや進行方向を示すオブジェクト速度データ203b、プレイヤオブジェクトの状態、たとえばジャンプ状態であるか否か等の状態を示すオブジェクト状態データ203cが少なくとも含まれる。なお、オブジェクトデータには、それ以外にも、オブジェクトの形状を示すモデルデータや、テクスチャ画像のデータ等も含まれるし、プレイヤオブジェクト以外に関するデータも含まれるが、ここでは図示を省略する。また、これら以外にも、ゲームに必要な音楽や画像のデータ等が適宜記憶されるが、ここでは省略している。
次に、図35〜図39を参照して、ゲーム装置12によって実行されるゲーム処理について説明する。ゲーム装置12の電源が投入されると、ゲーム装置12のCPU60は、ROM/RTC68に記憶されている起動プログラムを実行し、これによって外部メインメモリ66等の各ユニットが初期化される。そして、光ディスク22に記憶されたゲームプログラムが外部メインメモリ66に読み込まれ、CPU60によって当該ゲームプログラムの実行が開始される。図35に示すフローチャートは、以上の処理が完了した後に行われるゲーム処理を示すフローチャートである。また、図35に示すステップS2〜ステップS8の処理ループは、1フレーム毎に繰り返し実行される。なお、本実施形態においては、ジャンプ状態に関連する姿勢制御以外の状況におけるゲーム処理は本発明と直接関連しないので、最低限の説明に留めて詳細な説明は省略する。
まず、ステップS1において、以降の処理において用いられるデータの初期化処理が実行される。具体的には、オブジェクト状態データ203cに、水上バイクPOが通常の走行状態である(つまり、ジャンプ状態ではない)“通常状態”を示すデータが設定される。その他、本処理で用いられる各種変数が初期化され、更に、水上バイクPO等を配置した3次元のゲーム空間が構築されて、ゲーム画像としてモニタ2に描画される。
次に、ステップS2において、コントローラ14から送信されて随時メモリに記憶される操作データ201の取得処理が実行される。
次に、ステップS3において、基本姿勢制御処理が実行される。この処理では、上述した第1制御層301での姿勢を制御するための処理が実行される。図36は、上記ステップS3で示した基本姿勢制御処理の詳細を示すフローチャートである。図36において、まず、ステップS21において、上記取得した操作データ201から第1加速度データ201a、第2加速度データ201b、角速度データ201cが取得される。
次に、ステップS22において、上記第1加速度データ201aおよび第2加速度データ201bに基づいて第1制御層301における水上バイクPOの姿勢を算出するための処理が実行される。より具体的には、まず、CPU60は、上記第1加速度データ201aおよび第2加速度データ201bから第1コントローラ34および第2コントローラ36の姿勢を算出し(3次元の回転行列として算出される)、第1姿勢データ202aと第2姿勢データ202bとして記憶する。更に、CPU60は、第1姿勢データ202aと第2姿勢データ202bとの平均となる回転行列を算出し、平均姿勢データ202cとして記憶する。そして、CPU60は、平均姿勢データ202cに基づいて第1制御層301における水上バイクPOの姿勢を決定する。
次に、ステップS23において、上記決定された第1制御層301における水上バイクPOの姿勢に対応させて水上バイクPOの移動方向(進行方向)および移動速度(1フレーム分の移動量)が設定される。またこのとき、第1制御層301における水上バイクPOの姿勢を基準として仮想カメラの位置や画角も設定される。以上で、基本姿勢制御処理が終了する。
図35に戻り、次に、ステップS4において、ジャンプ処理が実行される。本処理では、上述のように接触度Dに応じて上記第2制御層302における水上バイクPOの姿勢を変化させる処理等が実行される。図37は、上記ステップS4で示したジャンプ処理の詳細を示すフローチャートである。図37において、まず、ステップS41において、水上バイクPOと水面との接触度Dを算出するための処理が実行される。接触度Dの算出手法はどのようなものでも良いが、例えば、水上バイクPOの水に浸かっている体積(以下、浸水体積と呼ぶ)に基づいて接触度Dを算出することが考えられる。具体的には、図38に示すような、浸水体積と接触度Dとを対応付けたテーブルを予め定義しておく。図38に示すテーブルでは、一例として、浸水体積を0〜100の範囲の値で表すとして、浸水体積が72以上の時は接触度Dに“1”が設定されることを示し、浸水体積が0の時は、接触度Dに“0”が設定されることが示されている。そして、浸水体積が0〜72の間では、浸水体積に応じて段階的に接触度Dが設定されることが示されている。そして、浸水体積を算出し、当該テーブルを参照することで接触度Dを設定することが考えられる。また、浸水体積の算出方法としては、例えば、図39に示すように、水上バイクPOに仮想的な当たり判定球を設定し、いわゆるポリゴンメッシュである水面に対する当該当たり判定球のめりこみ体積を算出することが考えられる。
図37に戻り、次に、ステップS42において、接触度Dが“1”未満であるか否か、すなわち、ジャンプ状態か否かが判定される。ステップS42の判定の結果、接触度Dが“1”のとき、つまり、水上バイクPOが完全に水面に浸かっている状態のときは(ステップS42でNO)、後述のステップS48の処理に進められる。一方、接触度Dが“1”未満のときは(ステップS42でYES)、続くステップS43において、接触度Dが“0”か否か、すなわち、完全に水上バイクPOが水面から離れた状態であるか否かが判定される。当該判定の結果、接触度Dが“0“のときは(ステップS43でYES)、ステップS44においてオブジェクト状態データ203cに、”ジャンプ状態”を示すデータが設定され、処理がステップS45に進められる。一方、接触度Dが“0“ではないとき(ステップS43でNO)、ステップS44の処理は行われずに、ステップS45へと処理が進められる。
次に、ステップS45において、プレイヤから見たヨー方向の角速度ωが取得される。すなわち、上記ステップS2で取得された角速度データから、プレイヤからみたヨー方向(具体的には、y軸回りおよび/またはx軸回り)の角速度が取得される。
次に、ステップS46において、回転量の設定が実行される。具体的には、以下の式で回転量が算出される。
回転量=(1−D)×ω(×はスカラー倍を示している)
このように、接触度Dを用いて回転量を算出することで、水上バイクPOが水に浸かっている体積が多いとき(但し、上記のような「完全に」水には浸かっていないとき)は、角速度データの回転量への反映割合は100%ではなく、例えば50%だけ反映させる等、水上バイクPOが完全に宙に浮いているときよりも回転量が少なくなるというような、アナログ的な表現が可能となる。なお、本実施例ではジャンプ中のヨー方向のスピン動作という予め回転の仕方が決まった動作であるので回転量によって制御を行っているが、それ以外にも例えばロール方向等を加えて2次元以上の自由度で回転を制御することもできる。この場合、ωや回転量は2次元や3次元のベクトルで表される。
次に、ステップS47において、上記算出された回転量に応じて第2制御層302をヨー方向(仮想ゲーム空間でのy軸回り)に回転する処理が実行される。そして、当該第2制御層302の姿勢が水上バイクPOに反映され、水上バイクPOがヨー方向に回転することになる。このとき、ゲームの難度調整等の観点から、回転量を少し多めに調整したり(例えば、実際は第1コントローラ34の回転量は半回転分であっても、水上バイクPOはその倍の1回転させる等)、回転動作に惰性をつけるような処理を行っても良い。つまり、水上バイクPOをより回転させやすくするような調整処理を行うことで、ゲームの難度を下げ、興趣性を高めるような調整を行っても良い。その後、ジャンプ処理は終了する。
次に、上記ステップS42の判定の結果、接触度Dが“1”のときの処理(ステップS42でNO)について説明する。この場合は、ステップS48において、オブジェクト状態データ203cが“ジャンプ状態”か否かが判定される。つまり、ジャンプ後着水した直後の状態であるのか、通常の走行状態であるのかが判定される。当該判定の結果、“ジャンプ状態”でなければ(ステップS48でNO)、そのままジャンプ処理は終了する。
一方、上記ステップS48の判定の結果“ジャンプ状態”のときは(ステップS48でYES)、続くステップS49において、着水時処理が実行される。この処理では、図32を用いて上述したような、第1制御層301と第2制御層302の姿勢のズレを調整して、新たな第1制御層301の姿勢を決定するための処理が実行される。例えば、両者の姿勢ベクトルを算出し、両姿勢ベクトルを平均化することで得られる姿勢を新たな第1制御層301の姿勢とする処理が実行される。その後、ステップS50において、オブジェクト状態データ203cに“通常状態”を示すデータが設定される。以上で、ジャンプ処理は終了する。当該平均化の処理は数フレームかけて滑らかに行われるようにしてもよい。
図35に戻り、次に、ステップS5において、その他の物理演算、例えば、仮想ゲーム空間内に吹いている「風」や、「波」等の影響を反映させるような演算等を実行して、水上バイクの位置や姿勢を決定する。
次に、ステップS6において、前回の描画から1フレーム分の時間が経過したか否かが判定される。当該判定の結果、1フレーム分の時間が経過していないときは(ステップS6でNO)、上記ステップS2に戻り、処理が繰り返される(本実施例では、操作データは1/200秒単位で送信されるため、上記ステップS2〜S6の処理ループは、1/60秒である1フレーム当たり、3〜4回繰り返されることになる)。一方、ステップS6の判定の結果、1フレーム分の時間が経過していれば(ステップS10でYES)、ステップS7において、描画処理が実行される。すなわち、仮想カメラで仮想ゲーム空間を撮影した画像をゲーム画像としてテレビ26に表示する処理が実行される。
ステップS7の後、ステップS8において、ゲーム終了か否かが判断され、YESの場合、ゲーム処理を終了し、NOの場合、ステップS2に戻って、ゲーム処理が繰り返される。以上で、本実施例にかかるゲーム処理は終了する。
このように、本実施例では、ジャンプなどにより仮想空間内で一時的に空中に存在しているオブジェクトの空中での姿勢の変化をジャイロセンサ104からの角速度データに基づいて制御している。これにより、検出誤差の影響を最小限に抑え、入力の正確性を高めることが可能となる。
なお、上述した実施形態では、ジャンプ状態の時の水上バイクPOについて、ヨー方向に回転をさせる場合を例に挙げたが、ヨー方向以外の方向(例えばピッチ方向)へ回転させるようにしてもよい。
また、上記実施例では水上バイクを操作するゲームを例に挙げたため、「水面からのジャンプ」という状態を例としていたが、これに限らず、地面からのジャンプの場合にも本発明が適用できることは言うまでもない。更には、水面や地面のみならず、例えば、巨大モンスターの背中でプレイヤオブジェクトがジャンプする場合のような、重力(引力)が設定されている仮想空間内で、一時的に宙に浮いている状態のオブジェクトを制御する処理全般について、本発明は適用可能である。
また、上述の実施例では、水上バイクを操作するゲームを例としたが、水上バイクの代わりに例えば自動車オブジェクトを操作するゲームに本発明を適用してもよい。この場合、地面と自動車オブジェクトとの接触度Dを算出は、次のようにして行うことが考えられる。すなわち、図40に示すように、地面の法線方向に仮想的な厚みを設定する。そして、当該厚み内の自動車オブジェクトの体積を算出し、上記接触度Dを算出するようにしればよい。つまり、地表から法線方向の所定の高さまでの空間に含まれている自動車オブジェクトの体積に基づいて接触度Dを算出すればよい。
また、接触度Dの算出に関して、体積ではなく、地面とオブジェクトとの接触面積を算出して、これに基づいて接触度Dを算出するようにしても良い。例えば、スノーボードオブジェクトを操作するゲームを想定すると、図41に示すように、スノーボードオブジェクトに複数の当たり判定球を設定しておく。そして、地面(ゲーム内容からすれば、雪面として表現される)に接触している(地面にめり込んでいる)当たり判定球の数を接触面積として算出して、上記接触度Dを算出するようにしても良い。
また、上記実施例では、ジャンプ中の姿勢制御にジャイロセンサ104からの角速度データを用いていたが、例えば、加速度データを時間で積分することで上記のようなジャンプ状態において操作された第1コントローラ34の移動速度を算出し、当該速度を用いてジャンプ中のオブジェクトの姿勢制御を行うようにしても良い。例えば、ジャンプ中に第1コントローラ34を横方向に振ったとき、上記速度が算出され、当該速度が予め定められた所定値以上のときは、プレイヤが操作するオブジェクトが横にスライドするような動きを行うような制御を実行しても良い。また、例えば、レースゲームを想定し、2つのコースが並列している(コース間がある程度の高さを有するレーンで区切られている、あるいは、一方のコースと他方のコースとで高低差がある)場面で、プレイヤが操作する自動車オブジェクトがコース上でジャンプしたときに、コントローラを横に振ることで、当該自動車オブジェクトが横にスライドするように動き制御を行って、隣のコースにコース変更が可能にすることが考えられる。また、アクションゲームなどにおいて、プレイヤオブジェクトがジャンプ中に第1コントローラ34を上方向に所定の速度以上の速度で振ったとき、いわゆる2段ジャンプを行い、所定の速度以上で下方向に振ると、急降下して着地するような動作制御を行っても良い。また、ジャンプ中に第1コントローラ34を前後方向(奥行き方向)に移動させたときは、急加速や急ブレーキを行うような処理をしてもいい。例えば、ロボットを操作するゲームにおいて、プレイヤが操作するロボットオブジェクトがジャンプ中に、第1コントローラ34を奥行き方向に突き出すような操作を行えば、ロボットオブジェクトがバーニアを噴射して前方にダッシュするような制御を行い、第1コントローラ34を手前方向に引くような操作を行えば、ロボットオブジェクトが逆噴射して後方に下がるようにダッシュするような制御を行うことが考えられる。加速度を積分して算出された速度も、誤差が発生しやすい性質があり、そのような速度に基づいて位置を算出する場合には、前述の角速度と同じような問題が発生し得ると考えられる。したがって、前述の実施例同様に、本願発明を採用することで、直感的な操作を誤差を抑えつつ効率的に実現させることができる。