[ゲームシステムの全体構成]
図1を参照して、本発明の一実施形態に係る座標算出装置の一例であるゲーム装置を含むゲームシステム1について説明する。図1は、ゲームシステム1の外観図である。以下、据置型のゲーム装置を一例にして、本実施形態のゲーム装置およびゲームプログラムについて説明する。図1において、ゲームシステム1は、テレビジョン受像器(以下、単に「テレビ」と記載する)2、ゲーム装置3、光ディスク4、入力装置8、およびマーカ部6を含む。本システムは、入力装置8を用いたゲーム操作に基づいてゲーム装置3でゲーム処理を実行するものである。
ゲーム装置3には、当該ゲーム装置3に対して交換可能に用いられる情報記憶媒体の一例である光ディスク4が脱着可能に挿入される。光ディスク4には、ゲーム装置3において実行されるためのゲームプログラムが記憶されている。ゲーム装置3の前面には光ディスク4の挿入口が設けられている。ゲーム装置3は、挿入口に挿入された光ディスク4に記憶されているゲームプログラムを読み出して実行することによってゲーム処理を実行する。
ゲーム装置3には、表示装置の一例であるテレビ2が接続コードを介して接続される。テレビ2は、ゲーム装置3において実行されるゲーム処理の結果得られるゲーム画像を表示する。また、テレビ2の画面の周辺(図1では画面の上側)には、マーカ部6が設置される。マーカ部6は、その両端に2つのマーカ6Rおよび6Lを備えている。マーカ6R(マーカ6Lも同様)は、具体的には1以上の赤外LEDであり、テレビ2の前方に向かって赤外光を出力する。マーカ部6はゲーム装置3に接続されており、ゲーム装置3はマーカ部6が備える各赤外LEDの点灯を制御することが可能である。
入力装置8は、自機に対して行われた操作の内容を示す操作データをゲーム装置3に与えるものである。本実施形態では、入力装置8はコントローラ5とジャイロセンサユニット7とを含む。詳細は後述するが、入力装置8は、コントローラ5に対してジャイロセンサユニット7が着脱可能に接続されている構成である。コントローラ5とゲーム装置3とは無線通信によって接続される。本実施形態では、コントローラ5とゲーム装置3との間の無線通信には例えばBluetooth(ブルートゥース)(登録商標)の技術が用いられる。なお、他の実施形態においてはコントローラ5とゲーム装置3とは有線で接続されてもよい。
[ゲーム装置3の内部構成]
次に、図2を参照して、ゲーム装置3の内部構成について説明する。図2は、ゲーム装置3の構成を示すブロック図である。ゲーム装置3は、CPU10、システムLSI11、外部メインメモリ12、ROM/RTC13、ディスクドライブ14、およびAV−IC15等を有する。
CPU10は、光ディスク4に記憶されたゲームプログラムを実行することによってゲーム処理を実行するものであり、ゲームプロセッサとして機能する。CPU10は、システムLSI11に接続される。システムLSI11には、CPU10の他、外部メインメモリ12、ROM/RTC13、ディスクドライブ14およびAV−IC15が接続される。システムLSI11は、それに接続される各構成要素間のデータ転送の制御、表示すべき画像の生成、外部装置からのデータの取得等の処理を行う。システムLSIの内部構成について後述する。揮発性の外部メインメモリ12は、光ディスク4から読み出されたゲームプログラムや、フラッシュメモリ17から読み出されたゲームプログラム等のプログラムを記憶したり、各種データを記憶したりするものであり、CPU10のワーク領域やバッファ領域として用いられる。ROM/RTC13は、ゲーム装置3の起動用のプログラムが組み込まれるROM(いわゆるブートROM)と、時間をカウントするクロック回路(RTC:Real Time Clock)とを有する。ディスクドライブ14は、光ディスク4からプログラムデータやテクスチャデータ等を読み出し、後述する内部メインメモリ11eまたは外部メインメモリ12に読み出したデータを書き込む。
また、システムLSI11には、入出力プロセッサ(I/Oプロセッサ)11a、GPU(Graphics Processor Unit)11b、DSP(Digital Signal Processor)11c、VRA 1d、および内部メインメモリ11eが設けられる。図示は省略するが、これらの構成要素11a〜11eは内部バスによって互いに接続される。
GPU11bは、描画手段の一部を形成し、CPU10からのグラフィクスコマンド(作画命令)に従って画像を生成する。VRAM11dは、GPU11bがグラフィクスコマンドを実行するために必要なデータ(ポリゴンデータやテクスチャデータ等のデータ)を記憶する。画像が生成される際には、GPU11bは、VRAM11dに記憶されたデータを用いて画像データを作成する。
DSP11cは、オーディオプロセッサとして機能し、内部メインメモリ11eや外部メインメモリ12に記憶されるサウンドデータや音波形(音色)データを用いて、音声データを生成する。
上述のように生成された画像データおよび音声データは、AV−IC15によって読み出される。AV−IC15は、読み出した画像データをAVコネクタ16を介してテレビ2に出力するとともに、読み出した音声データを、テレビ2に内蔵されるスピーカ2aに出力する。これによって、画像がテレビ2に表示されるとともに音がスピーカ2aから出力される。
入出力プロセッサ11aは、それに接続される構成要素との間でデータの送受信を実行したり、外部装置からのデータのダウンロードを実行したりする。入出力プロセッサ11aは、フラッシュメモリ17、無線通信モジュール18、無線コントローラモジュール19、拡張コネクタ20、およびメモリカード用コネクタ21に接続される。無線通信モジュール18にはアンテナ22が接続され、無線コントローラモジュール19にはアンテナ23が接続される。
入出力プロセッサ11aは、無線通信モジュール18およびアンテナ22を介してネットワークに接続し、ネットワークに接続される他のゲーム装置や各種サーバと通信することができる。入出力プロセッサ11aは、定期的にフラッシュメモリ17にアクセスし、ネットワークへ送信する必要があるデータの有無を検出し、当該データが有る場合には、無線通信モジュール18およびアンテナ22を介してネットワークに送信する。また、入出力プロセッサ11aは、他のゲーム装置から送信されてくるデータやダウンロードサーバからダウンロードしたデータを、ネットワーク、アンテナ22および無線通信モジュール18を介して受信し、受信したデータをフラッシュメモリ17に記憶する。CPU10はゲームプログラムを実行することにより、フラッシュメモリ17に記憶されたデータを読み出してゲームプログラムで利用する。フラッシュメモリ17には、ゲーム装置3と他のゲーム装置や各種サーバとの間で送受信されるデータの他、ゲーム装置3を利用してプレイしたゲームのセーブデータ(ゲームの結果データまたは途中データ)が記憶されてもよい。
また、入出力プロセッサ11aは、コントローラ5から送信される操作データをアンテナ23および無線コントローラモジュール19を介して受信し、内部メインメモリ11eまたは外部メインメモリ12のバッファ領域に記憶(一時記憶)する。
さらに、入出力プロセッサ11aには、拡張コネクタ20およびメモリカード用コネクタ21が接続される。拡張コネクタ20は、USBやSCSIのようなインターフェースのためのコネクタであり、外部記憶媒体のようなメディアを接続したり、他のコントローラのような周辺機器を接続したり、有線の通信用コネクタを接続することによって無線通信モジュール18に替えてネットワークとの通信を行ったりすることができる。メモリカード用コネクタ21は、メモリカードのような外部記憶媒体を接続するためのコネクタである。例えば、入出力プロセッサ11aは、拡張コネクタ20やメモリカード用コネクタ21を介して外部記憶媒体にアクセスし、外部記憶媒体にデータを保存したり、外部記憶媒体からデータを読み出したりすることができる。
ゲーム装置3には、電源ボタン24、リセットボタン25、およびイジェクトボタン26が設けられる。電源ボタン24およびリセットボタン25は、システムLSI11に接続される。電源ボタン24がオンされると、ゲーム装置3の各構成要素に対して、図示しないACアダプタを経て電源が供給される。リセットボタン25が押されると、システムLSI11は、ゲーム装置3の起動プログラムを再起動する。イジェクトボタン26は、ディスクドライブ14に接続される。イジェクトボタン26が押されると、ディスクドライブ14から光ディスク4が排出される。
[入力装置8の構成]
次に、図3〜図6を参照して、入力装置8について説明する。図3は、入力装置8の外観構成を示す斜視図である。図4は、コントローラ5の外観構成を示す斜視図である。図3は、コントローラ5の上側後方から見た斜視図であり、図4は、コントローラ5を下側前方から見た斜視図である。
図3および図4において、コントローラ5は、例えばプラスチック成型によって形成されたハウジング31を有している。ハウジング31は、その前後方向(図3に示すZ軸方向)を長手方向とした略直方体形状を有しており、全体として大人や子供の片手で把持可能な大きさである。プレイヤは、コントローラ5に設けられたボタンを押下すること、および、コントローラ5自体を動かしてその位置や姿勢を変えることによってゲーム操作を行うことができる。
ハウジング31には、複数の操作ボタンが設けられる。図3に示すように、ハウジング31の上面には、十字ボタン32a、1番ボタン32b、2番ボタン32c、Aボタン32d、マイナスボタン32e、ホームボタン32f、プラスボタン32g、および電源ボタン32hが設けられる。本明細書では、これらのボタン32a〜32hが設けられるハウジング31の上面を「ボタン面」と呼ぶことがある。一方、図4に示すように、ハウジング31の下面には凹部が形成されており、当該凹部の後面側傾斜面にはBボタン32iが設けられる。これらの各操作ボタン32a〜32iには、ゲーム装置3が実行するゲームプログラムに応じた機能が適宜割り当てられる。また、電源ボタン32hは遠隔からゲーム装置3本体の電源をオン/オフするためのものである。ホームボタン32fおよび電源ボタン32hは、その上面がハウジング31の上面に埋没している。これによって、プレイヤがホームボタン32fまたは電源ボタン32hを誤って押下することを防止することができる。
ハウジング31の後面にはコネクタ33が設けられている。コネクタ33は、コントローラ5に他の機器(例えば、ジャイロセンサユニット7や他のコントローラ)を接続するために利用される。また、ハウジング31の後面におけるコネクタ33の両側には、上記他の機器が容易に離脱することを防止するために係止穴33aが設けられている。
ハウジング31上面の後方には複数(図3では4つ)のLED34a〜34dが設けられる。ここで、コントローラ5には、他のメインコントローラと区別するためにコントローラ種別(番号)が付与される。各LED34a〜34dは、コントローラ5に現在設定されている上記コントローラ種別をプレイヤに通知したり、コントローラ5の電池残量をプレイヤに通知したりする等の目的で用いられる。具体的には、コントローラ5を用いてゲーム操作が行われる際、上記コントローラ種別に応じて複数のLED34a〜34dのいずれか1つが点灯する。
また、コントローラ5は撮像情報演算部35(図6)を有しており、図4に示すように、ハウジング31前面には撮像情報演算部35の光入射面35aが設けられる。光入射面35aは、マーカ6Rおよび6Lからの赤外光を少なくとも透過する材質で構成される。
ハウジング31上面における1番ボタン32bとホームボタン32fとの間には、コントローラ5に内蔵されるスピーカ49(図5)からの音を外部に放出するための音抜き孔31aが形成されている。
次に、図5および図6を参照して、コントローラ5の内部構造について説明する。図5および図6は、コントローラ5の内部構造を示す図である。なお、図5は、コントローラ5の上筐体(ハウジング31の一部)を外した状態を示す斜視図である。図6は、コントローラ5の下筐体(ハウジング31の一部)を外した状態を示す斜視図である。図6に示す斜視図は、図5に示す基板30を裏面から見た斜視図となっている。
図5において、ハウジング31の内部には基板30が固設されており、当該基板30の上主面上に各操作ボタン32a〜32h、各LED34a〜34d、加速度センサ37、アンテナ45、およびスピーカ49等が設けられる。これらは、基板30等に形成された配線(図示せず)によってマイクロコンピュータ(Micro Computer:マイコン)42(図6参照)に接続される。本実施形態では、加速度センサ37は、X軸方向に関してコントローラ5の中心からずれた位置に配置されている。これによって、コントローラ5をZ軸回りに回転させたときのコントローラ5の動きが算出しやすくなる。また、加速度センサ37は、長手方向(Z軸方向)に関してコントローラ5の中心よりも前方に配置されている。また、無線モジュール44(図6)およびアンテナ45によって、コントローラ5がワイヤレスコントローラとして機能する。
一方、図6において、基板30の下主面上の前端縁に撮像情報演算部35が設けられる。撮像情報演算部35は、コントローラ5の前方から順に赤外線フィルタ38、レンズ39、撮像素子40、および画像処理回路41を備えている。これらの部材38〜41はそれぞれ基板30の下主面に取り付けられる。
さらに、基板30の下主面上には、上記マイコン42およびバイブレータ48が設けられている。バイブレータ48は、例えば振動モータやソレノイドであり、基板30等に形成された配線によってマイコン42と接続される。マイコン42の指示によりバイブレータ48が作動することによってコントローラ5に振動が発生する。これによって、コントローラ5を把持しているプレイヤの手にその振動が伝達される、いわゆる振動対応ゲームを実現することができる。本実施形態では、バイブレータ48は、ハウジング31のやや前方寄りに配置される。つまり、バイブレータ48がコントローラ5の中心よりも端側に配置することによって、バイブレータ48の振動によりコントローラ5全体を大きく振動させることができる。また、コネクタ33は、基板30の下主面上の後端縁に取り付けられる。なお、図5および図6に示す他、コントローラ5は、マイコン42の基本クロックを生成する水晶振動子、スピーカ49に音声信号を出力するアンプ等を備えている。
また、ジャイロセンサユニット7は、3軸回りの角速度を検知するジャイロセンサ(図7に示すジャイロセンサ55および56)を有する。ジャイロセンサユニット7は、コントローラ5のコネクタ33に着脱可能に装着される。ジャイロセンサユニット7の前端(図3に示すZ軸正方向側の端部)には、コネクタ33に接続可能なプラグ(図7に示すプラグ53)が設けられる。さらに、プラグ53の両側にはフック(図示せず)が設けられる。ジャイロセンサユニット7がコントローラ5に対して装着される状態では、プラグ53がコネクタ33に接続されるとともに、上記フックがコントローラ5の係止穴33aに係止する。これによって、コントローラ5とジャイロセンサユニット7とがしっかりと固定される。また、ジャイロセンサユニット7は側面(図3に示すX軸方向の面)にボタン51を有している。ボタン51は、それを押下すれば上記フックの係止穴33aに対する係止状態を解除することができるように構成されている。したがって、ボタン51を押下しながらプラグ53をコネクタ33から抜くことによって、ジャイロセンサユニット7をコントローラ5から離脱することができる。
また、ジャイロセンサユニット7の後端には、上記コネクタ33と同形状のコネクタが設けられる。したがって、コントローラ5(のコネクタ33)に対して装着可能な他の機器は、ジャイロセンサユニット7のコネクタに対しても装着可能である。なお、図3においては、当該コネクタに対してカバー52が着脱可能に装着されている。
なお、図3〜図6に示したコントローラ5およびジャイロセンサユニット7の形状や、各操作ボタンの形状、加速度センサやバイブレータの数および設置位置等は単なる一例に過ぎず、他の形状、数、および設置位置であっても、本発明を実現することができる。また、本実施形態では、撮像手段による撮像方向はZ軸正方向であるが、撮像方向はいずれの方向であってもよい。すなわち、コントローラ5における撮像情報演算部35の位置(撮像情報演算部35の光入射面35a)は、ハウジング31の前面でなくてもよく、ハウジング31の外部から光を取り入れることができれば他の面に設けられてもかまわない。
図7は、入力装置8(コントローラ5およびジャイロセンサユニット7)の構成を示すブロック図である。コントローラ5は、操作部32(各操作ボタン32a〜32i)、コネクタ33、撮像情報演算部35、通信部36、および加速度センサ37を備えている。コントローラ5は、自機に対して行われた操作内容を示すデータを操作データとしてゲーム装置3へ送信するものである。
操作部32は、上述した各操作ボタン32a〜32iを含み、各操作ボタン32a〜32iに対する入力状態(各操作ボタン32a〜32iが押下されたか否か)を示す操作ボタンデータを通信部36のマイコン42へ出力する。
撮像情報演算部35は、撮像手段が撮像した画像データを解析してその中で輝度が高い領域を判別してその領域の重心位置やサイズなどを算出するためのシステムである。撮像情報演算部35は、例えば最大200フレーム/秒程度のサンプリング周期を有するので、比較的高速なコントローラ5の動きでも追跡して解析することができる。
撮像情報演算部35は、赤外線フィルタ38、レンズ39、撮像素子40、および画像処理回路41を含んでいる。赤外線フィルタ38は、コントローラ5の前方から入射する光から赤外線のみを通過させる。レンズ39は、赤外線フィルタ38を透過した赤外線を集光して撮像素子40へ入射させる。撮像素子40は、例えばCMOSセンサやあるいはCCDセンサのような固体撮像素子であり、レンズ39が集光した赤外線を受光して画像信号を出力する。ここで、テレビ2の表示画面近傍に配置されるマーカ部6のマーカ6Rおよび6Lは、テレビ2の前方に向かって赤外光を出力する赤外LEDで構成される。したがって、赤外線フィルタ38を設けることによって、撮像素子40は、赤外線フィルタ38を通過した赤外線だけを受光して画像データを生成するので、マーカ6Rおよび6Lの画像をより正確に撮像することができる。以下では、撮像素子40によって撮像された画像を撮像画像と呼ぶ。撮像素子40によって生成された画像データは、画像処理回路41で処理される。画像処理回路41は、撮像画像内における撮像対象(マーカ6Rおよび6L)の位置を算出する。画像処理回路41は、算出された位置を示す座標を通信部36のマイコン42へ出力する。この座標のデータは、マイコン42によって操作データとしてゲーム装置3に送信される。以下では、上記座標を「マーカ座標」と呼ぶ。マーカ座標はコントローラ5自体の向き(傾斜角度)や位置に対応して変化するので、ゲーム装置3はこのマーカ座標を用いてコントローラ5の向きや位置を算出することができる。
なお、他の実施形態においては、コントローラ5は画像処理回路41を備えていない構成であってもよく、撮像画像自体がコントローラ5からゲーム装置3へ送信されてもよい。このとき、ゲーム装置3は、画像処理回路41と同様の機能を有する回路あるいはプログラムを有しており、上記マーカ座標を算出するようにしてもよい。
加速度センサ37は、コントローラ5の加速度(重力加速度を含む)を検出する、すなわち、コントローラ5に加わる力(重力を含む)を検出する。加速度センサ37は、当該加速度センサ37の検出部に加わっている加速度のうち、センシング軸方向に沿った直線方向の加速度(直線加速度)の値を検出する。例えば、2軸以上の多軸加速度センサの場合には、加速度センサの検出部に加わっている加速度として、各軸に沿った成分の加速度をそれぞれ検出する。例えば、3軸または2軸の加速度センサは、アナログ・デバイセズ株式会社(Analog Devices, Inc.)またはSTマイクロエレクトロニクス社(STMicroelectronics N.V.)から入手可能である種類のものでもよい。なお、加速度センサ37は、例えば静電容量式の加速度センサであるとするが、他の方式の加速度センサを用いるようにしてもよい。
本実施形態では、加速度センサ37は、コントローラ5を基準とした上下方向(図3に示すY軸方向)、左右方向(図3に示すX軸方向)および前後方向(図3に示すZ軸方向)の3軸方向に関してそれぞれ直線加速度を検出する。加速度センサ37は、各軸に沿った直線方向に関する加速度を検出するものであるため、加速度センサ37からの出力は3軸それぞれの直線加速度の値を表すものとなる。すなわち、検出された加速度は、入力装置8(コントローラ5)を基準に設定されるXYZ座標系(コントローラ座標系)における3次元のベクトル(ax,ay,az)として表される。以下では、加速度センサ37によって検出される3軸に関する各加速度値を各成分とするベクトルを加速度ベクトルと呼ぶ。
加速度センサ37が検出した加速度を示すデータ(加速度データ)は、通信部36へ出力される。なお、加速度センサ37が検出した加速度は、コントローラ5自体の向き(傾斜角度)や動きに対応して変化するので、ゲーム装置3は加速度データを用いてコントローラ5の向きや動きを算出することができる。本実施形態では、ゲーム装置3は、加速度データに基づいてコントローラ5の姿勢を判断する。
加速度センサ37が検出した加速度(加速度ベクトル)を示すデータ(加速度データ)は、通信部36へ出力される。本実施形態において、加速度センサ37は、コントローラ5の傾斜角度を判断するためのデータを出力するセンサとして用いられる。
なお、加速度センサ37から出力される加速度の信号に基づいて、ゲーム装置3のプロセッサ(例えばCPU10)またはコントローラ5のプロセッサ(例えばマイコン42)等のコンピュータが処理を行うことによって、コントローラ5に関するさらなる情報を推測または算出(判定)することができることは、当業者であれば本明細書の説明から容易に理解できるであろう。例えば、加速度センサ37を搭載するコントローラ5が静止状態であることを前提としてコンピュータ側の処理が実行される場合(すなわち、加速度センサによって検出される加速度が重力加速度のみであるとして処理が実行される場合)、コントローラ5が現実に静止状態であれば、検出された加速度に基づいてコントローラ5の姿勢が重力方向に対して傾いているか否かまたはどの程度傾いているかを知ることができる。具体的には、加速度センサ37の検出軸が鉛直下方向を向いている状態を基準としたとき、1G(重力加速度)がかかっているか否かによって、コントローラ5が基準に対して傾いているか否かを知ることができるし、その大きさによって基準に対してどの程度傾いているかも知ることができる。また、多軸の加速度センサ37の場合には、さらに各軸の加速度の信号に対して処理を施すことによって、重力方向に対してコントローラ5がどの程度傾いているかをより詳細に知ることができる。この場合において、プロセッサは、加速度センサ37からの出力に基づいてコントローラ5の傾斜角度を算出してもよいし、当該傾斜角度を算出せずに、コントローラ5の傾斜方向を算出するようにしてもよい。このように、加速度センサ37をプロセッサと組み合わせて用いることによって、コントローラ5の傾斜角度または姿勢を判定することができる。
一方、コントローラ5が動的な状態(コントローラ5が動かされている状態)であることを前提とする場合には、加速度センサ37は重力加速度に加えてコントローラ5の動きに応じた加速度を検出するので、検出された加速度から重力加速度の成分を所定の処理により除去することによってコントローラ5の動き方向を知ることができる。また、コントローラ5が動的な状態であることを前提とする場合であっても、検出された加速度から、加速度センサの動きに応じた加速度の成分を所定の処理により除去することによって、重力方向に対するコントローラ5の傾きを知ることが可能である。なお、他の実施例では、加速度センサ37は、内蔵の加速度検出手段で検出された加速度信号をマイコン42に出力する前に当該加速度信号に対して所定の処理を行うための、組込み式の処理装置または他の種類の専用の処理装置を備えていてもよい。組込み式または専用の処理装置は、例えば、加速度センサ37が静的な加速度(例えば、重力加速度)を検出するために用いられる場合、加速度信号を傾斜角(あるいは、他の好ましいパラメータ)に変換するものであってもよい。
通信部36は、マイコン42、メモリ43、無線モジュール44、およびアンテナ45を含んでいる。マイコン42は、処理を行う際にメモリ43を記憶領域として用いながら、マイコン42が取得したデータをゲーム装置3へ無線送信する無線モジュール44を制御する。また、マイコン42はコネクタ33に接続されている。ジャイロセンサユニット7から送信されてくるデータは、コネクタ33を介してマイコン42に入力される。以下、ジャイロセンサユニット7の構成について説明する。
ジャイロセンサユニット7は、プラグ53、マイコン54、2軸ジャイロセンサ55、および1軸ジャイロセンサ56を備えている。上述のように、ジャイロセンサユニット7は、3軸(本実施形態では、XYZ軸)周りの角速度を検出し、検出した角速度を示すデータ(角速度データ)をコントローラ5へ送信する。
2軸ジャイロセンサ55は、X軸周りの角速度およびY軸周りの(単位時間あたりの)角速度を検出する。また、1軸ジャイロセンサ56は、Z軸周りの(単位時間あたりの)角速度を検出する。なお、本明細書では、コントローラ5の撮像方向(Z軸正方向)を基準として、XYZ軸周りの回転方向を、それぞれ、ロール方向、ピッチ方向、ヨー方向と呼ぶ。すなわち、2軸ジャイロセンサ55は、ロール方向(X軸周りの回転方向)およびピッチ方向(Y軸周りの回転方向)の角速度を検出し、1軸ジャイロセンサ56は、ヨー方向(Z軸周りの回転方向)の角速度を検出する。
なお、本実施形態では、3軸回りの角速度を検出するために、2軸ジャイロセンサ55と1軸ジャイロセンサ56とを用いる構成としたが、他の実施形態においては、3軸回りの角速度を検出することができればよく、用いるジャイロセンサの数および組み合わせはどのようなものであってもよい。
また、本実施形態では、後述する姿勢算出処理における計算を容易にする目的で、各ジャイロセンサ55および56が角速度を検出する3つの軸は、加速度センサ37が加速度を検出する3つの軸(XYZ軸)と一致するように設定される。ただし、他の実施形態においては、各ジャイロセンサ56および57が角速度を検出する3つの軸と、加速度センサ37が加速度を検出する3つの軸とは一致しなくてもよい。
各ジャイロセンサ56および57で検出された角速度を示すデータは、マイコン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〜図12を参照して、ゲーム装置3において実行される、入力装置8の姿勢を算出する姿勢算出処理の概要を説明する。本実施形態では、ゲーム装置3は、ジャイロセンサ55および56と、加速度センサ37と、撮像手段(撮像素子40)とを備えた入力装置8からデータ(操作データ)を取得し、入力装置8の姿勢を算出する。なお、本実施形態では、入力装置8は、加速度センサ37と撮像素子40とを両方備える構成とするが、他の実施形態においては、加速度センサ37と撮像素子40とのいずれか一方のみを備える構成であってもよい。
ゲーム装置3は、(1)姿勢算出手段と、(2)第1補正手段と、(3)第2補正手段とを備えている。本実施形態においては、これら各手段は、ゲーム装置3のコンピュータ(CPU10)によって実行されるゲームプログラム(座標算出プログラム)が、当該コンピュータを当該各手段として機能させることによって実現される。なお、他の実施形態においては、上記各手段の一部または全部は、ゲーム装置3が備える専用回路として実現されてもよい。
(1)姿勢算出手段
姿勢算出手段は、ジャイロセンサ55および56が検出する角速度に基づいて入力装置8の姿勢を算出する(後述するステップS4)。角速度から姿勢を算出する方法はどのような方法であってもよいが、例えば、初期姿勢に(単位時間あたりの)角速度を逐次加算する方法がある。すなわち、ジャイロセンサ55および56から逐次出力される角速度を積分し、初期状態からの姿勢の変化量を積分結果から算出することによって、現在の姿勢を算出することができる。なお、以下では、姿勢算出手段によって角速度から算出される入力装置8の姿勢を「第1の姿勢」と呼ぶ。ただし、第1の姿勢に補正が加えられた後の姿勢も第1の姿勢と呼ぶ。
ここで、ジャイロセンサ55および56が検出する角速度を用いて算出される上記第1の姿勢には、ジャイロセンサ55および56の誤検知が原因で、入力装置8の実際の姿勢との間に誤差が生じることがある。そこで、本実施形態では、ゲーム装置3は、加速度センサ37によって検出される加速度を用いて上記第1の姿勢を補正する。また、撮像素子40によって撮像される画像(撮像画像)を用いて上記第1の姿勢を補正する。
(2)第1補正手段
第1補正手段は、加速度センサ37が検出する加速度データに基づいて上記第1の姿勢を補正する(後述するステップS5)。本実施形態では、第1補正手段は、上記第1の姿勢を第2の姿勢へと近づける補正を行う。ここで、第2の姿勢とは、加速度データから決まる姿勢、具体的には、加速度データが示す加速度の向きが鉛直下向きであると想定する場合における入力装置8の姿勢を指す。すなわち、加速度データが示す加速度が重力加速度であると仮定して算出された姿勢である。以下、図8〜図10を参照して、第1補正手段による補正処理(第1補正処理)を説明する。
図8は、第2の姿勢を用いた第1の姿勢の補正を示す図である。なお、本実施形態では、実際には3次元空間における姿勢を処理しているが、図8〜図10では、図面をわかりやすくするために2次元平面における姿勢を用いて説明する。図8(a)に示すベクトルGは、入力装置8が存在する空間の所定位置を基準とした空間座標系に定義された鉛直下方向、すなわち重力方向を示す。また、図8(a)に示すベクトルv1は、コントローラ5が第1の姿勢であるときの、入力装置8の下向きのベクトル(すなわち図3−図5に示されるY軸負方向)の空間座標系での向きを示したものである。なお、入力装置8の姿勢が基本状態にあるときには、姿勢を示すベクトルはベクトルGと一致することになる。したがって、ベクトルv1は、空間座標系における第1の姿勢に対応する。上記第1の姿勢は、ベクトルGに対してベクトルv1がなす回転としても表すことができ、2次元の図8においては角度θ1として示している。第1の姿勢は角速度によって算出されるので、ベクトルv1は、前回の姿勢に角速度を加えて回転させることによって算出されるものである。第2の姿勢は加速度データに基づいて算出される。図8(a)に示すベクトルv2は、加速度データが示す加速度の向き(ビュー座標系における加速度の向き)を示している。ただし、加速度データは入力装置8に加えられる加速度であって、取得できるのは入力装置8を基準とした座標系におけるベクトルである。図8(b)に、加速度センサの軸と加速度ベクトルとの関係を示す。図8(b)のように、加速度センサから取得される加速度ベクトルv0と、センサのY軸負方向とのなす角度がθ2であるとき、図8(a)の空間座標系においては、ベクトルv1に回転θ2を加えたベクトルv2が空間座標系における加速度ベクトルとなる。そして、第2の姿勢は、上述したように「加速度データが示す加速度の向きが鉛直下向きとみなした場合における入力装置8の姿勢」であるので、ベクトルv2からベクトルv1へ向いた角度θ2の回転が第2の姿勢となる。第2の姿勢を、ベクトルv1のように空間座標系における入力装置8の下向きのベクトルで表すと、ベクトルGをθ2だけ回転させたベクトルv2’として示すことができる。また、3次元の姿勢の場合には、3次元の回転行列等で表現することもできる。なお、角速度から第1の姿勢が正しく算出され、かつ、加速度データが重力方向を正確に示している場合には、加速度の向きを示すベクトルv2の方向は空間座標系の鉛直下方向、つまり重力方向と一致する。つまり、角速度から第1の姿勢が正しく算出されていない場合や、加速度データが正確な重力方向を示していない場合には、図8(a)のように、加速度の向きを示すベクトルv2と重力方向のベクトルGとが異なる。そして、例えば静止状態等のように、加速度データにより示される方向が重力方向と一致すると想定される状況においては、ベクトルv1よりもベクトルv2の方が入力装置8の姿勢に対応するデータとして正確なものと考えられる。また、入力装置が静止していない場合であっても、ある程度の期間内における平均的な姿勢の精度を考慮すると、加速度ベクトルは平均的には重力方向に近いものとなるので、時間とともに誤差の蓄積する角速度から算出される姿勢よりも信頼できるものと考えられる。一方で、前回の算出タイミングで正しい姿勢が算出されている状態であった場合には、次の算出タイミングにおける姿勢の算出には、加速度よりも角速度を用いた方が正確な姿勢が算出されると考えられる。すなわち、角速度による姿勢算出は、タイミングごとの誤差は加速度による算出よりも小さいが、時間と共に誤差が増大する一方、加速度による姿勢算出は、タイミングごとの誤差は場合よっては大きい可能性もあるが、タイミングごとに算出可能であるので誤差が蓄積しないという特徴を持つ。したがって、第1補正手段では、第1の姿勢と第2の姿勢の両方を考慮した補正を行う。
第1補正手段による補正は、上記第1の姿勢を第2の姿勢へと近づける補正である。つまり、第1補正手段は、上記角度θ1を上記角度θ2に近づける補正を行う。これは、ベクトルv1をベクトルv2’に近づける補正と表現してもよい。ただし、演算の過程上は、ベクトルv2がわかっていれば、ベクトルv2’自体は算出されなくとも補正は可能である。本実施形態では、上記補正は、補正量を示すベクトルv3を用いて行われる。図9は、補正量を示すベクトルv3を示す図である。図9に示すベクトルv3は、第1の姿勢を補正する補正量を示すベクトルである。具体的には、ベクトルv2に対してベクトルv3がなす角度Δθが、補正量となる。詳細は後述するが、ベクトルv3は、ベクトルGとベクトルv2との間に設定される(図9参照)。ベクトルv1をΔθだけ回転させることで、ベクトルv1が上述のベクトルv2’に近づくことになる。
第1補正処理は、第1の姿勢(ベクトルv1)を上記補正量だけ回転させることによって行われる。図10は、第1補正処理による補正後の第1の姿勢を示すベクトルを示す図である。図10に示すように、補正後の第1の姿勢(ベクトルv1’)は、補正前の第1の姿勢(ベクトルv1)を角度Δθだけ回転させることによって得られる。これによって、補正後の第1の姿勢を表す角度θ1’は、角度θ1と角度θ2との間となっており、上記角度θ1を上記角度θ2に近づける補正が行われたことがわかる。
なお、本実施形態においては、第1補正手段は、第1の姿勢を第2の姿勢へと近づける補正を行い、補正後の第1の姿勢を第2の姿勢と一致させていない。これは、加速度データが誤検出や激しい操作等の原因で急激に変化する場合であっても補正後の第1の姿勢が急激に変化しないようにするためである。ただし、他の実施形態においては、第1補正手段は、補正後の第1の姿勢を第2の姿勢と一致させるように補正を行ってもよい。また、詳細は後述するが、本実施形態においては、第1補正手段が第1の姿勢を第2の姿勢へと近づける割合は、加速度データにより示される加速度の大きさ(より具体的には、当該大きさと重力加速度の大きさとの差分)に応じて変化するように決められる。ただし、他の実施形態においては、上記割合を予め定められた固定値としてもよい。
(3)第2補正手段
第2補正手段は、撮像手段が撮像する所定の撮像対象の画像に基づいて第1の姿勢を補正する(後述するステップS6)。ここで、本実施形態においては、所定の撮像対象とは上記マーカ部6(の赤外LED)である。本実施形態では、第2補正手段は、上記第1の姿勢を第3の姿勢へと近づける補正を行う。第3の姿勢は、上記撮像対象の画像から算出される姿勢であり、具体的には、当該画像内での撮像対象の向きおよび/または位置から算出される入力装置8の姿勢である。以下、図11および図12を参照して、第2補正手段による補正処理(第2補正処理)を説明する。
図11は、第3の姿勢を用いた第1の姿勢の補正を示す図である。なお、本実施形態では、実際には3次元空間における姿勢を処理しているが、図11および図12では、図面をわかりやすくするために2次元平面における姿勢を用いて説明する。図11に示すベクトルv1は、空間座標系における第1の姿勢を示す。図11に示すベクトルv4は、空間座標系における第3の姿勢を示す。マーカ部6の位置や姿勢は予め定められているので、画像内での当該マーカの姿勢や位置によって、相対的に入力装置8の姿勢を算出することができる。第3の姿勢が正しい姿勢を表していることを前提とすれば、角速度から第1の姿勢が正しく算出されている場合には、第1の姿勢を示すベクトルv1は、第3の姿勢を示すベクトルv4と一致する。つまり、角速度から第1の姿勢が正しく算出されていない場合には、図11のように、第1の姿勢を示すベクトルv1と第3の姿勢を示すベクトルv4とが異なる。
第2補正処理は、第1の姿勢(ベクトルv1)を、第3の姿勢(ベクトルv4)に所定の割合で近づけることによって行われる。図12は、第2補正処理による補正後の第1の姿勢を示す図である。図12に示されるように、補正後の第1の姿勢(ベクトルv1’)は、補正前の第1の姿勢(ベクトルv1)を、第3の姿勢(ベクトルv4)に所定の割合で近づけることによって得られる。
ここで、入力装置8の姿勢や位置によっては撮像手段がマーカ部6を撮像することができない場合があり、この場合、第2補正手段は第2補正処理を行うことができない。したがって、仮に、第2補正手段が補正後の第1の姿勢を第3の姿勢と一致させるように補正を行うとすれば、第2補正処理を行うことができない状態から第2補正処理を行うことができる状態へと移行した際に、第1の姿勢が急激に変化してしまうおそれがある。このように第1の姿勢がプレイヤの意図に沿わずに急激に変化してしまうと、(たとえ補正後の姿勢が正確なものであったとしても)プレイヤは操作に違和感を抱いてしまう。このような急激な変化を防止するために、本実施形態では、第1の姿勢を第3の姿勢に所定の割合で近づけるように補正を行っている。これによって、第1の姿勢が急激に変化することを防止することができるので、プレイヤが操作に違和感を抱くことを防止することができる。ただし、撮像手段が常にマーカ部6を撮像することが可能な姿勢で入力装置8が使用されることが想定できる場合等、他の実施形態においては、第2補正手段は、補正後の第1の姿勢を第3の姿勢と一致させるように補正を行ってもよい。
なお、本実施形態では、ゲーム装置3は、第1補正処理と第2補正処理との両方を実行するが、他の実施形態においては、第1補正処理と第2補正処理とのいずれか一方のみを実行するようにしてもよい。また、本実施形態においては、ゲーム装置3は、第1補正処理を先に行い、第2補正処理を後に行うこととするが、第1補正処理と第2補正処理とのいずれを先に行うようにしてもよい。
以上のように、本実施形態によれば、ジャイロセンサ55および56によって検知された角速度から算出される入力装置8の姿勢を、加速度センサ37によって検知された加速度を用いて補正し、また、撮像手段による撮像画像を用いて補正する。これによって、ジャイロセンサから算出される姿勢の誤差を減少することができ、入力装置8の姿勢をより正確に算出することができる。
なお、加速度センサ37の検出結果からは、重力方向を軸とした回転(ヨー方向の回転)を検知することはできないので、第1補正手段による補正は、ヨー方向に関しては行うことができない。しかし、加速度センサ37の検出結果を用いた補正は、入力装置8の姿勢がどのような姿勢であっても(常に加速度を検出することができるので)可能であるという特長を有する。一方、入力装置8の撮像方向にマーカ部6がなければマーカ座標が検出されないので、第2補正手段による補正は、入力装置8の姿勢によっては行うことができない。しかし、撮像画像を用いた補正は、姿勢(特にロール方向の姿勢)を正確に算出することができるという特長を有する。本実施形態においては、このように特長の異なる2種類の補正を行うことによって、入力装置8の姿勢をより正確に算出することができる。
[ゲーム装置3における処理の詳細]
次に、ゲーム装置3において実行される処理の詳細について説明する。まず、ゲーム装置3における処理において用いられる主なデータについて図13を用いて説明する。図13は、ゲーム装置3のメインメモリ(外部メインメモリ12または内部メインメモリ11e)に記憶される主なデータを示す図である。図13に示すように、ゲーム装置3のメインメモリには、ゲームプログラム60、操作データ62、およびゲーム処理用データ67が記憶される。なお、メインメモリには、図13に示すデータの他、ゲームに登場する各種オブジェクトの画像データや、オブジェクトの各種パラメータを示すデータ等、ゲーム処理に必要なデータが記憶される。
ゲームプログラム60は、ゲーム装置3に電源が投入された後の適宜のタイミングで光ディスク4からその一部または全部が読み込まれてメインメモリに記憶される。ゲームプログラム60には、座標算出プログラム61が含まれる。座標算出プログラム61は、入力装置8の姿勢を算出し、算出された姿勢に基づいて(テレビ2の画面上における)2次元座標を算出する処理を実行するためのプログラムである。
操作データ62は、コントローラ5からゲーム装置3へ送信されてくる操作データである。上述したように、コントローラ5からゲーム装置3へ1/200秒に1回の割合で操作データが送信されるので、メインメモリに記憶される操作データ62はこの割合で更新される。本実施形態においては、メインメモリには、最新の(最後に取得された)操作データのみが記憶されればよい。
操作データ62には、角速度データ63、加速度データ64、マーカ座標データ65、および操作ボタンデータ66が含まれる。角速度データ63は、ジャイロセンサユニット7のジャイロセンサ55および56によって検出された角速度を示すデータである。ここでは、角速度データ63は、図3に示すXYZの3軸回りのそれぞれの角速度を示す。また、加速度データ64は、加速度センサ37によって検出された加速度(加速度ベクトル)を示すデータである。ここでは、加速度データ64は、図3に示すXYZの3軸の方向に関する加速度を各成分とする3次元の加速度ベクトルVa1を示す。また、本実施形態においては、コントローラ5が静止している状態で加速度センサ37が検出する加速度ベクトルVa1の大きさを“1”とする。つまり、加速度センサ37によって検出される重力加速度の大きさは“1”である。
マーカ座標データ65は、撮像情報演算部35の画像処理回路41によって算出される座標、すなわち上記マーカ座標を示すデータである。マーカ座標は、撮像画像に対応する平面上の位置を表すための2次元座標系(図17に示すx’y’座標系)で表現される。なお、撮像素子40によって2つのマーカ6Rおよび6Lが撮像される場合には、2つのマーカ座標が算出される。一方、撮像素子40の撮像可能な範囲内にマーカ6Rおよび6Lのいずれか一方が位置しない場合には、撮像素子40によって1つのマーカのみが撮像され、1つのマーカ座標のみが算出される。また、撮像素子40の撮像可能な範囲内にマーカ6Rおよび6Lの両方が位置しない場合には、撮像素子40によってマーカが撮像されず、マーカ座標は算出されない。したがって、マーカ座標データ65は、2つのマーカ座標を示す場合もあるし、1つのマーカ座標を示す場合もあるし、マーカ座標がないことを示す場合もある。
操作ボタンデータ66は、各操作ボタン32a〜32iに対する入力状態を示すデータである。
ゲーム処理用データ67は、後述するゲーム処理(図14)において用いられるデータである。ゲーム処理用データ67は、第1姿勢データ68、加速度大きさデータ69、補正度データ70、補正量ベクトルデータ71、補正行列データ72、ロール姿勢成分データ73、ヨー姿勢成分データ74、ピッチ姿勢成分データ75、および第3姿勢データ76を含む。なお、図13に示すデータの他、ゲーム処理用データ67は、ゲーム処理において用いられる各種データ(ゲームパラメータを示すデータ等)を含む。
第1姿勢データ68は、角速度データ63を用いて算出される上記第1の姿勢を示すデータである。本実施形態では、第1の姿勢は、以下の式(1)に示す3×3の行列M1で表現される。
上記行列M1は、所定の基準姿勢から現在の入力装置8の姿勢への回転を表す回転行列である。以下では、第1の姿勢を示す行列M1を、「第1姿勢行列M1」と呼ぶ。なお、第1姿勢行列M1により表される第1の姿勢は、入力装置8が存在する空間の所定位置を基準としたxyz座標系(上記空間座標系)における姿勢である。ここでは、xyz座標系は、入力装置8がマーカ部6の正面に位置することを前提とし、入力装置8の位置からマーカ部6を向く方向をz軸正方向とし、鉛直上向き(重力方向の逆方向)をy軸正方向とし、入力装置8の位置からマーカ部6を向いた場合の左方向をx軸正方向とした座標系であるとする。ここでは、上記所定の基準姿勢は、マーカ部6の正面に位置する入力装置8の撮像方向がマーカ部6の中央を向き、かつ、コントローラ5のボタン面が鉛直上向きとなる姿勢(すなわち、入力装置8を基準としたX軸、Y軸、Z軸が、それぞれx軸、y軸、z軸の向きと一致する姿勢)であるとする。なお、本実施形態では、行列を用いて第1の姿勢を表現することとしたが、他の実施形態においては、第1の姿勢は、3次のベクトルまたは3つの角度によって表現されてもよい。
加速度大きさデータ69は、加速度データ64により示される加速度ベクトルVa1の大きさ(長さ)Lを示すデータである。
補正度データ70は、第2の姿勢を用いて第1の姿勢を補正する度合(補正度A)を示すデータである。補正度Aは、0≦A≦C1(C1は、0<C1≦1の所定の定数)の範囲を取り得る値である。詳細は後述するが、補正後の第1の姿勢は、補正度Aの値が大きいほど第2の姿勢に近くなる。
補正量ベクトルデータ71は、第1の姿勢を補正する補正量を示すベクトル(図9に示すベクトルv3。以下、補正量ベクトルと呼ぶ。)を示すデータである。補正量ベクトルVgは、上記加速度ベクトルVa1を上記xyz座標系で表したベクトルVa2と、上記補正度Aとに基づいて算出される。
補正行列データ72は、第1の姿勢を補正するために用いる回転行列(補正行列と呼ぶ)Maを示すデータである。つまり、第1補正処理においては、第1の姿勢を表す第1姿勢行列M1に補正行列Maを掛けることで第1の姿勢が補正される。補正行列Maは、上記ベクトルVa2と上記補正量ベクトルVgとに基づいて算出される。
ロール姿勢成分データ73は、上記撮像対象の画像から算出される第3の姿勢に含まれる姿勢成分のうち、ロール方向に関する姿勢成分(ロール姿勢成分)M3rを示すデータである。また、ヨー姿勢成分データ74は、上記第3の姿勢に含まれる姿勢成分のうち、ヨー方向に関する姿勢成分(ヨー姿勢成分)M3yを示すデータであり、ピッチ姿勢成分データ75は、上記第3の姿勢に含まれる姿勢成分のうち、ピッチ方向に関する姿勢成分(ピッチ姿勢成分)M3pを示すデータである。なお、ここで言うロール方向、ヨー方向、およびピッチ方向とは、入力装置8の撮像方向(Z軸正方向)を基準とした場合の回転方向である。本実施形態においては、各姿勢成分M3r、M3y、およびM3pは、第1の姿勢と同様、3×3の行列で表現される。
第3姿勢データ76は、上記撮像対象の画像から算出される第3の姿勢を示すデータである。本実施形態では、第3の姿勢は、第1の姿勢と同様、3×3の行列M3で表現される。以下では、第3の姿勢を示す行列M3を「第3姿勢行列M3」と呼ぶ。本実施形態では、入力装置8から操作データとしてマーカ座標データが送信されてくるので、第3姿勢行列M3は、マーカ座標データ65に基づいて算出される。具体的には、第3姿勢行列M3は、上記各姿勢成分M3r、M3y、およびM3pを合成することによって得られる。
次に、ゲーム装置3において行われる処理の詳細を、図14〜図17を用いて説明する。図14は、ゲーム装置3において実行される処理の流れを示すメインフローチャートである。ゲーム装置3の電源が投入されると、ゲーム装置3のCPU10は、図示しないブートROMに記憶されている起動プログラムを実行し、これによってメインメモリ等の各ユニットが初期化される。そして、光ディスク4に記憶されたゲームプログラムがメインメモリに読み込まれ、CPU10によって当該ゲームプログラムの実行が開始される。図14に示すフローチャートは、以上の処理が完了した後に行われる処理を示すフローチャートである。
まず、ステップS1において、CPU10は、ゲームに関する初期化処理を実行する。この初期化処理においては、ゲーム処理に用いられる各種パラメータの値が初期化されたり、仮想のゲーム空間が構築されたり、プレイヤオブジェクトや他のオブジェクトがゲーム空間の初期位置に配置されたりする。以上のステップS1の次にステップS2の処理が実行される。
ステップS2において、CPU10は、初期姿勢設定処理が実行される。具体的には、プレイヤが所定の操作(例えば、Aボタン32dを押下する操作)を行ったことに応じて、入力装置8の第1の姿勢の初期姿勢として所定の値が設定される。ここでは、基準となる姿勢は、Z軸が鉛直方向と平行となり、かつ、入力装置8の撮像方向がマーカ部6の中央(マーカ6Rおよび6Lの中央)を向く姿勢としているので、プレイヤは、初期姿勢が上記基準となる姿勢となるように入力装置8を把持した状態で、上記所定の操作を行うことが望ましいが、入力装置が静止状態に近く、かつマーカ部を撮像可能であれば、初期姿勢を算出することが可能である。CPU10は、所定の操作が行われると、上記初期姿勢を表す行列を示すデータを第1姿勢データとしてメインメモリに記憶する。以上のステップS2の後、ステップS3〜S9の処理ループが、ゲームが実行される間繰り返し実行される。なお、1回の当該処理ループは、1フレーム時間(例えば1/60秒)に1回の割合で実行される。
なお、本実施形態では、初期姿勢設定処理(ステップS2)は、ゲーム開始前(ステップS3〜S9の処理ループが実行される前)に1回実行されるのみであるとしたが、他の実施形態においては、ゲーム中における任意のタイミングで初期姿勢設定処理が実行されるようにしてもよい。すなわち、CPU10は、ゲーム中においてプレイヤが上記所定の操作を行ったことに応じて初期姿勢設定処理を実行するようにしてもよい。
ステップS3において、CPU10は操作データを取得する。すなわち、コントローラ5から送信されてくる操作データが無線コントローラモジュール19を介して受信される。そして、受信された操作データに含まれる角速度データ、加速度データ、マーカ座標データ、操作ボタンデータがそれぞれメインメモリに記憶される。ステップS3の次にステップS4の処理が実行される。
ステップS4において、CPU10は、メインメモリに記憶されている角速度データ63に基づいて第1の姿勢を算出する。入力装置8の姿勢を角速度から算出する方法はどのような方法であってもよいが、本実施形態においては、第1の姿勢は、前回の第1の姿勢(前回の処理ループにおいて算出された第1の姿勢)と、今回の角速度(今回の処理ループにおいて取得された角速度)とを用いて算出される。具体的には、CPU10は、前回の第1の姿勢を今回の角速度で単位時間分回転させた姿勢を、第1の姿勢とする。なお、前回の第1の姿勢は、メインメモリに記憶されている第1姿勢データ68により示され、今回の角速度は、メインメモリに記憶されている角速度データ63により示されている。ステップS4で算出された姿勢(3×3の行列)を示すデータが、第1姿勢データ68としてメインメモリに新たに記憶される。上記ステップS4の次にステップS5の処理が実行される。
ステップS5において、CPU10は前述した第1補正処理を実行する。第1補正処理は、加速度データを用いて第1の姿勢を補正する処理である。以下、図15を参照して、第1補正処理の詳細を説明する。
図15は、図14に示す第1補正処理(ステップS5)の流れを示すフローチャートである。第1補正処理においては、まずステップS11において、CPU10は、加速度センサ37によって検出された加速度の大きさLを算出する。すなわち、メインメモリに記憶されている加速度データ64を読み出し、当該加速度データ64により示される加速度ベクトルVa1について大きさLを算出する。算出された大きさLを示すデータは加速度大きさデータ69としてメインメモリに記憶される。ステップS11の次にステップS12の処理が実行される。
ステップS12において、CPU10は、加速度センサ37によって検出された加速度の大きさが0であるか否かを判定する。すなわち、メインメモリに記憶されている加速度大きさデータ69を読み出し、当該加速度大きさデータ69により示される大きさLが0であるか否かを判定する。ステップS12の判定結果が否定である場合、ステップS13の処理が実行される。一方、ステップS12の判定結果が肯定である場合、以降のステップS13〜S21の処理がスキップされて、CPU10は第1補正処理を終了する。このように、本実施形態においては、加速度センサ37によって検出された加速度の大きさが0である場合には、当該加速度を用いた補正が行われない。これは、加速度の大きさが0である場合には加速度センサ37の検出結果から重力方向を算出できないということ、および、加速度ベクトルの大きさが0であれば以降のステップS13〜S21の処理が困難であることが理由である。
ステップS13において、CPU10は、加速度センサ37によって検出された加速度ベクトルVa1を正規化する。すなわち、メインメモリに記憶されている加速度データ64を読み出し、当該加速度データ64により示される加速度ベクトルVa1を、大きさが1となるように補正する。CPU10は、正規化された加速度ベクトルVa1を示すデータをメインメモリに記憶しておく。ステップS13の次にステップS14の処理が実行される。
ステップS14において、CPU10は、第1補正処理において第1の姿勢を補正する度合を示す上記補正度Aを算出する。補正度Aは、正規化される前の加速度ベクトルVa1の大きさLに基づいて算出される。具体的には、CPU10は、メインメモリに記憶されている加速度大きさデータ69を読み出す。そして、当該加速度大きさデータ69により示される大きさLを用いて、次の式(2)に従って補正度Aを算出する。
A=|L−1| …(2)
上式(2)で算出された補正度Aを示すデータは、補正度データ70としてメインメモリに記憶される。なお、上式(2)で算出された補正度Aは、最終的な値ではない演算中の値であって、以降のステップS16で値が変換されることによって、最終的な補正度Aの値が得られる。ステップS14の次にステップS15の処理が実行される。
ステップS15において、CPU10は、ステップS14で算出された補正度Aが所定値Rよりも小さいか否かを判定する。所定値Rは、予め定められており、例えば0.4に設定される。ここで、上述したように、本実施形態においては、加速度センサ37によって検出される重力加速度の大きさは“1”であり、また、補正度Aは加速度ベクトルVa1の大きさLと“1”との差の絶対値である(上式(2))。したがって、補正度Aが所定値R以上である場合とは、加速度ベクトルVa1の大きさLが重力加速度の大きさから所定値R以上離れている場合である。ステップS15の判定結果が肯定である場合、ステップS16の処理が実行される。一方、ステップS15の判定結果が否定である場合、以降のステップS16〜S21の処理がスキップされて、CPU10は第1補正処理を終了する。
上記のように、本実施形態では、加速度センサ37によって検出される加速度の大きさLと重力加速度の大きさ(=1)との差が所定の基準(所定値R)よりも小さい場合にのみ補正が行われ、当該大きさLと重力加速度の大きさとの差が所定の基準以上である場合には補正が行われない。ここで、入力装置8が動かされている状態では、重力加速度以外に、入力装置8が動かされることによって生じる慣性による加速度が加速度センサ37によって検出されるので、検出される加速度ベクトルVa1の大きさLが“1”とは異なる値となり、入力装置8が激しく動かされている場合には、大きさLが“1”から大きく離れた値となる。したがって、上記大きさLと重力加速度の大きさとの差が所定の基準以上である場合とは、入力装置8が激しく動かされている場合であると推測される。一方、入力装置8が激しく動かされている場合には、加速度センサ37によって検出される加速度ベクトルVa1に重力加速度以外の成分(上記慣性による加速度の成分)が多く含まれているため、加速度ベクトルVa1の値は、重力方向を示す値としては信頼できないものと推測される。したがって、上記ステップS15の判定処理は、入力装置8が激しく動かされているか否か、換言すれば、加速度ベクトルVa1の値が重力方向を示す値としては信頼できるものであるか否かを判定する処理である。本実施形態においては、上記ステップS15の判定処理によって、加速度ベクトルVa1の値が重力方向を示す値としては信頼できない場合には補正を行わず、加速度ベクトルVa1の値が重力方向を示す値としては信頼できる場合にのみ補正を行うようにしている。これによって、重力方向を示す値としては信頼できない加速度ベクトルVa1を用いて第1の姿勢に対する補正が行われた結果、第1の姿勢が正しく補正されなくなることを防止することができる。
ステップS16において、CPU10は、補正度Aの値を変換する。本実施形態では、補正度Aを、検出された加速度ベクトルVa1の大きさLが重力加速度の大きさに近いほど1に近くなるように、補正度Aを変換する。具体的には、CPU10は、メインメモリに記憶されている補正度データ70を読み出し、当該補正度データ70により示される補正度Aを、以下の式(3)〜(5)に従って変換する。
A2=1−(A1/R) …(3)
A3=A2×A2 …(4)
A4=A3×C1 …(5)
上式(3)〜(5)において、変数A1は変換前の補正度(メインメモリに現在記憶されている補正度データ70により示される値)であり、変数A4がステップS16において最終的に変換される補正度である。上式(3)は、変換前の補正度A1の大きさが重力加速度の大きさ(=1)に近いほど1に近くなるように変換後の補正度A2を得るための式である。上式(4)は、変換前の補正度A2が1に近いほど大きい重みが付されるように変換後の補正度A3を得るための式である。上式(5)は、補正量の大きさを調整するための式である。すなわち、定数C1は、定数C1の値が大きいほど補正量は大きくなる。定数C1は、予め定められ、0<C1≦1の範囲(例えば0.03)で設定される。以上の式(3)〜(5)による変換によって得られた補正度A4を示すデータが、新たな補正度データ70としてメインメモリに記憶される。上記ステップS16の次にステップS17の処理が実行される。
なお、本実施形態においては、上式(3)〜(5)による変換を行ったが、他の実施形態においては、上式(3)〜(5)のうち一部または全部の変換を省略してもよい。ただし、式の省略等によって、加速度ベクトルの値が信頼できるほど補正度の値が0に近くなるような演算となる場合には、後述するステップS18で用いる式(7)において、加速度ベクトルVa2と重力方向ベクトル(0,−1,0)とを入れ替える必要がある。
ステップS17において、CPU10は、XYZ座標系で表現される加速度ベクトルVa1をxyz座標系の値Va2へと変換する。xyz座標系における加速度ベクトルVa2は、正規化された加速度ベクトルVa1を、前回のフレームにおいて得られた第1の姿勢を表す第1姿勢行列M1を用いて変換することによって算出される。すなわち、CPU10は、ステップS13においてメインメモリに記憶された(正規化された)加速度ベクトルVa1のデータと、第1姿勢データ68とを読み出す。そして、当該加速度ベクトルVa1と当該第1姿勢データ68により示される第1姿勢行列M1とを用いて、xyz座標系における加速度ベクトルVa2を算出する。より具体的には、正規化された加速度ベクトルVa1=(nx,ny,nz)とし、第1姿勢行列M1の各要素を上式(1)に示す変数とし、xyz座標系で表現される加速度ベクトルVa2=(vx,vy,vz)とすると、加速度ベクトルVa2は次の式(6)に従って算出される。
vx=Xx×nx+Yx×ny+Zx×nz
vy=Xy×nx+Yy×ny+Zy×nz
vz=Xz×nx+Yz×ny+Zz×nz …(6)
上式(6)に示されるように、加速度ベクトルVa2は、回転行列である第1姿勢行列M1によって加速度ベクトルVa1を回転させることによって得ることができる。ステップS17において算出された加速度ベクトルVa2はメインメモリに記憶される。上記ステップS17の次にステップS18の処理が実行される。
ステップS18において、CPU10は、xyz座標系で表現される加速度ベクトルVa2と補正度Aとを用いて補正量ベクトルVgを算出する。補正量ベクトルVgは、上記ステップS16による変換後の補正度と、xyz座標系の鉛直下方向(重力方向)を示すベクトル(0,−1,0)とを用いて算出される。具体的には、CPU10は、メインメモリに記憶されている補正度データ70を読み出し、当該補正度データ70により示される補正度Aを用いて、以下の式(7)に従って補正量ベクトルVg=(gx,gy,gz)を算出する。
gx=(0−vx)×A+vx
gy=(−1−vy)×A+vy
gz=(0−vz)×A+vz …(7)
上式(7)に示されるように、補正量ベクトルVgは、加速度ベクトルVa2の終点から重力方向ベクトル(0,−1,0)の終点までを結ぶ線分をA:(1−A)に内分する点を終点とするベクトルである。したがって、補正量ベクトルVgは、補正度Aの値が大きいほど、重力方向ベクトルに近づくこととなる。CPU10は、上式(7)によって算出された補正量ベクトルVgを示すデータを、補正量ベクトルデータ71としてメインメモリに記憶する。上記ステップS18の次にステップS19の処理が実行される。
ステップS19において、CPU10は、上記ステップS18で算出された補正量ベクトルVgを正規化する。すなわち、メインメモリに記憶されている補正量ベクトルデータ71を読み出し、当該補正量ベクトルデータ71により示されるベクトルを正規化する。そして、正規化されたベクトルを示すデータを新たな補正量ベクトルデータ71としてメインメモリに記憶する。なお、上記ステップS19で算出された補正量ベクトルVgが、図9に示すベクトルv3に相当する。上記ステップS19の次にステップS20の処理が実行される。
ステップS20において、CPU10は、第1の姿勢を補正するための補正行列Maを算出する。補正行列Maは、xyz座標系で表現される加速度ベクトルVa2と、ステップS19において正規化された補正量ベクトルVgとに基づいて算出される。具体的には、CPU10は、ステップS17でメインメモリに記憶された加速度ベクトルVa2と、補正量ベクトルデータ71を読み出す。そして、上記加速度ベクトルVa2を補正量ベクトルVgと一致するように回転させる回転行列を算出し、算出された回転行列を補正行列Maとする。つまり、補正行列Maは、図9に示す角度Δθの回転を行う回転行列である。ステップS20で算出された補正行列Maを示すデータは、補正行列データ72としてメインメモリに記憶される。上記ステップS20の次にステップS21の処理が実行される。
ステップS21において、CPU10は、第1の姿勢を示す第1姿勢行列M1を補正行列Maで補正する。具体的には、CPU10は、メインメモリに記憶されている第1姿勢データ68および補正行列データ72を読み出す。そして、当該第1姿勢データ68により示される第1姿勢行列M1を、当該補正行列データ72により示される補正行列Maによって変換する(第1姿勢行列M1と補正行列Maとの積を算出する)。変換後の第1姿勢行列M1が、補正された第1の姿勢を示すこととなる。つまり、ステップS21の処理は、図10に示すベクトルv1を角度Δθだけ回転させる処理に相当する。CPU10は、変換後の第1姿勢行列M1を示すデータを、新たな第1姿勢データ68としてメインメモリに記憶する。上記ステップS21の後、CPU10は第1補正処理を終了する。
以上のように、第1補正処理においては、加速度センサ37によって検出された加速度ベクトルと、重力方向ベクトル(図8に示すベクトルG)との間に補正量ベクトルVgを算出し(ステップS18およびS19)、この補正量ベクトルVgにより表される補正量(補正行列Ma。図9に示す角度Δθ)だけ第1の姿勢を補正した(ステップS21)。これによって、ジャイロセンサ55および56から算出される第1の姿勢(図8に示すベクトルv1または角度θ1)を、加速度センサ37によって決められる第2の姿勢(図8に示す角度θ2)に近づける補正を行うことができる。かかる補正を行うことにより、より正確な値となるように第1の姿勢を補正することができる。
また、第1補正処理においては、加速度ベクトルVa1が信頼できる場合ほど(加速度ベクトルVa1の大きさLと重力加速度の大きさとの差が小さいほど)、補正度Aの値が大きくなり、その結果、第1の姿勢は第2の姿勢により近づくように補正される。つまり、加速度ベクトルVa1が信頼できる場合ほど、補正量が大きくなり、補正後の第1の姿勢に第2の姿勢が強く反映されることとなる。このように、本実施形態によれば、加速度センサベクトルVa1の信頼度に応じて第1補正処理における補正量が決まるので、補正量を当該信頼度に応じて適切に決定することができ、ひいては入力装置8の姿勢をより正確に算出することができる。
なお、本実施形態においては、上記ステップS18で算出される補正量ベクトルVgは、加速度ベクトルVa2の終点から重力方向ベクトルの終点までを結ぶ線分をA:(1−A)に内分する点を終点とするベクトルであって、補正度Aの値が大きいほど重力方向ベクトルに近づくベクトルであった。ここで、他の実施形態において、補正度Aの算出方法によっては、補正量ベクトルVgは、重力方向ベクトルの終点と加速度ベクトルVa2の終点とを(1−A):Aに内分する点を終点とするベクトルであって、補正度Aの値が小さいほど重力方向ベクトルに近づくベクトルとしてもよい。このとき、上記ステップS20においては、上記補正量ベクトルVgを重力方向と一致するように回転させる回転行列を算出し、算出された回転行列を補正行列Maとすればよい。これによっても、本実施形態と同様に補正を行うことができる。
図14の説明に戻り、ステップS5の次のステップS6において、CPU10は、前述した第2補正処理を実行する。第2補正処理は、マーカ座標データを用いて第1の姿勢を補正する処理である。以下、図16を参照して、第2補正処理の詳細を説明する。
図16は、図14に示す第2補正処理(ステップS6)の流れを示すフローチャートである。第1補正処理においては、まずステップS31において、CPU10は、入力装置8の撮像手段(撮像素子40)によってマーカ部6が撮像されているか否かを判定する。ステップS31の判定は、メインメモリに記憶されているマーカ座標データ65を参照することによって行うことができる。ここでは、マーカ座標データ65が2つのマーカ座標を示す場合、マーカ部6が撮像されていると判定し、マーカ座標データ65が1つのマーカ座標のみを示す場合、または、マーカ座標がないことを示す場合、マーカ部6が撮像されていないと判定する。ステップS31の判定結果が肯定である場合、以降のステップS32〜S37の処理が実行される。一方、ステップS31の判定結果が否定である場合、以降のステップS32〜S37の処理がスキップされ、CPU10は、第2補正処理を終了する。このように、撮像素子40によってマーカ部6が撮像されていない場合には、撮像素子40から得られるデータを用いて入力装置8の姿勢を算出することができないので、この場合には第2補正処理において補正は行われない。
ステップS32において、CPU10は、マーカ座標データに基づいてロール姿勢成分M3rを算出する。ロール姿勢成分M3rは、撮像画像内でのマーカ部6の向きに基づいて、すなわち、マーカ座標データ65により示される2つのマーカ座標を結ぶ線の傾きに基づいて算出される。以下、図17を参照して、ロール姿勢成分M3rの算出方法の例を説明する。
図17は、撮像画像に対応する2次元座標を示す図である。図17に示されるように、本実施形態においては、撮像画像における位置を表すための2次元座標系(x’y’座標系)は、撮像画像の範囲を−1≦x’≦1、−1≦y’≦1で表すものとする。x’y’座標系は、入力装置8が基準姿勢(入力装置8の撮像方向がマーカ部6の中央を向き、かつ、コントローラ5のボタン面が鉛直上向きとなる姿勢)にある場合に、撮像画像において鉛直下向きがy’軸正方向となり、右向きがx’軸正方向となるように設定されるものとする。また、図17に示す点P1および点P2はマーカ座標の位置を示し、点P3は点P1と点P2との中点である。図17に示すベクトルv10は、点P1を始点とし、点P2を終点とするベクトルである。
ロール姿勢成分M3rを算出するために、CPU10はまず、マーカ座標データ65を読み出し、当該マーカ座標データ65により示される2つのマーカ座標から上記ベクトルv10を算出する。さらに、ベクトルv10を正規化したベクトル(hx,hy)を算出する。このベクトル(hx,hy)は、入力装置8が上記基準姿勢にある場合にx軸正方向を向き、入力装置8のロール方向の回転に応じて向きが変化する。ベクトル(hx,hy)がロール方向の姿勢に対応しているので、ロール姿勢成分M3rは、このベクトル(hx,hy)に基づいて算出することができる。具体的には、CPU10は、次の式(8)に従ってロール姿勢成分M3rを算出する。
上式(8)によって算出された行列を示すデータは、ロール姿勢成分データ73としてメインメモリに記憶される。ステップS32の次にステップS33の処理が実行される。
ステップS33において、CPU10は、マーカ座標データに基づいてヨー姿勢成分M3yを算出する。ヨー姿勢成分M3yは、撮像画像内でのマーカ部6の向きおよび位置に基づいて算出される。以下、図17を参照して、ヨー姿勢成分M3yの算出方法の例を説明する。
まず、CPU10は、マーカ座標データ65を読み出し、当該マーカ座標データ65により示される2つのマーカ座標の中点を算出する。本実施形態では、マーカ部6の位置として当該中点の位置を用いる。さらに、CPU10は、算出された中点の座標を、x’y’座標系の原点を中心として、入力装置8のロール方向に関する回転角度だけ(入力装置8の回転方向とは逆方向に)回転させた座標(px,py)を算出する。換言すれば、中点の座標は、原点を中心として、上記ベクトル(hx,hy)がx軸正方向を向くように回転される。入力装置8が水平方向(x軸方向)に関してマーカ部6と同じ位置(すなわち、マーカ部6の正面の位置)にあるとすれば、上記のようにして得られた回転後の座標(px,py)から、ヨー方向に関する姿勢を算出することができる。
次に、CPU10は、上記中点の回転後の座標(px,py)と、マーカ部6がx’軸方向の端に位置する場合のヨー方向の角度(限界角度)θy’とに基づいて、ヨー方向に関する回転角度θyを算出する。ここで、上記限界角度θy’と、上記限界角度θy1となる場合における上記中点の回転後のx座標値px’とは予め求めておくことができる。したがって、pxとpx’との比が、θyとθy’との比に等しくなることを用いて、ヨー方向に関する回転角度θyを算出することができる。具体的には、ヨー方向に関する回転角度θyは、次の式(9)によって算出することができる。
θy=px×θy’/px’ …(9)
なお、マーカ部6の水平方向の長さを無視する場合、上記限界角度θy’は、コントローラ5の画角の1/2とし、上記px’の値は“1”とすることができる。
最後に、CPU10は、上式(9)により算出された角度θyの回転を行う回転行列をヨー姿勢成分M3yとして算出する。具体的には、ヨー姿勢成分M3yは次の式(10)によって算出される。
上式(10)によって算出された行列を示すデータが、ヨー姿勢成分データ74としてメインメモリに記憶される。以上のステップS33の次にステップS34の処理が実行される。
ステップS34において、CPU10は、ロール姿勢成分M3rとヨー姿勢成分M3yとを合成する。すなわち、メインメモリからロール姿勢成分データ73およびヨー姿勢成分データ74を読み出し、各データ73および74により示されるロール姿勢成分M3rとヨー姿勢成分M3yとを積算する。ステップS34の次にステップS35の処理が実行される。
ステップS35において、CPU10は、第1の姿勢に基づいてピッチ姿勢成分M3pを算出する。なお、本実施形態の処理とは異なるが、ピッチ姿勢成分M3pについても、ヨー姿勢成分M3yと同様の方法で、上記座標(px,py)のy座標値に基づいて算出することが可能である。ただし、上記座標(px,py)を用いてヨー方向(ピッチ方向)の姿勢を算出する方法は、入力装置8が水平方向(ピッチ方向の場合は鉛直方向)に関してマーカ部6と同じ位置にあることを前提として成り立つ方法である。本実施形態のゲームシステム1においては、プレイヤは、水平方向に関してマーカ部6(テレビ2)のほぼ正面の位置で入力装置8を操作すると考えられるので、「入力装置8が水平方向に関してマーカ部6と同じ位置にある」ことを前提して、上記ステップS33の方法によってヨー方向の姿勢を算出することが可能である。一方、プレイヤは、立って入力装置8を操作することも座って入力装置8を操作することも考えられ、また、マーカ部6の位置もテレビ2の画面の上側に配置されることも下側に配置されることも考えられる。そのため、本実施形態のゲームシステム1においては、「入力装置8が鉛直方向に関してマーカ部6と同じ位置にある」ことを必ずしも前提にできないため、上記座標(px,py)を用いてピッチ方向の姿勢を算出することを行わないようにしてもよい。
そこで、本実施形態においては、ピッチ姿勢成分M3pについては、第1の姿勢をそのまま用いることとする(したがって、第2補正処理においては、ピッチ方向に関しては補正が行われない)。具体的には、CPU10は、メインメモリから第1姿勢データ68を読み出す。そして、第1姿勢データ68により示される第1姿勢行列M1の各要素を用いて、ピッチ方向に関する回転角度θpを、次の式(11)に従って算出する。
cos(θp)=(Zx×Zx+Zz×Zz)
1/2
sin(θp)=Zy …(11)
上式(11)における変数Zx,Zy,Zzは、上式(1)において示した第1姿勢行列M1の要素である。なお、ここで用いられる第1姿勢行列M1は、今回の処理ループにおいて第1補正処理が行われた後の第1姿勢行列M1である。さらに、CPU10は、上式(11)で算出したcos(θp)およびsin(θp)を用いて、次の式(12)に従ってピッチ姿勢成分M3pの行列を算出する。
上式(12)によって算出された行列を示すデータが、ピッチ姿勢成分データ75としてメインメモリに記憶される。以上のステップS35の次にステップS36の処理が実行される。
ステップS36において、CPU10は、ロール方向、ヨー方向、およびピッチ方向の各姿勢成分に基づいて第3の姿勢を算出する。第3の姿勢は、ロール姿勢成分M3rとヨー姿勢成分M3yとの合成結果に、ピッチ姿勢成分M3pをさらに合成することによって得られる。具体的には、CPU10は、メインメモリからピッチ姿勢成分データ75を読み出し、当該ピッチ姿勢成分データ75により示されるピッチ姿勢成分M3pを、ステップS34で算出された行列に積算する。算出された行列を示すデータは、第3姿勢データ76としてメインメモリに記憶される。ステップS36の次にステップS37の処理が実行される。
ステップS37において、CPU10は、第3の姿勢を用いて第1の姿勢を補正する。ステップS37における補正は、第1姿勢行列M1を第3姿勢行列M3に所定の割合(下記の定数C2)で近づけることによって行われる。CPU10は、メインメモリから第1姿勢データ68および第3姿勢データ76を読み出す。そして、第1姿勢データ68により示される第1姿勢行列M1と、第3姿勢データ76により示される第3姿勢行列M3とを用いて、次の式(13)に従って補正を行う。
M1=(M3−M1’)×C2+M1’ …(13)
上式(13)において、変数M1’は補正前の第1姿勢行列である。また、定数C2は、0<C2≦1の範囲で予め設定され、例えば0.1に設定される。上式(13)によって算出された補正後の第1姿勢行列M1を示すデータが、新たな第1姿勢データ68としてメインメモリに記憶される。上記ステップS37の後、CPU10は第2補正処理を終了する。
以上のように、第2補正処理においては、撮像画像(マーカ座標)から第3の姿勢を算出し、第1の姿勢を第3の姿勢に近づけるように補正することとした。この補正によって、より正確な値となるように第1の姿勢を補正することができる。なお、本実施形態においては、ロール方向およびヨー方向の姿勢についてのみ撮像画像から第3の姿勢を算出したが、上述のように、ピッチ方向についても撮像画像から第3の姿勢を算出することは可能であり、他の実施形態においては、ロール方向、ヨー方向、およびピッチ方向について撮像画像から第3の姿勢を算出してもよい。また、第2補正処理においては、ロール方向、ヨー方向、およびピッチ方向のうち少なくとも1方向について第3の姿勢を算出すればよい。
図14の説明に戻り、ステップS6の次のステップS7において、CPU10は、補正後の第1の姿勢に基づいて2次元座標を算出する。詳細は後述するが、本実施形態において上記2次元座標が、後述するゲーム処理(ステップS8)においてプレイヤによる入力として用いられる。以下、図18および図19を参照して、ステップS7の詳細を説明する。
図18は、所定の仮想空間に入力装置と所定の平面とを仮想的に配置した図である。本実施形態では、図18に示すように、CPU10は、3次元の仮想空間を定義し、入力装置8と所定の平面Qとが仮想的に配置されていると考えて座標の算出を行う。平面Qは、テレビ2の画面に対応するものである。CPU10は、仮想空間において入力装置8のZ軸(図18に示すZ軸ベクトルVZ)の方向が指し示す平面Q上の位置の座標を算出する。すなわち、仮想空間において入力装置8の姿勢を表すZ軸ベクトルVZを延ばした線分と、当該仮想空間における所定平面Qとの交点Rの座標を算出する。なお、「Z軸ベクトルVZを延ばした線分」とは、Z軸ベクトルVZに平行でかつZ軸ベクトルVZを通る線分を意味する。なお、詳細は後述するが、本実施形態では、算出された座標に対応する画面上の位置にカーソル等が表示される。これによって、入力装置8の姿勢に応じて画面上のカーソルの位置が制御され、プレイヤは入力装置8の姿勢を変化させる操作によってカーソルを動かすことが可能となる。
なお、図18に示すように、本実施形態では、上記仮想空間の位置を上述した空間座標系(xyz座標系)によって表現するものとする。これによって、入力装置8の姿勢を示すデータとして上記第1姿勢データ68をそのまま用いることができるので、仮想空間における計算を容易に行うことができる。また、平面Q上の位置をX’Y’座標系で表現するものとする。このとき、空間座標系のxy平面に平行となるように平面Qを設定し、空間座標系のx軸と平面QのX’軸が平行となり、空間座標系のy軸と平面QのY’軸が平行となるようにX’Y’座標系を設定する(図18)。
また、本実施形態では、プレイヤは入力装置8をテレビ2の画面のほぼ正面の位置で使用する状況を想定し、上記仮想空間において入力装置8の位置は変化しないものとする。すなわち、CPU10は、上記仮想空間において入力装置8の姿勢のみが変化し、入力装置8の位置を変化させずに処理を行う。これによって、入力装置8の姿勢から平面Q上の位置(交点Rの位置)を一義的に決定することができる。
次に、平面Q上の位置(交点Rの位置)を算出する方法について詳細に説明する。図19は、図18に示す仮想空間をy軸正方向側から負方向側へ見た図である。図19においては、入力装置8の位置を表す点Sから、当該点Sを平面Qに投影させた点(投影点)Tまでの長さを“L”とする。また、投影点Tから上記交点Rまでの、X’成分に関する長さを“Wx”とする。本実施形態では、上記長さLの値は、所定のタイミング(例えば、ゲーム処理が開始されるタイミング等)でプレイヤによって設定される。メインメモリには、プレイヤによって設定された長さLの値を示すデータ(長さデータと呼ぶ)が記憶される。
上記Z軸ベクトルVZは、入力装置8の姿勢(第1の姿勢)を表す第1姿勢行列M1により決められている。すなわち、上記Z軸ベクトルVZは、第1姿勢行列M1の第3行の各要素を順にx成分、y成分、およびz成分とするベクトル(=(Zx,Zy,Zz)である。また、図19から明らかなように、上記長さWxと上記長さLとの比は、Z軸ベクトルVZのx成分(Zx)とZ軸ベクトルVZのz成分(Zz)との比に等しくなるという関係がある。したがって、この関係に基づいて、既知のベクトルVZのx成分Zx、z成分Zz、および既知の長さLから、長さWxを算出することができる。具体的には、次の式(14)によって長さWxを算出することができる。
Wx=L×Zx/Zz …(14)
また、X’成分の長さWxと同様に、投影点Tから交点RまでのY’成分の長さWyは、次の式(15)によって算出することができる。
Wy=L×Zy/Zz …(15)
上記長さWxおよびWyが得られれば、平面Q上における交点Rの位置を示す2次元座標を算出することができる。本実施形態では、上記投影点Tの位置をX’Y’座標系の原点とする。このとき、交点Rの2次元座標は(Wx,Wy)となる。
ステップS7における具体的な処理を説明すると、CPU10は、まずメインメモリから第1姿勢データ68および長さデータを読み出す。そして、第1姿勢データ68により示される第1姿勢行列M1に含まれるZx、Zy、およびZzと、長さデータにより示される長さLとを上式(14)および(15)に代入することによって上記長さWxおよびWyを算出する。これによって、平面Q上における交点Rの2次元座標(Wx,Wy)が得られたこととなる。CPU10は、2次元座標を示すデータをメインメモリ32に記憶する。ステップS7の次にステップS8の処理が実行される。
以上のように、上記ステップS7によれば、入力装置8と所定の平面Qとを配置する仮想空間を設定し、仮想空間において入力装置8の所定軸(Z軸)の方向が指し示す平面Q上の位置の座標を算出することによって、入力装置8の姿勢から2次元座標を得ることができる。
なお、上記実施形態においては、長さLをプレイヤが設定することができるようにした。ここで、上式(14)および(15)から明らかなように、長さLの大きさを調整することによって、算出される2次元座標(Wx,Wy)の値を変化させることができる。つまり、長さLの大きさを調整することによって、Z軸ベクトルVZの向きの変化(すなわち、入力装置8の姿勢の変化)に対する2次元座標(Wx,Wy)の変化量を調整することができる。具体的には、長さLの値が大きくなると上記変化量は大きくなる。その結果、入力装置8の姿勢を少し変化させるだけで、カーソルが大きく移動することになる。一方、長さLの値が小さくなると上記変化量は小さくなる。その結果、入力装置8の姿勢を大きく変化させても、カーソルは少ししか移動しないことになる。以上より、上記実施形態においては、長さLをプレイヤに設定させることによって、入力装置8の操作感をプレイヤ自身が調整することができるようになる。例えば、プレイヤは、カーソルを細かく操作することを必要とする場合には長さLを相対的に小さく設定すればよく、カーソルを大きく移動させる操作を必要とする場合には長さLを相対的に大きく設定すればよい。なお、他の実施形態においては、上記Lの長さは、予め定められた定数であってもよい。
また、他の実施形態においては、上記Lの長さは、ゲーム装置10が所定の方法で算出するようにしてもよい。例えば、CPU10は、入力装置8からテレビ2の画面までの実際の距離を算出し、算出された距離を長さLとして設定してもよい。上記実際の距離は、例えば、撮像素子40によって撮像された撮像画像内における2つのマーカ6Rおよび6Lの間の長さ、または、マーカ6Rまたは6Lの大きさを用いて算出することができる。さらに、仮想空間における平面Qの位置および大きさと実空間におけるテレビ2の画面の位置および大きさとを対応させるように平面Qを設定すれば(例えば、プレイヤにテレビの画面の大きさを設定させるようにしてもよい)、2次元座標(Wx,Wy)に対応するテレビ2の画面上の位置にカーソルが表示されることとなる。これによれば、入力装置8が指し示す(画面上の)位置にカーソルを表示させることができる。
なお、入力装置8を用いて2次元座標を得る方法として、上述したマーカ座標(図13に示すマーカ座標データ65)を用いて2次元座標を得ることができる。すなわち、入力装置8が指し示す位置に応じてマーカ座標が変化するので、入力装置8が指し示す画面上の位置をマーカ座標に基づいて算出することが可能である。したがって、マーカ部6が存在している状況であればマーカ座標を用いて上記2次元座標を算出可能である。しかしながら、マーカ部6が使用できない場合や、撮像素子が備えられていない入力装置では、マーカ部6の撮影によって2次元座標を得ることができない。本実施形態における方法は、入力装置8の撮像素子40がマーカ部6を撮影していない場合でも2次元座標を得ることができるので、マーカ部や撮像素子が無い入力装置においても使うことができるものである。
また、本実施形態においては、上記第1および第2補正処理による補正が行われた第1の姿勢に基づいて2次元座標を算出した。ここで、他の実施形態においては、2次元座標は、任意の方法で算出された入力装置8の姿勢に基づいて算出されればよく、上記第1および第2補正処理は行われなくてもよい。
また、上記実施形態では、プレイヤが入力装置8のZ軸方向をテレビ2の画面に向けて使用する態様を想定し、入力装置8のZ軸方向がテレビ2の画面(マーカ部6)を向く場合における当該Z軸方向に平面Qを配置した。ただし、上述のように、撮像素子40がマーカ部6を撮影していなくても2次元座標を得ることが可能であるので、プレイヤは、入力装置8のZ軸方向を任意の方向に向けて使用することが可能である。例えば、CPU10は、プレイヤが所定の操作(例えば操作ボタンを押す操作)を行ったことに応じて、当該所定の操作の時点における入力装置8のZ軸方向に上記平面Qを設定してもよい。これによれば、仮想空間内において入力装置8の向きに応じた適切な位置に平面Qを配置することができるので、当該所定の操作の時点において入力装置8がどのような向きであっても2次元座標を算出することができる。すなわち、プレイヤは、入力装置8を任意の方向に向けて使用することができる。
なお、本実施形態では、ゲーム装置3は、入力装置8のZ軸方向が水平方向を向く場合に原点(0,0)を取るように2次元座標を算出する方法(第1の方法と呼ぶ)を採用した。ここで、ゲーム装置3は、上記第1の方法に代えて、後述する第2の方法によって2次元座標を算出してもよい。
図14の説明に戻り、ステップS7の次のステップS8において、CPU10は、ステップS7で算出された2次元座標を用いたゲーム処理を実行する。本実施形態では、ゲーム処理として、2次元座標に対応するテレビ2の画面上の位置にカーソルを表示させる処理が実行される。これによって、入力装置8の姿勢に対応した位置にカーソルを表示させることができ、プレイヤは、入力装置8の姿勢を変化させることによってカーソルを動かす操作が可能となる。なお、ステップS8におけるゲーム処理は、上記2次元座標を入力値としてゲーム結果に反映させる処理であればどのような処理であってもよい。例えば、仮想のゲーム空間内のオブジェクトを2次元座標に対応するゲーム空間内の位置に移動させる処理であってもよいし、上記2次元座標により表される2次元ベクトルの大きさおよび方向に応じた速度で上記オブジェクトを移動させるように制御して表示する処理であってもよい。ステップS8の次にステップS9の処理が実行される。
ステップS9において、CPU10は、ゲームを終了するか否かを判定する。ステップS9の判定は、例えば、ゲームがクリアされたか否か、ゲームオーバーとなったか否か、プレイヤがゲームを中止する指示を行ったか否か等によって行われる。ステップS9の判定結果が否定である場合、ステップS3の処理が再度実行される。以降、ステップS9でゲームを終了すると判定されるまで、ステップS3〜S9の処理ループが繰り返し実行される。一方、ステップS9の判定結果が肯定である場合、CPU10は、図14に示すゲーム処理を終了する。以上で、ゲーム処理の説明を終了する。
以上のように、本実施形態においては、ジャイロセンサ55および56によって検出された角速度から入力装置8の第1の姿勢を算出し(ステップS4)、第1の姿勢を第1補正処理(S5)および第2補正処理(S6)によって補正した。そして、補正後の第1の姿勢を用いてゲーム処理を実行する(ステップS7,S8)ので、CPU10は、入力装置8の正確な姿勢に基づいたゲーム処理を実行することができる。これによれば、例えば、入力装置8の姿勢を画面上のカーソルの位置に対して正確に反映させることができるので、ゲーム操作の操作性を向上することができる。
[座標を算出する第2の方法]
以下、図20〜図25を参照して、入力装置8の姿勢から画面上における位置を算出する第2の方法について説明する。なお、上記実施形態においては、上述した第1の方法に代えて以下に示す第2の方法を用いてゲーム処理を実行してもよい。また、以下の説明では、上記仮想空間における平面Q上の座標を「第1の座標」と呼び、第1の座標から算出される画面上の位置を表す座標を「画面座標」と呼び、マーカ座標から算出される画面上の位置を表す座標(詳細は後述する)を「第2の座標」と呼ぶ。
図20は、第1の方法と第2の方法との比較を示す図である。図20においては、実空間において、テレビ2の画面の中心よりも下方に入力装置8が位置し、入力装置8のZ軸方向が指す画面上の位置(以下、「(入力装置の)指示位置」と呼ぶ。)が画面の中心となる場合を例として考える(図20の上行左欄参照)。
上述した第1の方法では、第1の座標の座標系(仮想空間における平面Q上のX’Y’座標系)は、入力装置8の位置を平面Qに投影させた投影点Tを常に原点Oとするものであった。つまり、第1の座標は、入力装置8のZ軸方向が水平方向を向く場合(Z軸方向が投影点Tを指す場合)に原点(0,0)の値を取るように算出された。したがって、図20に示すように入力装置8のZ軸方向がやや上方を向く場合には、第1の座標の位置Rは原点Oよりも上方になる(図20の上行中央欄参照)。その結果、第1の座標から算出される画面座標の位置Uは、画面の中心よりも上方となる(図20の上行右欄参照)。
図20に示す場合、第1の方法では、実際には(実空間では)入力装置8のZ軸方向は画面の中心を指しているのに対して、算出される画面上の位置は中心よりも上方の位置となってしまう。このように、第1の方法では、ユーザが入力装置8を用いて指し示した位置(入力装置の指示位置)と、算出される画面座標の位置との間にずれが生じてしまい、ユーザが違和感を抱くおそれがあった。
なお、実際には、テレビ2が設置される状況(床に置かれるのか、台の上に置かれるのか等)や、入力装置8を使用するユーザの状態(入力装置8を立って使用するのか、座って使用するのか等)等によって、画面に対する入力装置8の高さは様々であると考えられる。この高さが変化すれば、入力装置8の指示位置と姿勢との関係は変化し、入力装置8の指示位置が画面の中心となる場合における入力装置8の姿勢も変化する。しかし、第1の方法では、入力装置8の指示位置が考慮されずにX’Y’座標系の原点の位置を固定するために、画面上の位置を適切に算出することができず、入力装置8を用いた操作にユーザが違和感を抱くおそれがあった。
そこで、第2の方法では、ゲーム装置3は、第1の方法で算出された第1の座標を、入力装置8のZ軸方向が画面の中心を指す姿勢である場合(指示位置が画面の中心となる場合)に所定値(具体的には、(0,0))となるように補正する。具体的には、ゲーム装置3は、まず、入力装置8のZ軸方向が画面の中心を指す姿勢となったか否かを判定する。この判定は、上述したマーカ座標を参照することで行うことができる。すなわち、ゲーム装置3は、画面上における上記指示位置を示す座標(第2の座標)をマーカ座標に基づいて算出し、第2の座標が画面の中心(中心付近)を表すか否かを判定する。
上記の判定の結果、第2の座標が画面の中心となった場合、ゲーム装置3は、第1の座標を補正するための補正量(オフセット量)を決定する。オフセット量は、第2の座標が画面の中心となった時点において(第1の方法で)算出された第1の座標に対応する画面座標の位置と、第2の座標の位置とが一致するように決定される。具体的には、オフセット量は、当該時点における第1の座標が原点の値(0,0)となるような補正量に決定される。なお、上記オフセット量を決定することは、平面Q上のX’Y’座標系を移動することを意味する。図20の例においては、入力装置8が水平方向よりも上方を向いているので、X’Y’座標系は、平面Q上において、投影点Tが原点となる位置(図20に示す点線の位置)から上方へ移動するように移動される(図20の下行中央欄参照)。以上のように第1の座標を原点の値とする結果、第1の座標に対応する画面上の位置Uは、画面の中心位置となる(図20の上行右欄参照)。したがって、入力装置8の指示位置(第2の座標の位置)と、算出される画面上の位置とが画面の中心で一致することになる。このように、第2の方法によれば、ユーザが入力装置8を用いて指した位置と、算出される位置との間のずれが生じることを防止することができ、ユーザが違和感を抱くことを防止することができる。
また、本実施形態においては、ゲーム装置3は、X’Y’座標系のY’成分についてのみ第1の座標の補正を行う。つまり、第1の座標(および画面座標)は、画面の上下方向にのみ補正され、左右方向については補正されない。本実施形態では、画面に対する入力装置8の高さ(上下方向の位置)に関しては、入力装置8の姿勢のみからでは判別することができないのに対して、画面に対する入力装置8の左右方向の位置に関しては、入力装置8の姿勢のみからでも判別することができ、左右方向に関しては図20で説明したような「ずれ」は生じないからである。ただし、他の実施形態においては、左右方向に関しても上下方向と同じように第1の座標を補正するようにしてもよい。
次に、図21〜図25を参照して、第2の方法を採用する場合においてゲーム装置3が実行する処理の詳細について説明する。図21は、第2の方法を採用する場合においてゲーム装置3のメインメモリに記憶される主なデータを示す図である。なお、図21において、図13に示すデータと同じデータについては、図13と同じ参照符号を付し、詳細な説明を省略する。
図21に示すように、第2の方法においては、図13に示すデータに加えて、第1座標データ77、第2座標データ78、オフセット量データ79、および画面座標データ80がメインメモリに記憶される。
第1座標データ77は、入力装置8の姿勢に基づいて算出される上記第1の座標を示す。すなわち、第1座標データ77は、上記仮想空間における平面Q上の位置の座標を示す。
第2座標データ78は、マーカ座標に基づいて算出される、画面上の位置を表す座標(第2の座標)を示す。第2の座標は、入力装置8のZ軸方向が指し示す画面上の位置を表すものである。第2の座標は、理想的には、入力装置8のZ軸を延ばした直線と画面との交点の位置を表すものであるが、当該交点の位置付近を表すものであればよい。
オフセット量データ79は、第1の座標を補正するためのオフセット量を示す。本実施形態では、第1の方法で算出された第1の座標をオフセット量だけ移動した座標が、補正後の第1の座標となる。
画面座標データ80は、第1の座標に基づいて算出される、画面上の位置を表す座標(画面座標)を示す。第2の方法では、画面座標は、オフセット量に従って補正された後の第1の座標に基づいて算出される。
図22は、第2の方法を採る場合においてゲーム装置3が実行する処理の流れを示すメインフローチャートである。なお、図22において、図14に示す処理ステップと同じ処理ステップについては、図13と同じステップ番号を付し、詳細な説明を省略する。
第2の方法を採用する場合には、ステップS2の初期姿勢設定処理の次に、ステップS41の処理が実行される。ステップS41において、CPU10は、オフセット決定処理を実行する。オフセット決定処理は、第1の座標を補正するためのオフセット量を決定する処理である。以下、図23を参照して、オフセット決定処理の詳細を説明する。
図23は、図22に示すオフセット決定処理(ステップS41)の流れを示すフローチャートである。オフセット決定処理においては、まずステップS51において、CPU10は操作データを取得する。ステップS51の処理は、上述したステップS3の処理と同じである。ステップS51の次にステップS52の処理が実行される。
ステップS52において、CPU10は、入力装置8の指示位置を表す第2の座標を算出する。第2の座標は、ステップS51で取得されたマーカ座標に基づいて算出される。すなわち、CPU10は、メインメモリからマーカ座標データ65を読み出し、マーカ座標に基づいて第2の座標を算出する。マーカ座標から第2の座標を算出する方法は、どのような方法であってもよい。例えば、上述したステップS33で算出する座標(px,py)をマーカ座標から算出し、当該座標(px,py)に基づいて第2の座標を算出することが可能である。具体的には、座標(px,py)のx成分の正負を反転させて所定の割合(例えば、撮像画像のx軸方向の長さを、テレビ2の画面の横方向の長さに一致させる割合)でスケーリングすることによって、画面の横方向に関する指示位置を得ることができる。また、座標(px,py)のy成分の正負を反転させて所定の割合(例えば、撮像画像のy軸方向の長さを、テレビ2の画面の縦方向の長さに一致させる割合)でスケーリングすることによって、画面の縦方向に関する指示位置を得ることができる。なお、縦方向に関しては、マーカ部6がテレビ2の上方に設置されるか下方に設置されるかに応じて、オフセット量を適宜設定することが好ましい。なお、CPU10は、算出した第2の座標を示すデータを第2座標データ78としてメインメモリに記憶させる。以上のステップS52の次にステップS53の処理が実行される。
ステップS53において、CPU10は、入力装置8の第1の姿勢を算出する。ステップS53の処理は、上述したステップS4〜S6の処理と同様である。なお、本実施形態では、第1の姿勢を算出する処理を毎フレーム(ステップS51〜S58の処理ループ毎に)実行することとするが、当該処理は、ステップS54の判定結果が肯定となる時点でのみ実行されてもよい。ステップS53の次にステップS54の処理が実行される。
ステップS54において、CPU10は、所定の設定画面とカーソルとをテレビ2の画面に表示させる。設定画面は、ユーザが所定の指示を行うためのボタン画像を含む画面である。図24は、設定画面の一例を示す図である。図24においては所定の指示は、カーソルの速度調整(感度調整)を行う指示であり、カーソルの速度を上げる指示を表すボタン画像81と、カーソルの速度を下げる指示を表すボタン画像82とが表示される。なお、ここで調整対象となるカーソルは、現在表示されているカーソル83ではなく、後のゲーム操作で用いる、第1の座標(画面座標)に基づいて位置が決定されるカーソルである。また、上記所定の指示の内容はどのようなものであってもよく、カーソルに関する他の調整(例えば、入力装置8の操作に対するカーソルの追従性の調整や、カーソルに設定される遊びの調整や、手ぶれ防止機能の調整等)を行うための指示であってもよいし、設定画面での設定操作を終了する指示であってもよいし、ゲームを開始する指示であってもよい。
また、テレビ2の画面には、上記設定画面とともにカーソル83が表示される。すなわち、CPU10は、メインメモリから第2座標データ78を読み出し、第2の座標データ78が示す位置にカーソル83を表示させる。このように、ステップS54で表示されるカーソル83の位置は、マーカ座標に基づいて算出されるものであり、カーソル83はマーカ座標に基づく方法で制御されるものである。なお、図23では示していないが、CPU10は、上記ボタン画像81または82が指定された(カーソル83がボタン画像を指し示す状態で入力装置8の所定のボタンが押下された)場合に、指定されたボタン画像に応じた調整処理を行う。上記ステップS54の次に、ステップS55の処理が実行される。
図23の説明に戻り、ステップS55において、CPU10は、カーソル83が画面の上下方向に関して中央に位置しているか否かを判定する。この判定は、第2の座標を用いて行うことができる。具体的には、CPU10は、メインメモリから第2座標データ78を読み出し、第2座標データ78が示す位置が上記ボタン画像81または82の表示領域内であるか否かを判定する。つまり、CPU10は、上記ボタン画像81または82の表示領域内にカーソル83が位置しているか否かを判定する。ステップS55の判定結果が肯定である場合、ステップS56の処理が実行される。一方、ステップS55の判定結果が否定である場合、ステップS56およびS57の処理がスキップされて、後述するステップS58の処理が実行される。
なお、上記ステップS55では、第2の座標(カーソル83)が厳密に画面の中心に位置しているか否かを判定するのではなく、中心付近に(ボタン画像の表示領域内に)第2の座標が位置しているか否かを判定している。これは、本発明では、ユーザに違和感を与えないようにすることが目的であり、入力装置の指示位置と画面座標の位置とを厳密に一致させる必要はないからである。また、ステップS55において第2の座標が画面の中心に位置するか否かを厳密に判定すると、ステップS55の判定結果が肯定となる可能性が低くなり、オフセット量が決定されなくなる可能性があるからである。
ステップS56において、CPU10は、第1の姿勢に基づいて第1の座標を算出する。ステップS56における算出処理は、上述したステップS7の算出処理と同じである。すなわち、CPU10は、ステップS53で算出された第1の姿勢に基づいて、上記第1の方法に従って第1の座標を算出する。算出された第1の座標は、第1座標データ77としてメインメモリ32に記憶される。ステップS56の次にステップS57の処理が実行される。
ステップS57において、CPU10は、ステップS56で算出された第1の座標に基づいてオフセット量を決定する。図25は、オフセット量の決定方法を示す図である。なお、図25で示す入力装置8の姿勢は、入力装置8の指示位置が画面の上下方向に関して中央となった時点(ステップS55の判定結果がYesとなった時点)における姿勢である。また、原点Oは、第1の方法におけるX’Y’座標系の原点であり、上述した投影点Tの位置である。また、点Rは、ステップS56で算出された第1の座標の位置を示す。
オフセット量は、上記時点における第1の座標のY’成分が原点の値(0)となるように決定される。すなわち、上下方向に関して、第1の座標の位置Rが原点の位置となるように決定される。したがって、オフセット量は、第1の座標のY’成分の値dの正負を反転した値“−d”に決定される(図25参照)。CPU10は、第1座標データ77をメインメモリから読み出し、第1座標データ77により示される第1の座標のY’成分の正負を反転した値をオフセット量として決定する。決定されたオフセット量を示すデータは、オフセット量データ79としてメインメモリに記憶される。なお、後述する第1の座標の補正処理(ステップS42)では、第1の方法で算出された第1の座標が上記オフセット量だけ移動した座標へと補正される。したがって、ステップS57のオフセット量を算出する処理は、X’Y’座標系をオフセット量だけ(オフセット量の符号を反転させた方向へ)移動させる処理と言うことができる。以上のステップS57の次にステップS58が実行される。
ステップS58において、CPU10は、設定画面を終了するか否かを判定する。ステップS58の判定は、例えば、ユーザが設定画面を終了する指示を行ったか否かによって行われる。ステップS58の判定結果が否定である場合、ステップS51の処理が再度実行される。以降、ステップS58の判定結果が肯定であるまで、ステップS51〜S58の処理が繰り返し実行される。一方、ステップS58の判定結果が肯定である場合、CPU10はオフセット決定処理を終了する。
以上のように、オフセット決定処理においては、入力装置8が画面の(上下方向に関して)中央を指し示す時点で算出される第1の座標のY’成分が原点の値(0)となるように、オフセット量が決定される。ここで、オフセット決定処理においてオフセット量を決定するためには、入力装置8が画面の(上下方向に関して)中央を指し示す状態が生じなければならない。本実施形態では、このような状態を生じさせるべく、所定の指示を行うためのボタン画像81および82を画面の(上下方向に関して)中央に表示させるようにしている(図24)。これによれば、ユーザは、所定の指示を行うために、上記状態となるように入力装置8を自然に操作するので、オフセット量の決定操作をユーザに意識させることなく自然に行わせることができる。なお、上記所定の指示は、どのような指示であってもよいが、オフセット量を決定する処理が確実に実行されるようにするため、ユーザが必ず1回は行う指示(例えば、設定画面を終了する指示や、ゲームを開始する指示等)であることが好ましい。また、本実施形態のように、上記所定の指示として、カーソルの調整に関する指示を行わせることによって、カーソルの調整と同時にオフセット量を決定することができる。これによれば、「(オフセット量を決定するために)余計な操作を行っている」という感覚をユーザに与えることなく、オフセット量を決定することができる。
図22の説明に戻り、ステップS41のオフセット決定処理の次に、上述した実施形態と同様のステップS3の処理が実行される。さらに、ステップS3の次に、上述した実施形態と同様のステップS4〜S7の処理が実行される。なお、ステップS7の処理は、第1の方法で第1の座標を算出する処理である。第2の方法では、ステップS7の処理の次にステップS42の処理が実行される。
ステップS42において、CPU10は、ステップS7で算出された第1の座標をオフセット量に従って補正する。すなわち、CPU10は、第1座標データ77およびオフセット量データ78をメインメモリから読み出し、第1の座標を、Y’成分にオフセット量Dを加算した値へと補正する。補正後の第1の座標を示すデータは、新たな第1座標データ77としてメインメモリに記憶される。
なお、本実施形態では、第1の方法による第1の座標の算出処理(ステップS7)と、第1の座標の補正処理(ステップS42)とを別々の処理として記載したが、CPU10は、これら2つの処理をまとめて実行してもよい。すなわち、ステップS7において、CPU10は、上式(15)に代えて、以下の式(16)に従って第1の座標を算出してもよい。
Wy=L×Zy/Zz+D …(16)
上式(16)において、変数Dは、オフセット量を示し、上記ステップS56で算出された第1の座標のY’成分(d)の符号を反転させた値(−d)である。上式(16)を用いる場合、補正処理を含めた形で第1の座標を算出することができる。
ステップS42の次にステップS43およびS44の処理が実行される。ステップS43およびS44の処理は、上述したステップS8の処理と同様であるが、図22ではステップS8の処理を2つに分けてステップS43およびS44として説明を行う。
ステップS43において、CPU10は、テレビ2の画面上の位置を表す座標(画面座標)を算出する。画面座標は、ステップS42で補正された第1の座標に基づいて算出される。すなわち、CPU10は、第1座標データ77をメインメモリから読み出し、第1座標データ77により示される第1の座標に基づいて画面座標を算出する。画面座標は、第1の座標が原点の値(0,0)となる場合に画面の中心となるように算出される。また、画面座標は、画面の中心から画面座標への方向が、原点から第1の座標への方向に対応する方向となり、画面の中心から画面座標までの長さが、原点から第1の座標までの長さに対応する長さとなるように算出される。したがって、入力装置8のZ軸を画面の中心に向けた状態では、画面座標は画面の中心を表し(画面座標と指示位置とが一致し)、当該状態から入力装置8のZ軸の向きを変化させた方向に応じた方向へ画面座標が移動することになる。以上のようにして算出された画面座標を示すデータは、画面座標データ80としてメインメモリに記憶される。ステップS43の次にステップS44の処理が実行される。
ステップS44において、CPU10は、ステップS43で算出された画面座標を用いたゲーム処理を行う。ステップS43におけるゲーム処理は、上記画面座標に基づく処理であればどのような処理であってもよい。例えば、画面座標の位置にカーソルやゲームのオブジェクトを表示させる処理でもよいし、オブジェクトの位置と画面座標との位置関係に応じてオブジェクトを移動させる処理でもよい。なお、画面座標に何らかの画像が表示される場合には、ユーザが画面座標の位置を視認することができるので、第1の方法では上述したような違和感を抱く可能性が高い。したがって、このような場合には第2の方法が特に有効である。ステップS44の次に、上記実施形態と同様のステップS9の処理が実行される。以上で、第2の方法の説明を終了する。
以上のように、第2の方法においては、ゲーム装置3は、設定画面を表示する際に、入力装置8が画面の上下方向に関して中央を指し示している状態を検知し(ステップ54)、その状態における第1の座標を用いてオフセット量を決定する(ステップS57)。そして、その後のゲーム処理においては、第1の方法で算出された第1の座標を上記オフセット量に従って補正する(ステップS42)。したがって、入力装置8が画面の上下方向に関して中央を指し示している状態では、第1の座標のY’成分は0となり、その結果、画面座標は、上下方向に関して画面の中央の位置を表すことになる。したがって、第2の方法によれば、ユーザが入力装置8で画面の中心を指している場合には画面座標は画面の中心を表すことになるので、ユーザに違和感を与えることなく、画面座標を適切に算出することができる。
なお、上記実施形態においては、指示位置が画面の中心となる場合には、画面座標の位置と指示位置とが一致する。一方、指示位置がその他の位置となる場合には、上記長さL等によっては、必ずしも画面座標の位置と指示位置とは一致しない。これは、画面の中心において画面座標の位置と指示位置とが一致していれば、ユーザはほとんど違和感を感じないと考えられ、上記その他の位置で画面座標の位置と指示位置とが異なることによるデメリットはほとんどないからである。また、入力装置8の姿勢に応じて画面座標を決定するメリット(姿勢の変化に対する画面座標の変化の度合を適宜設定できるメリット)が上記デメリットよりも大きいと考えられるからである。
なお、入力装置8が画面の中央を指し示す時点における姿勢を基準姿勢とした場合、当該時点における原点を決定する処理、換言すれば、第1の座標が原点を取るときの入力装置8の姿勢を決定する処理であるステップS57の処理は、「基準姿勢を決定する処理」であると言える。また、原点から補正後の第1の座標への方向は、上記基準姿勢から現在の姿勢までの変化の向き(回転方向)に対応し、原点から補正後の第1の座標までの距離は、上記基準姿勢から現在の姿勢までの変化量(回転量)に対応する。したがって、補正後の第1の座標を算出する処理(ステップS7およびステップS742)は、「上記基準姿勢から現在の姿勢までの変化の向きおよび変化量に応じた値となるように第1の座標を算出する処理」であると言える。以上より、第2の方法は、(a)入力装置8が画面の中央を指し示す時点における基準姿勢を決定する処理、および、(b)基準姿勢から現在の姿勢までの変化の向きおよび変化量に応じた第1の座標(ひいては画面座標)を算出する処理を実行するものである。したがって、第2の方法は、上記(a)および(b)の処理によって、基準姿勢においては常に特定の値(本実施形態では、画面中央の値)となるように画面座標を算出することを可能とし、これによってユーザが違和感を抱くことを防止するものである。
[変形例]
(第2の方法に関する変形例)
上記実施形態では、ゲームの開始前の処理(ステップS2およびS3)では、入力装置8の姿勢に応じたカーソル(第1カーソル)ではなく、マーカ座標に基づく第2の座標の位置に表示されるカーソル(第2カーソル)が用いられる。このように、ゲーム装置3は、算出方法が異なる2種類のカーソルを用いてもよい。なお、仮に2種類のカーソルが画面上のいずれの位置でも一致しない(2種類のカーソルの位置が一致する場合における入力装置8の状態が一致しない)とすれば、一方のカーソルから他方のカーソルへ切り替わる際、ユーザは、カーソルの操作方法が全く変わってしまう感覚を受けるために、違和感を抱き、操作性が悪いと感じるおそれがある。これに対して、上記実施形態においては、2種類のカーソルは画面の中心において一致する(カーソルが画面の中心に位置する場合の入力装置8の状態が一致する)。そのため、2種類のカーソルを切り替える際に生じる違和感が少なく、カーソル操作に対してユーザが困惑することを防止することができる。
また、上記実施形態においては、上記第2カーソルを用いてユーザが操作を行う際に第1カーソルに関するオフセット量を決定するので、表示されている第2カーソルの挙動はオフセット量の決定に応じて変化することがない。そのため、ゲーム装置3は、カーソルの挙動が急に変化することによる違和感をユーザに抱かせることなく、オフセット量を決定することができる。
なお、他の実施形態においては、ゲーム装置3は、オフセット量を決定する際、上記第2カーソルを必ずしも用いる必要はない。例えば、ゲーム装置3は、「画面中央にコントローラを向けてAボタンを押して下さい」というメッセージを表示し(カーソルは表示しない)、Aボタンが押下された時点で上記ステップS56およびS57の処理を実行するようにしてもよい。この場合であっても、ユーザが「入力装置8が画面中央を指している」と感じる状態で、画面座標は画面の中心に位置することになるので、上記実施形態と同様、ユーザが抱く違和感を低減することができる。また、ゲーム装置3は、オフセット量を決定することを示唆する画面を表示する必要はなく、例えばゲーム画像が表示されている場合にオフセット量を決定してもよい。
また、上記実施形態では、ゲーム装置3は、オフセット量を決定する処理(ステップS57)を、画面座標を入力として用いる処理(ステップS44)を実行前にのみ実行した。ここで、他の実施形態においては、画面座標を入力として用いる処理を繰り返し実行する場合、当該処理が繰り返し実行される合間に、オフセット量を(再度)決定する処理を実行してもよい。例えば上記実施形態に即して言えば、ゲーム中においてステップS3〜S9の処理ループが繰り返し実行される間に、オフセット量を決定する処理が実行されてもよい。例えば、ゲーム装置3は、ゲーム中において上記設定画面が表示されるタイミングでオフセット量を決定する処理を実行してもよいし、当該処理を所定時間間隔で実行してもよいし、ユーザが指示したタイミングで当該処理を実行してもよい。このように、ゲーム中においてオフセット量を決定し直すことによって、ゲーム中に入力装置を把持するユーザの状態が変化した場合(例えば、ゲームを立ってプレイしていたが、ゲーム途中で座った場合)でも、適切なオフセット量を決定し直すことができる。なお、オフセット量を決定し直す処理が実行されると、オフセット量が変化することによって、ユーザの意図しない画面座標の変化が生じ、ユーザがゲーム操作をうまく行えない可能性がある。そのため、ゲーム装置3は、画面座標を入力とする処理が実行されている期間(例えば、カーソルを用いてゲーム操作を行っている期間)には、オフセット量を決定し直す処理をできるだけ実行しないことが好ましい。また、当該処理を実行する場合には、画面座標の変化による影響が小さい場面(例えば、ゲームのポーズ中や、メニュー画面の表示中)で実行することが好ましい。
上記実施形態では、ゲーム装置3は、仮想空間に設定される平面Qを用いて入力装置8の姿勢から第1の座標を算出し、第1の座標から画面座標を算出した。ここで、入力装置8の姿勢から画面座標を算出する方法は、姿勢に応じて画面座標の位置が変化する方法であればどのような方法であってもよい。例えば、ゲーム装置3は、第1の座標を算出せずに、入力装置8の姿勢から画面座標を直接算出してもよい(換言すれば、第1の座標は画面上の位置を表す座標であってもよい。)。具体的には、ゲーム装置3は、入力装置8が所定の基準姿勢となる場合に画面座標が画面の中心の位置となるように設定し、かつ、当該基準姿勢からの回転角度に比例した大きさだけ、当該基準姿勢からの回転方向に(中心位置にある画面座標を)移動させた位置を表すように、画面座標を算出してもよい。また、例えば、ゲーム装置3は、上記X’Y’座標を画面座標の座標系と一致するように設定することで、入力装置8の姿勢から画面座標を直接算出してもよい。
また、上記実施形態においては、ゲーム装置3は、オフセット量を用いて第1の座標を補正することによって画面座標を間接的に補正するようにしたが、他の実施形態においては、画面座標を直接補正するようにしてもよい。具体的には、ゲーム装置3は、上記ステップS56において、第1の座標からさらに画面座標を算出し、ステップS57において、画面座標に関するオフセット量を算出してもよい。このとき、ステップS42およびS43においては、ゲーム装置3は、第1の方法で算出された第1の座標から画面座標を算出し、算出された画面座標をオフセット量に従って補正することによって、最終的な画面座標を得ればよい。
また、上記実施形態においては、ゲーム装置3は、第1の座標に関してオフセット量を設定する、すなわち、X’Y’座標系を平面Q上で移動することによって、第1の座標の補正を行った(図20、図25)。ここで、他の実施形態においては、仮想空間における入力装置8の位置を中心にX’Y’座標系を回転させることによって、第1の座標を補正してもよい。図26は、第2の方法における補正方法の変形例を示す図である。図26は、仮想空間における平面Qを側方から見た図であって、点線で示す平面Qは、第1の方法で用いる平面Qと同じ平面であり、実線で示す平面Q’は、補正後の平面Qである。図26に示す変形例では、CPU10は、図23に示す上記ステップS56およびS57の処理に代えて、次の処理を実行する。すなわち、CPU10は、入力装置8の姿勢(第1姿勢M1)に基づいて、補正後のX’Y’座標系を設定する。X’Y’座標系は、入力装置8のZ軸ベクトルVZの方向に長さLだけ離れた位置が原点となり、かつ、Z軸ベクトルVZと垂直な平面Q’上に設定される。また、ゲーム中においては、CPU10は、図22に示すステップS7およびS42の処理に代えて、上記平面Q’上のX’Y’座標系によって表現される第1の座標を算出する。上記変形例によれば、仮想空間における入力装置8の位置からの距離が一定になるので、第1の座標(画面座標)をより正確に算出することができる。例えば、実際にテレビ2の画面が鉛直方向から傾いて設置される場合(例えば、画面が水平よりも下方を向いてテレビ2が天井に設置される場合)には、より正確に画面座標を算出することができる。一方、上記実施形態における補正方法では、入力装置8の位置に対して固定される平面内においてX’Y’座標系が設定されるので、補正の計算が簡単になる。したがって、テレビ2の画面が鉛直方向から大きく傾いて設置される状況が想定されない場合や、CPU10の処理負荷の低減を優先する場合には、上記実施形態における補正方法を採用することが好ましい。
(撮像手段に関する変形例)
上記実施形態では、ゲーム装置3は、入力装置8が画面の中心を向く方向となったことを検知するために、入力装置8が備える撮像手段による撮像画像(マーカ座標)を用いた。ここで、ゲーム装置3は、空間内の所定位置から見たときの入力装置8の方向を知ることができれば、上記撮像画像に代えて、他の情報を用いて上記の検知を行ってもよい。例えば、テレビ2の周辺にカメラが設置される場合、ゲーム装置3は、当該カメラによって入力装置8が撮像された撮像画像を用いて上記検知を行ってもよい。また、上記検知を行うための方法はどのようなものであってもよく、例えば入力装置8の周囲に電波あるいは超音波等の信号を発生する装置を設置し、ゲーム装置3は、入力装置8において当該信号を検知することによって、空間内の所定位置から見たときの入力装置8の方向を検知するようにしてもよい。
(入力装置8の姿勢算出に関する変形例)
なお、上記実施形態においては、ゲーム装置3は、ジャイロセンサ55および56、加速度センサ37、ならびに撮像素子40による検出結果を用いて、入力装置8の姿勢を算出した(ステップS3〜S6)。ここで、入力装置8の姿勢を算出する方法はどのような方法であってもよい。例えば、入力装置8の姿勢は、ジャイロセンサの検出結果のみを用いて算出されてもよいし、加速度センサの検出結果のみを用いて算出されてもよい。
なお、上記実施形態においては、3軸回りの角速度を検出するジャイロセンサを用いて、3次元の姿勢を算出する場合を例として説明したが、2次元の姿勢を算出する場合においても本発明を適用することが可能である。例えば、ロール方向の回転を行わない等の前提であれば、ピッチ方向およびヨー方向の回転に関する2次元の姿勢を、2軸回りの角速度を2軸ジャイロセンサで検出することによって算出してもよい。そして、当該2次元の姿勢から画面座標を算出してもよい。
また、他の実施形態においては、第2補正処理は、入力装置8がマーカ部6を撮像していると推測される場合にのみ、実行されるようにしてもよい。具体的には、CPU10は、第2補正処理を実行する前に、入力装置8(撮像手段)がマーカ部6を撮像可能な向きを向いているか否かを判定する。この判定は、第1の姿勢あるいは第2の姿勢を用いて行うことができる。例えば、第1の姿勢(または第2の姿勢)が、入力装置8の撮像方向が入力装置8からマーカ部6への向きに対して同じ向きかそれとも逆向きかを判定するようにしてもよい。また、上記の判定に用いられる第1の姿勢は、前回の処理ループにおいて第1および第2補正処理が行われた第1の姿勢であってもよいし、今回の処理ループにおいて算出されて第1補正処理が行われた第1の姿勢であってもよい。
上記の判定の結果、CPU10は、入力装置8がマーカ部6を撮像可能な向きを向いていると判定される場合、第2補正処理を実行し、マーカ部6を撮像可能な向きを向いていないと判定される場合、第2補正処理をスキップする。なお、マーカ部6でない物(例えば、部屋の電灯や窓の外の太陽光等)がマーカ部6と誤検出されることがあり、誤検出によって得られたマーカ座標を用いて第3の姿勢が算出される場合、かかる第3の姿勢を用いて第2補正処理を行っても正確に補正を行うことができない。これに対して、上記の判定処理を行うことにより、誤検出によって得られたマーカ座標から算出される第3の姿勢を用いて第2補正処理が行われることを防止することができる。これによって、第2補正処理をより正確に行うことができる。