図1を参照して、本発明の一実施形態に係る情報処理システムの一例であるゲームシステム1について説明する。なお、図1は、当該ゲームシステム1を説明するための外観図である。以下、据置型ゲーム装置を一例にして、本発明のゲームシステム1について説明する。
図1において、当該ゲームシステム1は、家庭用テレビジョン受像機等のスピーカ22を備えたディスプレイ(以下、モニタと記載する)2に、接続コードを介して接続される据置型ゲーム装置(以下、単にゲーム装置と記載する)3および当該ゲーム装置3に操作データを与えるコントローラ7によって構成される。また、モニタ2の周辺(図では画面の上側)には、2つのマーカ8aおよび8bが設置される。マーカ8aおよび8bは、具体的には赤色LEDであり、それぞれモニタ2の前方に向かって赤外光を含む光を出力する。ゲーム装置3は、接続端子を介して受信ユニット6が接続される。受信ユニット6は、コントローラ7から無線送信される操作データを受信し、コントローラ7とゲーム装置3とは無線通信によって接続される。また、ゲーム装置1には、当該ゲーム装置3に対して交換可能に用いられる情報記憶媒体の一例である光ディスク4が脱着される。ゲーム装置3の上部主面には、当該ゲーム装置3の電源ON/OFFスイッチ、ゲーム処理のリセットスイッチ、およびゲーム装置3上部の蓋を開くOPENスイッチが設けられている。ここで、プレイヤがOPENスイッチを押下することによって上記蓋が開き、光ディスク4の脱着が可能となる。
また、ゲーム装置3には、セーブデータ等を固定的に記憶するバックアップメモリ等を搭載する外部メモリカード5が必要に応じて着脱自在に装着される。ゲーム装置3は、光ディスク4に記憶されたゲームプログラムなどを実行することによって、その結果をゲーム画像としてモニタ2に表示する。さらに、ゲーム装置3は、外部メモリカード5に記憶されたセーブデータを用いて、過去に実行されたゲーム状態を再現して、ゲーム画像をモニタ2に表示することもできる。そして、ゲーム装置3のプレイヤは、モニタ2に表示されたゲーム画像を見ながら、コントローラ7を操作することによって、ゲーム進行を楽しむことができる。
コントローラ7は、その内部に備える通信部36(後述)から受信ユニット6が接続されたゲーム装置3へ、例えばBluetooth(ブルートゥース)(登録商標)の技術を用いて操作データを無線送信する。コントローラ7は、操作対象(モニタ2に表示されるオブジェクトや仮想カメラ)を操作するための操作手段である。コントローラ7は、複数の操作ボタンからなる操作部が設けられている。また、後述により明らかとなるが、コントローラ7は、当該コントローラ7から見た画像を撮像するための撮像情報演算部35(後述)を備えている。すなわち、撮像情報演算部35は、モニタ2の周辺に配置された各マーカ8aおよび8bを撮像対象として、各マーカ8aおよび8bの画像を撮像する。ゲーム装置3は、この画像を用いてコントローラ7の位置および姿勢に対応した操作信号を得る。
次に、図2を参照して、ゲーム装置3の構成について説明する。なお、図2は、ゲーム装置3の機能ブロック図である。
図2において、ゲーム装置3は、各種プログラムを実行する例えばリスク(RISC)CPU(セントラルプロセッシングユニット)10を備える。CPU10は、図示しないブートROMに記憶された起動プログラムを実行し、メインメモリ13等のメモリの初期化等を行った後、光ディスク4に記憶されているゲームプログラムを実行し、そのゲームプログラムに応じたゲーム処理等を行うものである。CPU10には、メモリコントローラ11を介して、GPU(Graphics Processing Unit)12、メインメモリ13、DSP(Digital Signal Processor)34、およびARAM(Audio RAM)35が接続される。また、メモリコントローラ11には、所定のバスを介して、コントローラI/F(インターフェース)16、ビデオI/F17、外部メモリI/F18、オーディオI/F19、およびディスクI/F21が接続され、それぞれ受信ユニット6、モニタ2、外部メモリカード5、スピーカ22、およびディスクドライブ20が接続されている。
GPU12は、CPU10の命令に基づいて画像処理を行うものあり、例えば、3Dグラフィックスの表示に必要な計算処理を行う半導体チップで構成される。GPU12は、図示しない画像処理専用のメモリやメインメモリ13の一部の記憶領域を用いて画像処理を行う。GPU12は、これらを用いてモニタ2に表示すべきゲーム画像データやムービー映像を生成し、適宜メモリコントローラ11およびビデオI/F17を介してモニタ2に出力する。
メインメモリ13は、CPU10で使用される記憶領域であって、CPU10の処理に必要なゲームプログラム等を適宜記憶する。例えば、メインメモリ13は、CPU10によって光ディスク4から読み出されたゲームプログラムや各種データ等を記憶する。このメインメモリ13に記憶されたゲームプログラムや各種データ等がCPU10によって実行される。
DSP14は、ゲームプログラム実行時にCPU10において生成されるサウンドデータ等を処理するものであり、そのサウンドデータ等を記憶するためのARAM15が接続される。ARAM15は、DSP14が所定の処理(例えば、先読みしておいたゲームプログラムやサウンドデータの記憶)を行う際に用いられる。DSP14は、ARAM15に記憶されたサウンドデータを読み出し、メモリコントローラ11およびオーディオI/F19を介してモニタ2に備えるスピーカ22に出力させる。
メモリコントローラ11は、データ転送を統括的に制御するものであり、上述した各種I/Fが接続される。コントローラI/F16は、例えば4つのコントローラI/Fで構成され、それらが有するコネクタを介して嵌合可能な外部機器とゲーム装置3とを通信可能に接続する。例えば、受信ユニット6は、上記コネクタと嵌合し、コントローラI/F16を介してゲーム装置3と接続される。上述したように受信ユニット6は、コントローラ7からの操作データを受信し、コントローラI/F16を介して当該操作データをCPU10へ出力する。なお、他の実施形態においては、ゲーム装置3は、受信ユニット6に代えて、コントローラ7から送信されてくる操作データを受信する受信モジュールをその内部に設ける構成としてもよい。この場合、受信モジュールが受信した送信データは、所定のバスを介してCPU10に出力される。ビデオI/F17には、モニタ2が接続される。外部メモリI/F18には、外部メモリカード5が接続され、その外部メモリカード5に設けられたバックアップメモリ等とアクセス可能となる。オーディオI/F19にはモニタ2に内蔵されるスピーカ22が接続され、DSP14がARAM15から読み出したサウンドデータやディスクドライブ20から直接出力されるサウンドデータをスピーカ22から出力可能に接続される。ディスクI/F21には、ディスクドライブ20が接続される。ディスクドライブ20は、所定の読み出し位置に配置された光ディスク4に記憶されたデータを読み出し、ゲーム装置3のバスやオーディオI/F19に出力する。
次に、図3〜図7を参照して、コントローラ7について説明する。図3〜図5は、コントローラ7の外観構成を示す斜視図である。図3(a)は、コントローラ7の上面後方から見た斜視図であり、図3(b)は、コントローラ7を下面後方から見た斜視図である。図4は、コントローラ7を前方から見た図である。
図3および図4において、コントローラ7は、例えばプラスチック成型によって形成されたハウジング31を有している。ハウジング31は、その前後方向(図3に示すZ軸方向)を長手方向とした略直方体形状を有しており、全体として大人や子供の片手で把持可能な大きさである。プレイヤは、コントローラ7を用いることによって、それに設けられたボタンを押下するゲーム操作を行うことに加え、コントローラ7自体の位置や向きを変えることによってゲーム操作を行うことができる。例えば、プレイヤは、長手方向を軸としてコントローラ7を回転させることによって、操作対象に移動動作を行わせることができる。また、プレイヤは、コントローラ7によって指し示される画面上の位置を変える操作によって、例えば、当該位置に向けて操作対象を移動させることができる。ここで、「コントローラ7によって指し示される画面上の位置」とは、コントローラ7の前端部から上記長手方向に延ばした直線と、モニタ2の画面とが交わる位置である。以下では、当該位置を「指示位置」と呼ぶことがある。また、コントローラ7(ハウジング31)の長手方向を、「コントローラ7の指示方向」と呼ぶことがある。
ハウジング31には、複数の操作ボタンが設けられる。ハウジング31の上面には、十字キー32a、Xボタン32b、Yボタン32c、Bボタン32d、セレクトスイッチ32e、メニュースイッチ32f、およびスタートスイッチ32gが設けられる。一方、ハウジング31の下面には凹部が形成されており、当該凹部の後面側傾斜面にはAボタン32iが設けられる。これらの各ボタン(スイッチ)は、ゲーム装置3が実行するゲームプログラムに応じてそれぞれの機能が割り当てられるが、本発明の説明とは直接関連しないため詳細な説明を省略する。また、ハウジング31の上面には、遠隔からゲーム装置3本体の電源をオン/オフするための電源スイッチ32hが設けられる。
また、コントローラ7は撮像情報演算部35(図5)を有しており、図4に示すように、ハウジング31前面には撮像情報演算部35の光入射口35aが設けられる。一方、ハウジング31の後面にはコネクタ33が設けられている。コネクタ33は、例えば32ピンのエッジコネクタであり、コントローラ7に他の機器を接続するために利用される。また、ハウジング31上面の後面側には複数のLED34が設けられる。ここで、コントローラ7には、他のコントローラ7と区別するためにコントローラ種別(番号)が付与される。LED34は、コントローラ7に現在設定されている上記コントローラ種別をプレイヤに通知するために用いられる。具体的には、コントローラ7からゲーム装置3へ操作データを送信する際、上記コントローラ種別に応じて複数のLED34のいずれか1つが点灯する。
次に、図5および図6を参照して、コントローラ7の内部構造について説明する。図5は、コントローラ7の内部構造を示す図である。なお、図5(a)は、コントローラ7の上筐体(ハウジング31の一部)を外した状態を示す斜視図である。図5(b)は、コントローラ7の下筐体(ハウジング31の一部)を外した状態を示す斜視図である。図5(b)に示す基板300は、図5(a)に示す基板300の裏面から見た斜視図となっている。
図5(a)において、ハウジング31の内部には基板300が固設されており、当該基板300の上主面上に操作ボタン32a〜32h、加速度センサ37、LED34、水晶振動子46、無線モジュール44、およびアンテナ45等が設けられる。そして、これらは、基板300等に形成された配線(図示せず)によってマイコン42(図6参照)に接続される。また、無線モジュール44およびアンテナ45によって、コントローラ7がワイヤレスコントローラとして機能する。なお、水晶振動子46は、後述するマイコン42の基本クロックを生成する。
一方、図5(b)において、基板300の下主面上の前端縁に撮像情報演算部35が設けられる。撮像情報演算部35は、コントローラ7の前方から順に赤外線フィルタ38、レンズ39、撮像素子40、および画像処理回路41によって構成されおり、それぞれ基板300の下主面に取り付けられる。また、基板300の下主面上の後端縁にコネクタ33が取り付けられる。そして、撮像情報演算部35の後方であって基板300の下主面上に操作ボタン32iが取り付けられていて、それよりさらに後方に、電池47が収容される。電池47とコネクタ33との間の基板300の下主面上には、バイブレータ48が取り付けられる。このバイブレータ48は、例えば振動モータやソレノイドであってよい。バイブレータ48が作動することによってコントローラ7に振動が発生するので、それを把持しているプレイヤの手にその振動が伝達され、いわゆる振動対応ゲームを実現することができる。
図6は、コントローラ7の構成を示すブロック図である。コントローラ7は、上述した操作部32(各操作ボタン)および撮像情報演算部35の他に、その内部に通信部36および加速度センサ37を備えている。
撮像情報演算部35は、撮像手段が撮像した画像データを解析してその中で輝度が高い場所を判別してその場所の重心位置やサイズなどを検出するためのシステムである。撮像情報演算部35は、例えば最大200フレーム/秒程度のサンプリング周期を有するので、比較的高速なコントローラ7の動きでも追跡して解析することができる。
具体的には、撮像情報演算部35は、赤外線フィルタ38、レンズ39、撮像素子40、および画像処理回路41を含んでいる。赤外線フィルタ38は、コントローラ7の前方から入射する光から赤外線のみを通過させる。ここで、モニタ2の表示画面近傍に配置されるマーカ8aおよび8bは、モニタ2の前方に向かって赤外光を出力する赤外LEDである。したがって、赤外線フィルタ38を設けることによってマーカ8aおよび8bの画像をより正確に撮像することができる。レンズ39は、赤外線フィルタ38を透過した赤外線を集光して撮像素子40へ出射する。撮像素子40は、例えばCMOSセンサやあるいはCCDのような固体撮像素子であり、レンズ39が集光した赤外線を撮像する。したがって、撮像素子40は、赤外線フィルタ38を通過した赤外線だけを撮像して画像データを生成する。以下では、撮像素子40によって撮像された画像を撮像画像と呼ぶ。撮像素子40によって生成された画像データは、画像処理回路41で処理される。画像処理回路41は、撮像画像内における撮像対象(マーカ8aおよび8b)の位置を算出する。画像処理回路41は、各マーカ8aおよび8bの撮像画像内における位置を示す各座標値を通信部36へ出力する。なお、画像処理回路41における処理の詳細については後述する。
加速度センサ37は、コントローラ7の上下方向(図3に示すY軸方向)、左右方向(図3に示すX軸方向)および前後方向(図3に示すZ軸方向)の3軸でそれぞれ加速度を検知する加速度センサである。この加速度センサによって、コントローラ7のX軸方向、Y軸方向およびZ軸方向に関する傾きを検知することが可能である。つまり、ゲーム装置3は、上記撮像画像からコントローラ7のZ軸周りの回転角度を検出するだけでなく、加速度センサによっても当該回転角度を検出することが可能である。なお、加速度センサ37は、必要な操作信号の種類によっては、上下方向および左右方向の2軸でそれぞれ加速度を検出する加速度センサが用いられてもかまわない。加速度センサ37が検知した加速度を示すデータは、通信部36へ出力される。なお、加速度センサ37は、典型的には静電容量式の加速度センサが用いられるが、他の方式の加速度センサやジャイロセンサを用いてもかまわない。この加速度センサ37から出力される加速度データに基づいて、コントローラ7の傾きを検出することができる。
通信部36は、マイクロコンピュータ(Micro Computer:マイコン)42、メモリ43、無線モジュール44、およびアンテナ45を含んでいる。マイコン42は、処理の際にメモリ43を記憶領域として用いながら、マイコン42が取得したデータを無線送信する無線モジュール44を制御する。
操作部32、加速度センサ37、および撮像情報演算部35からマイコン42へ出力されたデータは、一時的にメモリ43に格納される。ここで、通信部36から受信ユニット6への無線送信は所定の周期毎に行われるが、ゲームの処理は1/60を単位として行われることが一般的であるので、それよりも短い周期で送信を行うことが必要となる。マイコン42は、受信ユニット6への送信タイミングが到来すると、メモリ43に格納されているデータを操作データとして無線モジュール44へ出力する。無線モジュール44は、例えばBluetooth(ブルートゥース)(登録商標)の技術を用いて、所定周波数の搬送波を操作データで変調し、その微弱電波信号をアンテナ45から放射する。つまり、操作データは、無線モジュール44で微弱電波信号に変調されてコントローラ7から送信される。微弱電波信号はゲーム装置3側の受信ユニット6で受信される。受信された微弱電波信号について復調や復号を行うことによって、ゲーム装置3は操作データを取得することができる。そして、ゲーム装置3のCPU10は、取得した操作データとゲームプログラムとに基づいて、ゲーム処理を行う。
なお、図3〜図5に示したコントローラ7の形状や、各操作スイッチの形状、数および設置位置等は単なる一例に過ぎず、他の形状、数、および設置位置であっても、本発明を実現することができることは言うまでもない。また、コントローラ7における撮像情報演算部35の位置(撮像情報演算部35の光入射口35a)は、ハウジング31の前面でなくてもよく、ハウジング31の外部から光を取り入れることができれば他の面に設けられてもかまわない。このとき、上記「コントローラ7の指示方向」は、光入射口に垂直な方向となる。
上記コントローラ7を用いることによって、プレイヤは、各操作スイッチを押下する従来のゲーム操作に加えて、コントローラ7自身の位置を動かしたり、コントローラ7を回転させたりするという、今までにないゲーム操作を行うことができる。以下、上記コントローラ7を用いたゲーム操作について説明する。
図7は、コントローラ7を用いてゲーム操作するときの状態を概説する図解図である。図7に示すように、ゲームシステム1でコントローラ7を用いてゲームをプレイする際、プレイヤは、一方の手(例えば右手)でコントローラ7を把持する。ここで、マーカ8aおよび8bは、モニタ2の画面の横方向と平行に配置されている。プレイヤは、コントローラ7の前面(撮像情報演算部35が撮像する光の入射口側)がマーカ8aおよび8bの方向を向く状態でコントローラ7を把持する。この状態で、プレイヤは、コントローラ7を回転させたり(図7の矢印参照)、コントローラ7が指し示す画面上の位置を変更したりすることによってゲーム操作を行う。
図8は、マーカ8aおよび8bとコントローラ7との視野角を説明するための図である。図8に示すように、各マーカ8aおよび8bは、それぞれ視野角θ1の範囲で赤外光を放射している。また、撮像情報演算部35の撮像素子40は、視野角θ2の範囲で入射する光を受光することができる。例えば、各マーカ8aおよび8bの視野角θ1は共に34°(半値角)であり、撮像素子40の視野角θ2は41°である。プレイヤは、撮像素子40が2つのマーカ8aおよび8bからの赤外光を共に受光することが可能な位置および向きとなるように、コントローラ7を把持する。具体的には、撮像素子40の視野角θ2の中に各マーカ8aおよび8bが共に存在し、かつ、マーカ8aの視野角θ1の中であってかつマーカ8bの視野角θ1の中にコントローラ7が存在する範囲で、プレイヤはコントローラ7を把持する。プレイヤは、この範囲内でコントローラ7の位置および向きを変化させることによってゲーム操作を行うことができる。なお、コントローラ7の位置および向きがこの範囲外となった場合、コントローラ7の位置および向きに基づいたゲーム操作を行うことができなくなる。以下では、上記範囲を「操作可能範囲」と呼ぶ。
操作可能範囲内でコントローラ7が把持される場合、撮像情報演算部35によって各マーカ8aおよび8bの画像が撮像される。すなわち、撮像素子40によって得られる撮像画像には、撮像対象である各マーカ8aおよび8bの画像(対象画像)が含まれる。図9は、対象画像を含む撮像画像の一例を示す図である。対象画像を含む撮像画像の画像データを用いて、画像処理回路41は、各マーカ8aおよび8bの撮像画像における位置を表す座標を算出する。
撮像画像の画像データにおいて対象画像は高輝度部分として現れるので、画像処理回路41は、まず、この高輝度部分を対象画像の候補として検出する。次に、検出された高輝度部分の大きさに基づいて、その高輝度部分が対象画像であるか否かを判定する。撮像画像には、対象画像である2つのマーカ8aおよび8bの画像8a’および8b’の他、窓からの太陽光や部屋の蛍光灯の光によって対象画像以外の画像が含まれていることがある。上記の判定処理は、対象画像であるマーカ8aおよび8bの画像8a’および8b’とそれ以外の画像とを区別し、対象画像を正確に検出するための処理である。具体的には、当該判定処理においては、検出された高輝度部分が、予め定められた所定範囲内の大きさであるか否かが判定される。そして、高輝度部分が所定範囲内の大きさである場合、当該高輝度部分は対象画像を表すと判定され、高輝度部分が所定範囲内の大きさでない場合、当該高輝度部分は対象画像以外の画像を表すと判定される。
さらに、上記の判定処理の結果、対象画像を表すと判定された高輝度部分について、画像処理回路41は当該高輝度部分の位置を算出する。具体的には、当該高輝度部分の重心位置を算出する。対象画像が正しく検出される場合には上記判定処理によって2つの高輝度部分が対象画像として判定されるので、上記算出処理によって2箇所の位置が算出される。ここで、撮像画像における位置は、撮像画像の左上を原点とし、下向きをy軸正方向とし、右向きをx軸正方向とする座標系(xy座標系)で表現されるものとする。したがって、画像処理回路41は、上記算出処理によって算出された2箇所の位置を示す2つの座標値を示すデータを出力する。出力された座標値のデータは、上述したように、マイコン42によって操作データとしてゲーム装置3に送信される。
ゲーム装置3は、受信した操作データに含まれる上記座標値のデータを用いて、上記指示位置(コントローラ7が指し示す画面上の位置)と、コントローラ7の指示方向を軸とした回転角度(姿勢)と、コントローラ7から各マーカ8aおよび8bまでの距離を算出することができる。図10は、コントローラ7の位置および/または向きを変化させた場合における撮像画像の変化を示す図である。図10は、コントローラの状態と、その状態にあるときに得られる撮像画像との対応を示している。図10において、コントローラ7が状態Aにあるときの撮像画像を撮像画像I1とする。撮像画像I1では、対象画像である各マーカ8aおよび8bの画像8a’および8b’は、撮像画像I1の中央付近に位置している。また、対象画像8a’および8b’は、x軸方向にほぼ平行に配置されている。状態Aは、コントローラ7がマーカ8aとマーカ8bとの中間の位置を指し示している状態である。
図10に示す状態Bは、指示方向を軸として(Z軸周りに)状態Aから右回りに90°だけコントローラ7を回転させた状態である。なお、以下、本明細書では、コントローラ7に関する「右回り」および「左回り」とは、コントローラ7の後方(図3に示すZ軸負方向側)から見たときの回転方向を言うものとする。状態Bにおいては、撮像情報演算部35によって撮像画像I2が得られる。撮像画像I2においては、対象画像8a’および8b’は、撮像画像I1の状態から左回りに90°回転している。このように、コントローラの姿勢が変化すると、撮像画像内における対象画像の向き(画像8a’から画像8b’への向きまたは画像8b’から画像8a’への向き)が変化する。したがって、撮像画像内における対象画像の向きを検出することによって、コントローラ7の指示方向を軸とした姿勢を知ることができる。
図10に示す状態Cは、状態Aを基準としてコントローラ7を右方向(X軸正方向)に平行移動させた状態である。この状態Cにおいては、撮像情報演算部35によって撮像画像I3が得られる。撮像画像I3においては、対象画像8a’および8b’は、撮像画像I1を基準として左方向(x軸負方向)に平行移動している。なお、状態Cは、コントローラ7の指示方向を状態Aから右方向に向けた状態である。ここで、コントローラ7を右方向に平行移動させる場合だけでなく、コントローラ7をY軸周りに回転させることによっても、コントローラ7の指示方向を右方向に向けることができる。また、コントローラ7をY軸周りに回転させる場合にも撮像画像I3と同様の撮像画像が得られる。以上より、コントローラ7の指示方向を右方向に向けるようにコントローラ7を移動(回転)させた場合、撮像画像I3と同様の撮像画像が得られる、すなわち、対象画像8a’および8b’が平行移動した画像が得られる。したがって、撮像画像内における対象画像の位置(後述する例では、画像8a’と画像8b’の中点の位置)を検出することによって、コントローラ7が指し示す方向を知ることができる。
次に、ゲーム装置3において行われるゲーム処理の詳細を説明する。まず、ゲーム処理において用いられる主なデータについて図11を用いて説明する。図11は、ゲーム装置3のメインメモリ13に記憶される主なデータを示す図である。図11に示すように、メインメモリ13には、現在操作データ50、前操作データ53、操作状態データ56、および操作対象データ58等が記憶される。なお、メインメモリ13には、図11に示すデータの他、ゲームに登場するプレイヤキャラクタに関するデータ(プレイヤキャラクタの画像データや位置データ等)やゲーム空間に関するデータ(地形データ等)等、ゲーム処理に必要なデータが記憶される。
現在操作データ50は、コントローラ7から送信されてくる操作データであり、最新の操作データである。現在操作データ50には、現在第1座標データ51および現在第2座標データ52が含まれる。現在第1座標データ51は、2つのマークのうちの一方の画像の位置(取得画像内における位置)を表す座標のデータである。現在第2座標データ52は、他方のマークの画像の位置(取得画像内における位置)を表す座標のデータである。なお、マークの画像の位置は、上記xy座標系(図9参照)によって表される。以下では、現在第1座標データ51により示される座標を第1座標と呼び、現在第2座標データ52により示される座標を第2座標と呼ぶ。なお、第1座標および第2座標は、後述する方向データ57を正しく算出するために区別され、いずれがマーカ8aの画像の位置を示し、いずれがマーカ8bの画像の位置を示すものであってもよい。ただし、前回のフレームで第1座標が一方のマーカの画像の位置を示している場合、次のフレームにおいても第1座標は当該一方のマーカの画像の位置を示すように設定する必要がある(後述するステップS13〜S15参照)。
また、現在操作データ50には、撮像画像から得られる座標データ(現在第1座標データ51および現在第2座標データ52)の他、操作部32や加速度センサ37から得られるデータが含まれる。ゲーム装置3は、所定時間間隔(例えば、1フレーム時間間隔)で操作データをコントローラ7から取得する。取得された操作データのうちで最新の操作データが現在操作データ50としてメインメモリ13に記憶される。
前操作データ53には、前第1座標データ54および前第2座標データ55が含まれる。前第1座標データ54は、現在第1座標データ51よりも1つ前に取得された第1座標データである。すなわち、新たに操作データが取得されたとき、それまでの現在第1座標データ51が前第1座標データ54として記憶される。そして、新たに取得された操作データに含まれる座標データのうちの一方が新たな現在第1座標データ51としてメインメモリ13に記憶される。また、前第2座標データ55は、前第1座標データ54と同様、現在第2座標データ52よりも1つ前に取得された第1座標データである。すなわち、新たに操作データが取得されたとき、それまでの現在第2座標データ52が前第2座標データ55として記憶され、新たに取得された操作データに含まれる座標データのうちの他方(現在第1座標データでない方)が新たな現在第2座標データ52としてメインメモリ13に記憶される。
操作状態データ56は、撮像画像に基づいて判断される、コントローラ7の操作状態を示すデータである。操作状態データ56は、撮像画像に含まれる対象画像の位置や向きや大きさを示すデータである。操作状態データ56には、方向データ57が含まれる。方向データ57は、第1座標から第2座標への方向を示すデータである。ここでは、方向データ57は、第1座標の位置を始点とし第2座標の位置を終点とするベクトルのデータとする。方向データ57は、取得画像内における対象画像(マーカ8aおよび8b)の向きを示す。
操作対象データ58は、画面上またはゲーム空間内における操作対象の位置および姿勢を示すデータである。ここで、操作対象とは、画面に表示されているオブジェクトや、仮想のゲーム空間に登場するオブジェクトの他、仮想の3次元ゲーム空間が構築される場合には、当該3次元ゲーム空間を画面に表示するための仮想カメラであってもよい。さらに
、操作対象は、画面に表示される画像、または、画面に表示されるウィンドウ内の画像であってもよい。また、操作対象データ58には、位置データ59が含まれる。位置データ59は、操作対象のゲーム空間における位置、または、画面上における位置を示すデータである。また、操作対象がウィンドウ内の画像である場合、位置データ59は、ウィンドウに表示可能な画像の領域全体のうちで、ウィンドウ内に実際に表示される画像の領域の位置を示すデータである。
次に、ゲーム装置3において行われるゲーム処理の詳細を、図12〜図14を用いて説明する。図12は、ゲーム装置3において実行されるゲーム処理の流れを示すフローチャートである。ゲーム装置3の電源が投入されると、ゲーム装置3のCPU10は、図示しないブートROMに記憶されている起動プログラムを実行し、これによってメインメモリ13等の各ユニットが初期化される。そして、光ディスク4に記憶されたゲームプログラムがメインメモリ13に読み込まれ、CPU10によって当該ゲームプログラムの実行が開始される。図12に示すフローチャートは、以上の処理が完了した後に行われるゲーム処理を示すフローチャートである。なお、図12〜図14に示すフローチャートにおいては、ゲーム処理のうち、コントローラ7の位置および向きに関するゲーム操作に基づいて行われるゲーム処理について詳細に示し、本願発明と直接関連しない他のゲーム処理については詳細な説明を省略する。
図12に示すステップS1において、コントローラ7から操作データが取得される。CPU10は、操作データを現在操作データ50としてメインメモリ13に記憶する。また、それまでの現在第1座標データ51および現在第2座標データ52の内容が、前第1座標データ54および前第2座標データ55としてメインメモリ13に記憶される。なお、この時点では、操作データに含まれる2つの座標データのうち、いずれが現在第1座標データ51となり、いずれが現在第2座標データ52となるかが決定されていない。したがって、この時点では、現在第1座標データ51および現在第2座標データ52はメインメモリ13に記憶されておらず、操作データに含まれる2つの座標データは現在第1座標データ51および現在第2座標データ52とは別にメインメモリ13に記憶される。
また、ステップS1で取得される操作データには、マーカ8aおよび8bの撮像画像内における位置を示す座標データの他、コントローラ7の各操作ボタンが押下されたか否かを示すデータ、および、コントローラ7の上下方向および左右方向の加速度を示すデータが含まれている。ここでは、コントローラ7は1フレーム時間間隔で操作データを送信し、CPU10は、1フレーム毎に操作データを取得するものとする。したがって、図12に示すステップS1〜S5の処理ループは、1フレーム毎に繰り返し実行される。
ステップS1の次のステップS2において、操作状態算出処理が実行される。操作状態算出処理においては、コントローラ7からの操作データに基づいてコントローラ7の操作状態(コントローラ7の位置や向き等に対応した値)が算出される。以下、図13および図14を用いて操作状態算出処理の詳細を説明する。
図13は、図12に示す操作状態算出処理(S2)の詳細な処理の流れを示すフローチャートである。操作状態算出処理においては、まずステップS11において、コントローラ7の撮像情報演算部35によって2つのマーカ8aおよび8bが撮像されたか否かが判定される。ステップS11の判定処理は、コントローラ7が上記操作可能範囲内で把持されているか否かを判定するための処理である。撮像情報演算部35によって2つのマーカ8aおよび8bが撮像がされない場合(コントローラ7が操作可能範囲内で把持されていない場合)、コントローラ7からの操作データには座標データが2つ含まれない。すなわち、撮像情報演算部35によって1つのマーカのみが撮像される場合には、画像処理回路41は座標データを1つのみ出力するので、コントローラ7からの操作データには座標データが1つのみ含まれる。また、撮像情報演算部35によってマーカが撮像されない場合には、画像処理回路41は座標データを出力しないので、コントローラ7からの操作データには座標データが含まれない。したがって、ステップS11の判定は、ステップS1で取得された操作データに座標データが2つ含まれるか否かによって行うことができる。ステップS11の判定において、2つのマーカ8aおよび8bが撮像されたと判定される場合、ステップS13の処理が行われる。一方、ステップS11の判定において、2つのマーカ8aおよび8bが撮像されていないと判定される場合、ステップS12の処理が行われる。
ステップS12において、メインメモリ13に記憶されている操作状態データ56の内容がクリアされる。なお、メインメモリ13に操作状態データ56が記憶されていない場合、後述する移動処理において操作対象の移動が行われない。つまり、本実施形態では、2つのマーカが撮像されない場合にはゲーム操作が行われない。ステップS12の後、CPU10は操作状態算出処理を終了する。
一方、ステップS13〜S15において、2つの座標データのいずれが第1座標であり、いずれが第2座標であるかが決定される。図14は、第1座標および第2座標を決定するための処理を説明するための図である。図14においては、点線で示す点P1’が前回の第1座標の位置を表し、点P2’が前回の第2座標の位置を表す。また、実線で示す点P1および点P2が、今回取得された2つの座標データにより示される座標の位置を表す。
図14において、新たに取得された2つの座標データにより示される座標P1およびP2については、これらの座標P1およびP2のみからでは、いずれが第1座標でいずれが第2座標かを検出することができない。つまり、座標P1’が移動して座標P1となったのか、それとも、座標P2’が移動して座標P1となったのかを、ゲーム装置3は座標P1およびP2のみからでは判断することができない。なお、第1座標と第2座標とは、いずれの一方がマーカ8aの画像の位置を示し、他方がマーカ8bの画像の位置を示すものであってもよいが、第1座標から第2座標への方向を算出する(後述するステップS16)都合上、第1座標と第2座標とが逆に検出されてしまうと、算出される方向が逆方向になってしまう。したがって、前回の第1座標が今回は第2座標として検出されると、ステップS16において誤った方向が算出されてしまう。
そこで、本実施形態においては、前回の座標と今回の座標との距離に基づいて、第1座標および第2座標を検出する。すなわち、新たに取得された2つの座標のうち、前回の第1座標に近い方の座標を第1座標とし、他方を第2座標とする。図14を例にとって説明すると、前回の第1座標P1’に近い方の座標P1が第1座標に設定され、他方の座標P2が第2座標に決定される。なお、あるフレームから次のフレームまでの間においてコントローラ7が90°よりも大きく回転した場合、前回の第1座標に遠い方の座標が正しい第1座標となる。しかし、座標が取得される(撮像情報演算部35による撮像が行われる)時間間隔は通常非常に短い(例えば、1/60秒間隔)ので、1フレームの間にコントローラ7が90°よりも大きく回転することは実際にはあり得ないと考えられる。そのため、前回の第1座標に近い方の座標を第1座標とすることによって、第1座標を正しく判断することができる。
具体的には、ステップS13において、前回のフレームにおいて第1座標および第2座標が検出されているか否かが判定される。ステップS13の判定は、メインメモリ13に操作状態データ56が記憶されているか否かによって行われる。なお、前回のフレームにおいてステップS12が実行された場合には、メインメモリ13に操作状態データ56が記憶されていない。この場合、前回のフレームにおいて第1座標および第2座標の少なくとも一方が取得されていないので、前回の座標を用いて第1座標および第2座標を判断することができない。一方、前回のフレームにおいてステップS13が実行された場合には、メインメモリ13に操作状態データ56が記憶されている。この場合、前回の座標を用いて第1座標および第2座標を判断することができる。ステップS13の処理は、前回の座標を用いて第1座標および第2座標を判断するか否かを判定するための処理である。ステップS13の判定において、前回のフレームにおいて第1座標および第2座標が検出されている場合、ステップS14の処理が実行される。一方、前回のフレームにおいて第1座標および第2座標の少なくとも一方が検出されていない場合、ステップS15の処理が実行される。
ステップS14においては、ステップS1で取得された操作データに含まれる2つの座標データにより示される2つの座標のうち、前回の第1座標に近い方が第1座標に設定される。具体的には、CPU10は、メインメモリ13に記憶されている前第1座標データ54と上記2つの座標データとを参照して、当該2つの座標データにより示される座標のうちで、前第1座標データ54により示される座標に近い方の座標を特定する。そして、特定した座標の座標データを現在第1座標データ51としてメインメモリ13に記憶する。また、もう一方の座標データを現在第2座標データ52としてメインメモリ13に記憶する。
一方、ステップS15においては、上記2つの座標データにより示される座標のうち、予め定められた所定の条件に従って一方の座標を第1座標に決定する。所定の条件はどのような条件であってもよいが、CPU10は、例えば、y座標値が小さい方の座標を第1座標に決定し、他方の座標を第2座標に決定する。第1座標に決定された座標データは、現在第1座標データ51としてメインメモリ13に記憶され、第2座標に決定された座標データは、現在第2座標データ52としてメインメモリ13に記憶される。
ステップS16において、第1座標から第2座標への方向が算出される。具体的には、CPU10は、現在第1座標データ51および現在第2座標データ52を参照して、第1座標の位置を始点とし第2座標の位置を終点とするベクトルを算出する。算出されたベクトルのデータは、方向データ57としてメインメモリ13に記憶される。算出されたベクトルは、コントローラ7の指示方向に関する回転角度を示している。つまり、このステップS16によって、コントローラ7の指示方向に関する回転角度が算出されたこととなる。以上のステップS16の後、CPU10は操作状態算出処理を終了する。
図12の説明に戻り、ステップS3において、操作対象を移動させる移動処理が実行される。この移動処理においては、ステップS16で算出された方向に応じて、予め決められた方向へ操作対象が移動される。以下、ステップS3の詳細を説明する。
ステップS3における操作対象としては、仮想のゲーム空間に登場するオブジェクト、仮想カメラ、および、画面全体に表示されるまたはウィンドウ内に表示される画像が考えられる。つまり、本実施形態においては、ゲーム空間をオブジェクトが移動する様子が画面に表示されてもよいし、ゲーム空間を見る視点が移動しながらゲーム空間の画像が画面に表示されてもよい。さらに、ウィンドウ内に表示される画像がスクロールして表示されてもよいし、画面全体に表示される画像がスクロールして表示されてもよい。
また、ステップS3における操作対象の移動動作は、予め決められた方向へ移動する動作であればどのようなものであってもよい。ここで、「予め決められた方向」とは、予め固定的に決められている方向、および、ユーザやゲーム状況によってその都度可変的に決められる方向であってもよい。例えば、ユーザによって指定された位置(画面上における位置、または、ゲーム空間内における位置)に向かって操作対象が移動するようにしてもよい。
図15および図16は、操作対象の移動動作の例を示す図である。なお、図15および図16では、ゲーム空間に登場するオブジェクトObを操作対象の一例として示している。ゲーム装置3は、図15(a)に示すように直線的にオブジェクトObを移動させてもよいし、図15(b)に示すように、予め決められた軌跡Trに沿った方向にオブジェクトObを移動させてもよい。また、ゲーム装置3は、ある一方向およびその逆方向の双方向に可逆に操作対象を移動させてもよいし、ある一方向にのみ操作対象を移動させてもよい。
また、操作対象の移動動作は、画面上を移動する動作であってもよいし、ゲーム空間内を移動する動作であってもよい。図16は、仮想の3次元ゲーム空間においてオブジェクトが移動する様子を示す図である。図16においては、移動前のオブジェクトObを点線で示し、移動後のオブジェクトObを実線で示している。図16において、Y軸の負方向から正方向に見たゲーム空間が画面に表示される場合、図16(a)のようにオブジェクトObが画面の奥側(Y軸正方向側)に移動すると、オブジェクトObは小さくなったように表示される(図16(b))。このように、ゲーム空間内を操作対象が移動する場合には、画面の表示上は操作対象が移動していることがわかりにくい場合がある。しかし、操作対象の移動動作は、画面上を移動する動作に限らず、ゲーム空間内を移動する動作であってもよく、移動していることが表示上はわかりにくいものであってもよい。
また、ステップS3において、ゲーム装置3は、ステップS16で算出された方向に応じて操作対象を移動させる。具体的には、ゲーム装置3は、ステップS16で算出された方向に基づいて、操作対象を移動させる方向を決定してもよいし、操作対象を移動させる移動量を決定してもよいし、操作対象を移動させる速度(単位時間当たりの移動量)や加速度を決定してもよい。
ステップS16で算出された方向に基づいて操作対象の移動方向を決定する場合、ゲーム装置3は、例えば、当該方向と、予め決められた基準方向との角度差に応じて移動方向を決定することができる。具体的には、当該角度差が正である場合と当該角度差が負である場合とで逆向きに操作対象を移動させるようにしてもよい。
また、ステップS16で算出された方向に基づいて操作対象の移動量を決定する場合、ゲーム装置3は、例えば、当該方向と上記基準方向との角度差に応じて移動量を決定することができる。具体的には、角度差が大きくなるほど操作対象の移動量を大きくするようにしてもよいし、角度差が所定値以上になったときにのみ操作対象を移動させるようにしてもよい。また、ステップS16で算出された方向に基づいて操作対象の速度(加速度)を決定する場合には、角度差が大きくなるほど操作対象の速度(加速度)を大きくするようにしてもよい。
操作対象の移動量や速度や加速度(以下、移動量等と記載する)は、ステップS16で算出された方向に基づいて決定されてもよいし、当該方向に基づいて操作対象の移動方向が決定される場合には、予め決められた量に決定されてもよい。ステップS16で算出された方向に基づいて操作対象の移動量等が決定される場合、当該移動量等は、ステップS16で算出された方向を示すベクトルのみに基づいて決定されてもよいし、当該ベクトルと上記基準方向を表すベクトルとの角度差に基づいて決定されてもよいし、当該ベクトルと前回のフレームにおけるベクトルとの角度差に基づいて決定されてもよい。より具体的には、当該ベクトルの方向と、当該ベクトルがその方向を向くときに操作対象が移動すべき移動量との対応を予め定めておき、当該対応に基づいてベクトルから操作対象の移動量を算出してもよい。また、当該ベクトルと基準方向を表すベクトルとのなす角度(角度差)を算出し、角度差が大きいほど操作対象の移動量が大きくなるように移動量を算出するようにしてもよい。また、前回のフレームにおけるベクトルと今回のフレームにおけるベクトルとのなす角度(角度差)を算出し、角度差が大きいほど操作対象の移動量が大きくなるように移動量を算出するようにしてもよい。
ステップS3において、ゲーム装置3は、以上のように算出された移動量等に従って操作対象の移動後の位置を決定する。ステップS3で決定された操作対象の移動後の位置を示すデータは、位置データ59としてメインメモリ13に記憶される。
図12の説明に戻り、ステップS3の次のステップS4において、表示処理が実行される。CPU10は、メインメモリ13に記憶されている操作対象データ58を参照し、ステップS3で決定された位置に応じた画像を生成する。そして、生成した画像をモニタ2の画面に表示させる。例えば、操作対象が画面に表示されるオブジェクトである場合、ステップS3で決定された位置にオブジェクトを表示させる。また例えば、操作対象が仮想カメラである場合、ステップS3で決定された位置に設定された仮想カメラから見たゲーム空間の画像を生成して当該画像を表示させる。また例えば、操作対象がウィンドウ内の画像である場合、当該ウィンドウに表示可能な画像領域全体のうちで、ステップS3で決定された領域をウィンドウ内に表示させる。1フレーム毎にステップS4の処理が繰り返し実行されることによって、操作対象が移動している様子を表す動画を表示することができる。
ステップS5において、ゲームを終了するか否かが判定される。ゲームを終了する条件としては、例えば、ゲームオーバーとなる条件(例えば、プレイヤキャラクタの体力を示すパラメータが0になったこと等)が満たされたことや、プレイヤがゲームを終了する操作を行ったこと等が考えられる。ゲームを終了しないと判定された場合、ステップS1の処理が再度実行され、以降、ステップS5でゲームを終了すると判定されるまでステップS1〜S5の処理が繰り返し実行される。一方、ゲームを終了すると判定された場合、CPU10は、図12に示すゲーム処理を終了する。
以上のように、本実施形態によれば、撮像情報演算部35によって撮像された撮像画像から、コントローラ7の前後方向を軸とした回転に関するコントローラ7の姿勢に対応した値を算出することができる。そして、当該コントローラ7の姿勢に基づいて操作対象に移動動作を行わせることができる。これによって、プレイヤは、コントローラ7を前後方向の軸周りに回転させるゲーム操作を行うことによって、コントローラ7の回転に応じた移動動作を操作対象に行わせることができる。したがって、ゲーム装置3は、コントローラ7を回転させることによって操作対象に移動を行わせるという、新たなゲーム操作をプレイヤに行わせることが可能となる。
なお、本発明では、コントローラ7の指示方向を軸とした回転を算出するためには、ゲーム装置3は、少なくとも方向を示す情報を撮像画像から得ることができればよい。したがって、画像処理回路41は、上記2つの位置の座標値を出力することに代えて、方向を示す情報を出力するようにしてもよい。具体的には、画像処理回路41は、マーカ8aの画像の位置からマーカ8bの画像の位置への方向(マーカ8bの画像の位置からマーカ8aの画像の位置への方向であってもよい)を示すベクトルのデータを算出するようにしてもよい。さらに、このベクトルは方向を示すベクトルであればよいので、画像処理回路41は、大きさが一定の単位ベクトルのデータを出力するようにしてもよい。
また、他の実施形態においては、撮像情報演算部35が画像処理回路41を含まない構成であってもよい。このとき、撮像情報演算部35は、撮像画像の画像データをマイコン42に出力し、当該画像データが操作データとしてコントローラ7からゲーム装置3へ送信されることとなる。このとき、ゲーム装置3は、上記方向データを当該画像データに基づいて算出する。以上のように、撮像画像の画像データから方向データを算出する処理は、その一部の処理が専用の回路(画像処理回路41)によって行われてもよいし、その全部が当該回路に行われてもよいし、その全部がゲーム装置3によってソフトウェア処理として行われてもよい。
また、上述した実施形態では、赤外光を出射する2つのマーカ8aおよび8bを撮像対象としたが、他のものを撮像対象にしてもかまわない。撮像対象は、その画像を撮像した場合に方向を検出することができるものであればよく、例えば、3つ以上のマーカを撮像対象としてもよいし、方向を検出することができる1つのマーカを撮像対象としてもよい。なお、1つのマーカを撮像対象とする場合、方向を検出することができる必要があるので、円形のマーカは適切ではなく、直線状の形状等、その形状から所定の2点を特定することができる形状であることが好ましい。このとき、ゲーム装置3は、撮像対象の所定の2点を結ぶ方向を算出することによって、撮像画像内における対象画像の方向を算出することができる。また、マーカは、発光体であることが好ましいが、赤外光を出射するものに限らず、他の波長の光を出射するものであってもよいし白色光を出射するものであってもよい。さらに、モニタ2の画面の枠を撮像対象としてもよいし、撮像対象を画面に表示するようにしてもよい。これによれば、マーカをモニタと別に用意する必要がなく、システムの構成を簡略化することができる。
なお、他の実施形態においては、コントローラ7が操作可能範囲から外れた場合、加速度センサの出力を用いて操作対象を移動させるようにしてもよい。具体的には、図13のステップS11の判定結果が否定であった場合、ステップS12に代えて、加速度センサの出力を用いて、コントローラ7の指示方向を軸とした回転状態を検出する処理を実行するようにする。この処理においては、CPU10は、操作データに含まれる加速度を示すデータを参照して、コントローラ7の当該回転状態を検出する。そして、ステップS3の移動処理においては、上記処理によって検出された回転状態に応じて操作対象を移動させる。これによって、コントローラ7が操作可能範囲から外れた場合であっても、操作対象を移動させる操作を継続することができる。また、コントローラ7が操作可能範囲から外れ、コントローラ7の姿勢が変わった状態で再び操作可能範囲内に入った場合にも、加速度センサの出力によって、コントローラ7の姿勢が判断できるため、2つのマーカがそれぞれどちらのマーカであるか識別が可能となる。
なお、上記の実施形態は、コントローラ7を用いて指示方向を軸とした回転操作を行って遊ぶ種々のゲームに適用することが可能である。以下では、具体的なゲーム例を実施例として説明する。
(第1実施例)
以下、第1実施例として、ゲームのメニュー画面において本発明を適用した実施例について説明する。ここでは、プレイヤによって操作されるプレイヤキャラクタがゲーム空間に登場するゲームを例として説明する。図17は、第1実施例におけるゲーム画面の一例を示す図である。図17においては、モニタ2の画面にウィンドウ71および72が表示されている。ウィンドウ71および72は、メニュー画面の画像(メニュー画像)を表示するための表示領域である。ウィンドウ71および72は、プレイヤが所定の操作(例えば、Yボタン32cを押下する操作)を行うことによって表示される。また、図17においてはカーソル73が表示される。プレイヤは、コントローラ7を操作することによって画面上においてカーソル73を自由に移動させることができる。なお、図17では図示していないが、ウィンドウ71および72以外の表示領域には、通常のゲーム画像(例えば、プレイヤキャラクタ付近のゲーム空間の画像)が表示される。
ウィンドウ71内には、プレイヤキャラクタが使用するアイテムをプレイヤが選択するためのメニュー画面が表示される。図17においては、ウィンドウ71内には、選択可能なアイテムを示す項目74a〜74cが表示されている。図18は、ウィンドウ72に表示可能なメニュー画像と、メニュー画像のうちで実際に表示される領域との関係を示す図である。図18に示すように、メニュー画像77の大きさはウィンドウ71の表示領域78よりも大きく、ウィンドウ71内にはメニュー画像77の一部が表示されることとなる。メニュー画像77には、項目を示す画像(項目画像)74a〜74fが合計6つ含まれ、一度に全ての項目画像をウィンドウ71内に表示させることはできない。プレイヤは、ウィンドウ71内のメニュー画像を上下方向にスクロールさせることによって、メニュー画像77内の全ての領域を表示させる。なお、ウィンドウの表示領域(実際に表示される領域)78の位置は、メニュー画像の最上部から表示領域78の最上部までの長さsによって表される。
なお、ウィンドウ71の右端のスクロールバー75およびスクロールつまみ76は、メニュー画像のうちのどの部分がウィンドウ71内に表示されているかを示す。図17においては、スクロールバー75の最上部にスクロールつまみ76が位置しているので、メニュー画像のうちの最上部がウィンドウ71内に表示されていることがわかる。なお、図17には示していないが、ウィンドウ72もウィンドウ71と同様、その内側領域に項目が表示される。
第1実施例においては、プレイヤは、コントローラ7自体を操作することによって、ウィンドウ内に表示されている画像をスクロールさせることができる。具体的には、指示方向を軸としてコントローラ7を回転させる操作(回転操作)を行うことによって、ウィンドウ内に表示されている画像を上下方向にスクロールさせることができる。
図19は、回転操作によるウィンドウ内の画像の変化を説明するための図である。図19は、コントローラ7の状態と、コントローラ7が当該状態にあるときに得られる撮像画像と、コントローラ7が当該状態にあるときに表示されるウィンドウ71内の画像との対応を示している。
図19に示す状態Aは、コントローラ7の上面が上方向を向いている状態である。この状態Aにおける撮像画像I7において、各マーカ8aおよび8bの画像8a’および8b’は水平に位置している(y軸方向の座標が同じ値になる)。このとき、ウィンドウ71内の画像には、項目画像74b〜74dが含まれているとする。
図19に示す状態Bは、コントローラ7を状態Aから左回りに所定角度回転させた状態である。この状態Bにおける撮像画像I8において、各画像8a’および8b’は、状態Aから右回りに上記所定角度回転した状態となる。このとき、ウィンドウ71内の画像には、項目画像74c〜74eが含まれる。すなわち、ウィンドウ71内の画像が上方向にスクロールされる(表示領域が下方向にスクロールされる)。このように、プレイヤは、コントローラ7を左回りに回転させることによってウィンドウ71内の画像を上方向にスクロールさせることができる。また、図19に示す状態Cは、コントローラ7を状態Aから右回りに所定角度回転させた状態である。この状態Cにおける撮像画像I9において、各画像8a’および8b’は、状態Aから左回りに上記所定角度回転した状態となる。このとき、ウィンドウ71内の画像には、項目画像74a〜74cが含まれる。すなわち、ウィンドウ71内の画像が下方向にスクロールされる(表示領域が上方向にスクロールされる)。このように、プレイヤは、コントローラ7を右回りに回転させることによってウィンドウ71内の画像を下方向にスクロールさせることができる。
また、プレイヤは、コントローラ7による指示位置を変化させることで、カーソル73を画面上で移動させることができる。つまり、ゲーム装置3は、コントローラ7の位置や姿勢に応じて、コントローラ7による指示位置を決定し、当該指示位置にカーソル73を表示する。
なお、プレイヤは、カーソル73によって操作対象となるウィンドウ(画像をスクロールさせるウィンドウ)を指定することができる。具体的には、カーソル73によっていずれかのウィンドウを指定すると(カーソル73をウィンドウの位置に移動すると)、指定されたウィンドウが一番手前に表示される。そして、カーソル73がウィンドウを指定した状態で上記回転操作を行うと、当該ウィンドウ内の画像がスクロールする。したがって、プレイヤは、複数のウィンドウが表示されている場合であっても、コントローラ7を用いて操作対象となるウィンドウを容易に指定することができ、さらに、指定したウィンドウ内の画面をコントローラ7を用いたまま容易にスクロールさせることができる。
次に、第1実施例におけるゲーム処理の詳細を説明する。図20は、第1実施例におけるゲーム装置3のメインメモリ13に記憶される主なデータを示す図である。第1実施例においては、図11に示したデータに加え、前方向データ60および中点データ61が操作状態データ56としてメインメモリ13に記憶される。また、対象識別データ62が操作対象データ58としてメインメモリ13に記憶される。
前方向データ60は、1フレーム前に算出された方向データである。すなわち、新たに方向データが算出されたとき、それまでの方向データ57が前方向データ60として記憶される。そして、新たに算出された方向データが新たな方向データ57としてメインメモリ13に記憶される。前方向データ60は、ウィンドウ内の画像をスクロールさせる量を算出するために用いられる。
また、中点データ61は、第1座標と第2座標との中点の座標を示す。マーカ8aおよび8bの画像を1つの対象画像としてみた場合、中点データ61は、対象画像の位置を示すと言える。中点データ61は、コントローラ7による指示位置、すなわち、カーソル73の画面上の位置を算出するために用いられる。
また、対象識別データ62は、カーソル73によって現在指定されているウィンドウを識別するためのデータであり、具体的には、各ウィンドウに予め付された番号を示す。なお、カーソル73がいずれのウィンドウも指定していない場合、いずれのウィンドウも指定されていないことを示すデータが対象識別データ62として記憶される。
なお、第1実施例において、位置データ59は、現在指定されているウィンドウの表示領域78の位置を示す。すなわち、位置データ59は、メニュー画像の最上部から表示領域78の最上部までの長さsを示す。
図21は、第1実施例におけるゲーム処理の流れを示すフローチャートである。なお、図21において、図12に示すゲーム処理のステップと同様のステップについては図12と同じステップ番号を付し、詳細な説明を省略する。図21に示すフローチャートが開始されるまでの処理は、図12に示した場合と同様である。
第1実施例におけるゲーム処理においては、まずステップS21において、初期処理が実行される。初期処理においては、CPU10は、初期状態のゲーム画面を表示させる。具体的には、仮想のゲーム空間が構築され、プレイヤキャラクタが所定の初期位置に配置される。そして、プレイヤキャラクタ周辺のゲーム空間の画像が生成されてモニタ2に表示される。
ステップS21の次に上述のステップS1の処理が実行され、ステップS1の次にステップS22の処理が実行される。すなわち、ステップS22において、メニュー表示モードに設定されているか否かが判定される。ここで、第1実施例におけるゲームでは、プレイヤがプレイヤキャラクタを操作してゲームを進行するゲームモードと、ゲームに関する設定等を変更するためのメニュー画像を表示するメニュー表示モードという2つのモードが用意されているとする。2つのモードは、例えばYボタン32cを押下する操作をプレイヤが行うことによって切り替えられる。また、本実施例では、メニュー表示モードに移行すると複数のウィンドウが表示されるものとするが、他の実施例では、メニュー表示モードの移行時には1つのウィンドウのみが表示され、ウィンドウ内の項目をプレイヤが選択することによって新たなウィンドウが表示されるようにしてもよい。なお、図21に示すフローチャートには示していないが、モードを切り替える処理は適宜のタイミングで実行される。ステップS22において、CPU10は、現在のモードがゲームモードであるかメニュー表示モードであるかを判定する。現在のモードがメニュー表示モードである場合、ステップS2の処理が実行され、現在のモードがゲームモードである場合、ステップS23の処理が実行される。
なお、ステップS23においては、プレイヤのゲーム操作に応じたゲーム処理が実行される。例えば、プレイヤキャラクタに所望の動作を行わせたり、ゲーム空間に敵キャラクタが登場する場合には、敵キャラクタの動作の制御が行われたりする。ステップS23の後、ステップS4の処理が実行される。
一方、ステップS2においては、操作状態算出処理が実行される。図22は、第1実施例におけるステップS2の詳細を示すフローチャートである。なお、図22において、図13に示すゲーム処理のステップと同様のステップについては図13と同じステップ番号を付し、詳細な説明を省略する。
図22において、ステップS11〜S16までの処理は、図13に示した処理と同じである。第1実施例においては、ステップS16の次のステップS31において、対象画像である第1座標および第2座標の中点の位置が算出される。具体的には、CPU10は、現在第1座標データ51および現在第2座標データ52を参照して、当該中点の座標を算出する。算出された中点の座標のデータは、中点データ61としてメインメモリ13に記憶される。この中点データ61は、撮像画像内における対象画像(マーカ8aおよび8b)の位置を示している。
続くステップS32において、ステップS31で算出された中点座標が補正される。図23は、図22に示すステップS32の処理を説明するための図である。図23は、コントローラの状態と、その状態にあるときに得られる撮像画像との対応を示している。図23において、状態Aおよび状態Bはともに、モニタ2の画面の中央がコントローラ7による指示位置となっている状態である。ただし、状態Aはコントローラ7の上面が上方向を向いている状態(本実施形態では、この状態を基準状態とする。)であり、状態Bはコントローラ7の上面が右方向を向いている状態である。ここで、マーカ8aおよび8bは画面の上方に配置されており、マーカ8aおよび8bの配置位置が指示位置(画面の中央の位置)と一致しない。そのため、状態Aにおいては、撮像画像における対象画像の位置は撮像画像の中心から上方の位置となる。一方、状態Bにおいては、撮像画像内における対象画像の位置は撮像画像の中心から左方の位置となる。このように、コントローラ7が同じ指示位置を指し示していても、撮像画像内における中点Pmの位置はコントローラ7の姿勢によって異なる。すなわち、マーカ8aおよび8bの配置位置が指示位置(画面の中央の位置)と一致しないことから、コントローラ7の指示方向を軸とした回転角度によって、撮像画像内における対象画像の位置が変化してしまう。そのため、対象画像の位置を単に算出する処理(ステップS31)だけでは、対象画像の位置に基づいて指示位置を正確に算出することができない。
そこで、ステップS32においては、ステップS16で算出された方向に基づいて、ステップS31で算出された中点座標を補正する。具体的には、ステップS31で算出された中点座標を、コントローラ7が基準状態にあるとした場合における中点座標に補正する。より具体的には、ステップS31で算出された中点座標を、ステップS16で算出された方向と基準状態における方向との角度差に応じた量だけ、撮像画像の中心を軸として回転移動させる。図23の状態Bにおいては、ステップS16では、基準状態から左方向に90°に傾いた方向のベクトルが算出されるので、コントローラ7が基準状態から右方向に90°に傾いた状態であることがわかる。したがって、ステップS32では、ステップS31で算出された中点座標を、撮像画像の中心を軸として右方向に90°だけ回転移動させる。以上のステップS32によって補正が行われた中点座標のデータは、中点データ61としてメインメモリ13に更新して記憶される。ステップS32による補正が行われた中点座標によって、ゲーム装置3は、コントローラ7による指示位置を算出することができる。以上のステップS32の処理の後、CPU10は操作状態算出処理を終了する。
図21の説明に戻り、ステップS2の次にステップS24の処理が実行される。すなわち、ステップS24において、カーソル73の画面上の位置が算出される。具体的には、CPU10は、操作状態算出処理のステップ32で得られた中点データに基づいて、カーソル73の画面上の位置を算出する。すなわち、中点座標を表す座標系(xy座標系)の座標値から、画面上の位置を表す座標系の座標値を算出する。カーソル73の画面上の位置は、中点座標をモニタ2の画面上の座標に変換する関数を用いて算出される。この関数は、ある撮像画像から算出される中点座標の値を、当該撮像画像が撮像される時のコントローラ7によって指し示される画面上の位置(指示位置)を表す座標に変換するものである。この関数によって、中点座標から画面上の指示位置を算出することができる。
続くステップS25において、カーソル73によっていずれかのウィンドウが指定されているか否かが判定される。CPU10は、ステップS24で算出したカーソル73の位置がいずれかのウィンドウ内の位置であるか否かを判定する。判定の結果、算出された位置がいずれかのウィンドウ内の位置である場合、いずれかのウィンドウが指定されていると判断されてステップS3の処理が実行される。なお、この場合、指定されていると判断されたウィンドウが操作対象として設定される。すなわち、指定されていると判断されたウィンドウを示すデータが対象識別データ62としてメインメモリに記憶される。一方、算出された位置がいずれかのウィンドウ内の位置でない場合、いずれのウィンドウも指定されていないと判断されてステップS4の処理が実行される。
ステップS3においては、移動処理が実行される。第1実施例における移動処理では、ウィンドウ内に表示されるメニュー画像を操作対象として、コントローラ7の回転操作に従ってメニュー画像がスクロールされる。以下、移動処理の詳細を説明する。
図24は、第1実施例における移動処理の詳細を示すフローチャートである。移動処理においては、まずステップS33において、今回の方向と前回の方向との角度差が算出される。ここで、「今回の方向」とは、今回のフレームで算出された対象画像の方向、すなわち、今回のフレームにおけるステップS16で算出された方向であり、メインメモリ13に記憶されている方向データ57により示されるベクトル(第1ベクトルと呼ぶ)の方向である。また、「前回の方向」とは、前回のフレームで算出された対象画像の方向、すなわち、前回のフレームにおけるステップS16で算出された方向であり、メインメモリ13に記憶されている前方向データ60により示されるベクトル(第2ベクトルと呼ぶ)の方向である。具体的には、CPU10は、第1ベクトルと第2ベクトルとのなす角度(角度差)θを算出する。当該角度差θは、−180°<θ≦180°の範囲で表されるものとする。また、角度差θは、第2ベクトルを基準として右回りする方向を正とし、左回りする方向を負とする。角度差θが正であることは、撮像画像が右回りに回転していることであり、コントローラ7が指示方向を軸として左回りに回転していることを表す(図19に示す状態B)。逆に、角度差θが負であることは、撮像画像が左回りに回転していることであり、コントローラ7が指示方向を軸として右回りに回転していることを表す(図19に示す状態C)。
ステップS33の次のステップS34において、ステップS33で算出された角度差に基づいてメニュー画像のスクロール量が算出される。スクロール量は、角度差θが正であれば正となり、角度差θが負であれば負となるように決定される。さらに、角度差θの絶対値が大きいほどスクロール量の絶対値が大きくなるように決定される。典型的には、スクロール量は角度差θに正比例するように決定される。
ステップS34の次のステップS35において、ステップS34で算出されたスクロール量に従って表示領域が移動される。すなわち、メニュー画像の最上部から表示領域の最上部までの長さ(図18に示す長さs)が、スクロール量に従って変更される。具体的には、CPU10は、当該長さにスクロール量を加算することによって変更後の長さを算出する。このとき、メインメモリ13に記憶されている位置データ59の内容は、算出された変更後の長さを示す値に更新される。後述するステップS4の表示処理においては、更新後の長さに従った位置に表示領域が設定されて、表示領域内のメニュー画像がウィンドウ内に表示される。これによって、メニュー画像がスクロール(移動)して画面に表示されることとなる。以上のステップS35の後、CPU10は移動処理を終了する。
図21の説明に戻り、ステップS3の次のステップS26では、ウィンドウ内の項目を選択する操作がプレイヤによって行われたか否かが判定される。CPU10は、ステップS1で取得した操作データを参照することによって、当該操作(例えば、Aボタン32iを押下する操作)が行われたか否かを判定する。判定の結果、当該操作が行われた場合、ステップS27の処理が実行される。一方、当該操作が行われていない場合、ステップS27およびS28の処理がスキップされてステップS4の処理が実行される。
ステップS27において、カーソル73によって項目が指定されているか否かが判定される。具体的には、CPU10は、ステップS25で算出された画面上の位置が、項目画像が表示される位置であるか否かを判定する。判定の結果、当該画面上の位置が項目画像の表示位置である場合、ステップS28の処理が実行される。一方、当該画面上の位置が項目画像の表示位置でない場合、ステップS28の処理がスキップされてステップS4の処理が実行される。以上のステップS26およびS27の処理は、カーソル73が項目画像を指定した状態で項目選択操作が行われたか否かを判定するための処理である。ステップS26およびS27の判定結果がともに肯定であった場合、CPU10は、項目が選択されたと判断して、ステップS28において項目に応じたゲーム処理を実行する。
ステップS28においては、選択された項目に応じた処理が実行される。例えば、図17に示すウィンドウ71内の項目画像74aが選択された場合には、CPU10は、プレイヤキャラクタに剣を使用可能な状態にするべく、プレイヤキャラクタに関するデータや、プレイヤキャラクタの画像データ等を変更する。ステップS28の次にステップS4の処理が実行される。
ステップS4においては、表示処理が実行される。すなわち、今回のフレームにおいてステップS3の移動処理が実行されている場合には、更新後の位置データ59の内容に従った表示領域でメニュー画像がウィンドウ内に表示される。このとき、カーソル73は、ステップS25で算出された画面上の位置に表示される。ステップS4の次のステップS5の処理は、図11と同様である。
以上のように、第1実施例によれば、方向データ57により示される2次元ベクトルと、画面上の指示位置を示す座標とを用いた演算によって操作対象(ウィンドウ内の画像)を移動させる。これによって、コントローラ7自体を回転させる操作によって、ウィンドウの表示内容をスクロールすることができる。さらに、コントローラ7による指示位置を変更する操作によって、カーソル73を画面上で移動させ、操作対象となるウィンドウを指定することができる。つまり、第1実施例によれば、操作対象となるウィンドウを指定する操作と、ウィンドウの表示内容をスクロールさせる操作という2種類の異なる操作を、コントローラ7自体を操作することによって行うことができ、コントローラ7を用いた従来にはない操作方法を実現することができる。
なお、上記第1実施例では、コントローラ7によって画面上の位置を指定することによって、操作対象となるウィンドウを選択するようにした。ここで、他の実施例では、画面上の位置を指定する方法は、どのような方法であってもよい。例えば、コントローラ7に設けられた十字キーによってカーソルを移動させるようにしてもよい。
また、第1実施例では、ゲーム中に表示されるメニュー画像のウィンドウを例として説明した。ここで、他の実施例においては、スクロールの対象となるウィンドウは、ゲーム用途のウィンドウに限らず、例えば、パーソナルコンピュータのデスクトップ画像に重ねて表示されるウィンドウ等であってもよい。すなわち、本発明は、一般的なパーソナルコンピュータについても適用することができ、例えば、ブラウザのウィンドウ内の画像をスクロールすることについても適用することができる。
なお、コントローラ7の回転操作は、所定のボタン操作(例えば、Bボタン32dを押下する操作)が行われている間のみ実行可能であるようにしてもよい。図25は、第1実施例の変形例における移動処理の詳細を示すフローチャートである。図25に示す処理は、ステップS36の処理が実行される点で図24に示す処理と異なる。
図25においては、まずステップS36において、所定のボタンが押下されているか否かが判定される。CPU10は、ステップS1で取得した操作データを参照することによって、当該操作(例えば、Bボタン32dを押下する操作)が行われたか否かを判定する。判定の結果、当該操作が行われた場合、ステップS33〜S35の処理が実行される。一方、当該操作が行われていない場合、ステップS33〜35の処理がスキップされて、CPU10は移動処理を終了する。
以上のように図25に示した処理によれば、Bボタン32dが押下されていない場合には、表示領域の移動(メニュー画像のスクロール)が行われない。つまり、プレイヤは、Bボタン32dを押下した状態で指示方向を軸としてコントローラ7を回転させた場合にのみ、ウィンドウ内の表示内容をスクロールさせることができる。ここで、Bボタン32dが押下されているか否かにかかわらず、表示領域の移動が行われる場合(図24に示す移動処理の場合)、コントローラ7が少し回転しただけでウィンドウ内の表示内容がスクロールすることとなる。したがって、指示位置を変更する操作(コントローラ7の指示方向を変更する操作)を行う場合のように、プレイヤが回転操作を行う意図がない場合でも、プレイヤが意図しないにもかかわらず、ウィンドウ内の表示内容がスクロールしてしまうおそれがある。
これに対して、Bボタン32dが押下されていることを条件として表示領域の移動が行われる場合(図24に示す移動処理の場合)には、プレイヤが意図する場合のみ、ウィンドウ内の表示内容をスクロールさせることができる。つまり、プレイヤは、ウィンドウ内の表示内容をスクロールさせたい場合、Bボタン32dが押下しながら回転操作を行えばよい。以上のように、図25に示した処理によれば、プレイヤが意図しないにもかかわらず回転操作が行われてしまうことを防止することができる。
また、他の実施形態によれば、ステップS33で算出された角度差θの絶対値が所定値よりも小さい場合、ステップS34においてスクロール量を0としてもよい。つまり、角度差θが微少であれば、操作対象を移動させないようにしてもよい。ゲームの種類や状況によっては、操作対象を一定の姿勢で維持することをプレイヤが望む場合も考えられ、このような場合、操作対象の移動がコントローラ7の回転角度に敏感に反応してしまうと、操作性がかえって悪くなるからである。以上のように、コントローラ7の回転操作においていわゆる遊びの部分を設定することによって操作性を向上することができる。
なお、上記第1実施例においては、ゲーム装置3は、対象画像(マーカ8aおよび8b)の2つの位置を示すデータを操作データとしてコントローラ7から取得し、2つの位置の中点を算出することによって撮像対象の画像の位置を特定した。ここで、他の実施例においては、コントローラ7が中点の位置を算出し、算出された中点の位置を示すデータをゲーム装置3に操作データとして送信するようにしてもよい。つまり、ゲーム装置3は、対象画像の位置を示すデータを操作データとしてコントローラ7から取得するようにしてもよい。さらに、他の実施例では、ゲーム装置3は、コントローラ7から撮像画像の画像データを取得し、画像データから対象画像の位置を算出するようにしてもよい。画像データから対象画像の位置を算出する方法としては、第1実施例と同様、対象画像の2つの位置(マーカ8aおよび8bの位置)を画像データから特定し、当該2つの位置の中点を算出する方法が考えられる。
(第2実施例)
以下、第2実施例として、プレイヤキャラクタを移動する操作に本発明を適用した実施例について説明する。ここでは、プレイヤによって操作されるプレイヤキャラクタが3次元のゲーム空間を移動するゲームを例として説明する。図26は、第2実施例におけるゲーム画面の一例を示す図である。図26においては、3次元の仮想のゲーム空間およびゲーム空間内に存在するプレイヤキャラクタ81がモニタ2の画面に表示されている。また、画面にはカーソル82が表示されている。プレイヤキャラクタ81は、プレイヤによって操作されるキャラクタであり、コントローラ7の回転操作による操作対象である。カーソル82は、上記第1実施例と同様、コントローラ7による指示位置に表示される。
第2実施例においては、プレイヤは、コントローラ7の回転操作によってプレイヤキャラクタ81を移動させることができる。プレイヤキャラクタ81を移動させる際、プレイヤは、まず、移動させたい方向にカーソル82を移動させる。カーソルを移動させる操作は上記第1実施例と同様である。次に、プレイヤは、移動させたい方向にカーソル82を配置した状態で、コントローラ7の回転操作を行う。例えば図26に示す状態でコントローラ7の回転操作が行われると、プレイヤキャラクタ81は、カーソル82によって指示される位置に向かって移動する(図27参照)。
また、プレイヤは、コントローラ7を回転させる方向によって、プレイヤキャラクタ81を前進させたり後退させたりすることができる。つまり、コントローラ7を回転させる方向によって、プレイヤキャラクタ81の移動方向を制御することができる。図28は、回転操作によるプレイヤキャラクタ81の移動動作を説明するための図である。図28は、コントローラ7の状態と、コントローラ7が当該状態にあるときに行われるプレイヤキャラクタ81の移動動作との対応を示している。なお、図28においてはコントローラ7を後方(図3に示すZ軸負方向側)から見た図を示している。
図28に示す状態Aは、コントローラ7の上面が真上方向を向いている状態である。この状態Aにおいて撮像される撮像画像は、図19に示す撮像画像I7のようになる。すなわち、各マーカ8aおよび8bの画像8a’および8b’はy軸と水平に配置される。図28においては、この状態Aを基準状態とする。また、基準状態における撮像画像から算出される対象画像の方向を基準方向と呼ぶ。すなわち、図28における基準方向は、マーカ8aの画像8a’からマーカ8b’の画像8b’への方向(またはその逆方向)である。コントローラ7が基準状態にあるとき、プレイヤキャラクタ81は移動しない(停止する)。なお、詳細は後述するが、プレイヤは、基準方向を設定することができる。
図28に示す状態Bは、コントローラ7を基準状態から左回りに所定角度回転させた状態である。この状態Bにおいて撮像される撮像画像は、図19に示す撮像画像I8のようになる。すなわち、各画像8a’および8b’は、状態Aから右回りに上記所定角度回転した状態となる。このとき、プレイヤキャラクタ81はカーソル82によって指示される位置に向かって前進する。一方、図28に示す状態Cは、コントローラ7を基準状態から右回りに所定角度回転させた状態である。この状態Cにおいて撮像される撮像画像は、図19に示す撮像画像I9のようになる。すなわち、各画像8a’および8b’は、状態Aから左回りに上記所定角度回転した状態となる。このとき、プレイヤキャラクタ81は、現在位置からカーソル82によって指示される位置への方向を前方向とすると、後退する。以上のように、プレイヤは、コントローラ7を左回り/右回りに回転させることによってプレイヤキャラクタ81を前進/後退させることができる。
次に、第2実施例におけるゲーム処理の詳細を説明する。図29は、第2実施例におけるゲーム装置3のメインメモリ13に記憶される主なデータを示す図である。第2実施例においては、図11に示したデータに加え、第1実施例において説明した中点データ61が操作状態データ56としてメインメモリ13に記憶される。また、基準方向データ63がメインメモリ13に記憶される。さらに、移動方向データ64が操作対象データ58としてメインメモリ13に記憶される。
基準方向データ63は、上記基準方向を示すデータである。基準方向は、撮像画像から得られる方向に関して基準となる方向である。基準方向は、プレイヤキャラクタ81の移動量および移動方向を決定する際に用いられる。具体的には、プレイヤキャラクタ81の移動量および移動方向は、基準方向と現在の方向(方向データ57により示される方向)との角度差に基づいて決定される。なお、第2実施例においては、基準方向はゲーム開始時にプレイヤによって設定されるものとする。
移動方向データ64は、操作対象であるプレイヤキャラクタ81の3次元ゲーム空間における移動方向を示す。具体的には、移動方向データ64は、3次元ゲーム空間における方向を示す3次元のベクトルのデータである。なお、第2実施例における位置データ59は、3次元ゲーム空間におけるプレイヤキャラクタ81の位置を示す3次元の座標値のデータである。
図30は、第2実施例におけるゲーム処理の流れを示すフローチャートである。なお、図30において、図12に示すゲーム処理のステップと同様のステップについては図12と同じステップ番号を付し、詳細な説明を省略する。図30に示すフローチャートが開始されるまでの処理は、図12に示した場合と同様である。
第2実施例におけるゲーム処理においては、まずステップS41において、基準方向を設定する処理が実行される。具体的には、CPU10は、基準方向を設定する旨の操作を行うことを表示等によりプレイヤに促す。これに応じて、プレイヤは、指示方向を軸とした回転に関して任意の姿勢でコントローラ7を把持し、基準方向を決定する操作(例えば、Aボタン32iを押下する操作)を行う。当該操作が行われると、CPU10は、当該操作が行われた時点において撮像された撮像画像に基づいて、ステップS16と同様の処理によって方向を算出する。算出された方向を示すベクトルのデータは、基準方向データ63としてメインメモリ13に記憶される。第3実施例においては、以上のステップS51の処理が、プレイヤキャラクタ81を移動させる処理(ステップS3)の前に実行される。ステップS41の次にステップS42の処理が実行される。
ステップS42において、初期処理が実行される。この初期処理においては、3次元の仮想ゲーム空間が構築されてモニタ2に表示される。具体的には、CPU10は、3次元の仮想ゲーム空間を構築し、当該ゲーム空間内にプレイヤキャラクタ81や敵キャラクタ等を配置する。また、当該ゲーム空間内における所定位置に所定の視線方向で仮想カメラを設定し、仮想カメラから見たゲーム空間の画像を生成してモニタ2に表示する。なお、ここでは、仮想カメラの位置および視線方向は、プレイヤキャラクタ81が画面に表示されるように自動的に制御されるものとする。
ステップS42の次に、第1実施例と同様のステップS1の処理が実行される。続くステップS2の操作状態算出処理も、第1実施例における操作状態算出処理と同様である。すなわち、操作状態算出処理によって、操作状態データ56が算出され、方向データ57および中点データ61がメインメモリ13に記憶される。ステップS2の次にステップS3の処理が実行される。
ステップS3においては、移動処理が実行される。第2実施例における移動処理では、プレイヤキャラクタ81を操作対象として、コントローラ7の回転操作に従ってプレイヤキャラクタ81が移動される。以下、移動処理の詳細を説明する。
図31は、第2実施例における移動処理の詳細を示すフローチャートである。移動処理においては、まずステップS44において、ステップS16で算出された方向と基準方向との角度差が算出される。具体的には、CPU10は、メインメモリ13に記憶されている基準方向データ63により示されるベクトル(第2実施例において基準ベクトルと呼ぶ)と、操作状態データ56の方向データ57により示されるベクトル(第2実施例において対象ベクトルと呼ぶ)とのなす角度(角度差)θ’を算出する。当該角度差θ’は、−180°<θ’≦180°の範囲で表されるものとする。また、角度差θ’は、基準ベクトルを基準として右回りする方向を正とし、左回りする方向を負とする。角度差θ’が正であることは、基準方向を基準として撮像画像が右回りに回転していることであり、コントローラ7が指示方向を軸として基準状態から左回りに回転していることを表す(図28に示す状態B)。逆に、角度差θが負であることは、基準方向を基準として撮像画像が左回りに回転していることであり、コントローラ7が指示方向を軸として基準状態から右回りに回転していることを表す(図28に示す状態C)。
ステップS44の次のステップS45において、ステップS44で算出された角度差が所定値以上であるか否かが判定される。なお、この所定値は予め定められている。ステップS44の判定において、上記角度差が所定値以上であると判定された場合、ステップS45〜S49の一連の処理が実行される。一方、上記角度差が所定値よりも小さいと判定された場合、ステップS45〜S49の一連の処理がスキップされて、CPU10は移動処理を終了する。ステップS45の判定処理は、プレイヤキャラクタ81を移動させるか否かを判定するための処理である。
ステップS46においては、ステップS18で得られた中点座標に基づいて目標位置が算出される。ここで、目標位置とは、カーソル82によって指定されるゲーム空間内における位置であり、プレイヤキャラクタ81の移動方向を決定する位置である。具体的には、CPU10はまず、中点座標から画面上の位置(2次元の座標値)を算出する。画面上の位置を算出する方法は、上記第1実施例と同様の方法である。次に、CPU10は、画面上の位置から、当該画面上の位置に対応するゲーム空間内の位置(3次元の座標値)を算出する。「画面上の位置に対応するゲーム空間内の位置」とは、その画面上の位置に表示されるゲーム空間内の位置である。算出されたゲーム空間内の位置が目標位置となる。ステップS46の次にステップS47の処理が実行される。
ステップS47において、ステップS46で算出された目標位置とプレイヤキャラクタ81の現在位置とに基づいて、プレイヤキャラクタ81の移動方向が決定される。CPU10は、現在位置を始点として、目標位置を終点とする3次元のベクトルを算出する。算出されたベクトルがプレイヤキャラクタ81の移動方向を示す。算出されたベクトルのデータは、移動方向データ64としてメインメモリ13に記憶される。ステップS47の次にステップS48の処理が実行される。
ステップS48において、ステップS44で算出された角度差に基づいてプレイヤキャラクタ81の移動量(1フレーム当たりの移動量、すなわち、速度)が算出される。ここで、移動量は、角度差θ’が正であれば正となり、角度差θ’が負であれば負となるように決定される。さらに、角度差θ’の絶対値が大きいほど移動量の絶対値が大きくなるように決定される。典型的には、移動量は角度差θ’に正比例するように決定される。ステップS48の次にステップS49の処理が実行される。
ステップS49において、プレイヤキャラクタ81の移動後の位置が算出される。プレイヤキャラクタ81の移動後の位置は、ステップS47で算出された移動方向と、ステップS48で算出された移動量とに基づいて決定される。具体的には、CPU10はまず、上記移動方向を示すベクトル(移動方向データ64により示されるベクトル)を正規化して所定の大きさの単位ベクトルを算出する。そして、算出した単位ベクトルに上記移動量を乗算したベクトルを算出する。さらに、プレイヤキャラクタ81の現在位置を基点として当該ベクトルの向きに当該ベクトルの大きさだけ移動した位置を、プレイヤキャラクタ81の移動後の位置とする。なお、移動量が正の値の場合、算出されるベクトルは単位ベクトルとは逆向きになるので、プレイヤキャラクタ81は前進する。また、移動量が負の値の場合、算出されるベクトルは単位ベクトルとは逆向きになるので、プレイヤキャラクタ81は後退する。以上のように算出された移動後の位置を示す座標値のデータは、位置データ59としてメインメモリ13に記憶される。以上のステップS49の後、CPU10は移動処理を終了する。
図30の説明に戻り、ステップS3の次のステップS43において、プレイヤキャラクタ81を移動させる処理以外の他のゲーム処理が実行される。他のゲーム処理には、例えば、プレイヤキャラクタ81に移動以外の動作(例えば、敵キャラクタを攻撃する動作)を行わせるための処理や、敵キャラクタの動作を制御する処理等が含まれる。
ステップS43の次のステップS4において、表示処理が実行される。表示処理においては、ステップS3で決定された移動後の位置に配置されたプレイヤキャラクタ81を含むゲーム空間の画像が表示される。これによって、プレイヤキャラクタ81が移動する様子が画面に表示されることとなる。ステップS4の次のステップS5の処理は、図11と同様である。
以上のように、第2実施例によれば、コントローラ7自体を回転させる操作によって、ゲーム空間内におけるプレイヤキャラクタを前進または後退させることができる。さらに、コントローラ7による指示位置を変更する操作によって、カーソル73を画面上で移動させ、プレイヤキャラクタを移動させる方向を指定することができる。つまり、第2実施例によれば、操作対象となるプレイヤキャラクタを移動させる移動量を指定する操作と、プレイヤキャラクタを移動させる方向を指定する操作という2種類の異なる操作を、コントローラ7自体を操作することによって行うことができ、コントローラ7を用いた従来にはない操作方法を実現することができる。
また、第2実施例においては、ステップS16で算出された方向と基準方向との角度差が所定値よりも小さい場合、プレイヤキャラクタの移動が行われない。したがって、コントローラ7が基準状態から多少回転した状態であっても、プレイヤキャラクタは移動しない。ここで、プレイヤキャラクタの移動がコントローラ7の回転角度に敏感に反応してしまうと、プレイヤが意図しないにもかかわらずプレイヤキャラクタが移動してしまうことがあり、操作性が悪くなることがある。また、ゲームの種類や状況によっては、操作対象を一定の姿勢で維持することをプレイヤが望む場合も考えられる。このような場合に、操作対象の移動がコントローラの回転角度に敏感に反応してしまうと、操作対象を一定の位置に維持することが困難となり、操作性が悪くなる。これに対して、第2実施例においては、コントローラ7が基準状態から多少回転した状態であってもプレイヤキャラクタは移動しないので、プレイヤが意図しないにもかかわらずプレイヤキャラクタが移動してしまうことを防止することができる。以上のように、コントローラ7の回転操作においていわゆる遊びの部分を設定することによって操作性を向上することができる。
なお、上記第2実施例においては、3次元の仮想ゲーム空間に登場するオブジェクトを操作対象としたが、ゲーム空間の画像を生成するための仮想カメラを操作対象としてもよい。すなわち、ステップS16で算出される方向に応じて、仮想カメラを上記目標位置に移動させるようにしてもよい。仮想カメラを操作対象とする場合も、図30および図31に示した処理と同様の処理によって仮想カメラを目標位置に移動させることができる。
また、上記第2実施例においては、操作対象であるプレイヤキャラクタを目標位置に向かって移動させた。ここで、他の実施例においては、プレイヤキャラクタを目標位置まで移動させるようにしてもよい。つまり、上記第2実施例ではプレイヤキャラクタを目標位置の方向へ移動させたが、他の実施例では、プレイヤキャラクタを目標位置まで移動させるようにしてもよい。このとき、目標位置の決定は、コントローラ7に設けられた所定のボタンを押下することによって実行される。すなわち、プレイヤは、コントローラ7によってカーソル73を所望の位置に移動させ、所望の位置となった時点で上記所定のボタンを押下する。ゲーム装置3は、所定のボタンが押下されたことに応じて、目標位置を決定する。そして、プレイヤキャラクタを目標位置まで移動させる。つまり、所定のボタンを押下した後でカーソル73が他の位置に移動しても、新たに目標位置が決定されない限り、プレイヤキャラクタを目標位置まで移動させる。なお、このとき、1フレーム当たりの移動量は上記角度差に応じて決定されてもよい。
(第3実施例)
以下、第3実施例として、プレイヤキャラクタを移動する操作に本発明を適用した実施例について説明する。ここでは、プレイヤがカート(プレイヤキャラクタ)を操作するレースゲームを例として説明する。図32は、第3実施例におけるゲーム画面の一例を示す図である。図32においては、レースコースである3次元の仮想のゲーム空間およびゲーム空間内に存在するカート91〜93がモニタ2の画面に表示されている。カート91は、プレイヤによって操作されるカート(プレイヤカート)であり、カート92および93は、ゲーム装置3によって動作が制御されるカートである。
第3実施例においては、プレイヤは、コントローラ7の回転操作と、コントローラ7に設けられた各操作ボタンに対する押下操作とによってプレイヤカート91を移動させることができる。具体的には、プレイヤカート91の加速度の前後方向に関する成分は、コントローラ7の回転操作によって決定される。また、加速度の左右方向に関する成分は、十字キー32aの押下操作によって決定される。なお、ここでは、加速度は、プレイヤカート91のフレーム毎の速度を決定するために用いられる変数である。プレイヤカート91は、加速度によって決められる速度に基づいて移動される。プレイヤは、コントローラ7を回転させることによってプレイヤカート91の加速度の前後方向成分を調整するとともに、十字キー32aの左右のキーを押下することによって左右方向成分を調整することによって、プレイヤカート91の移動を制御する。
図33は、回転操作によって変化するプレイヤカート91の加速度を説明するための図である。図33は、コントローラ7の状態と、コントローラ7が当該状態にあるときのプレイヤカート91の加速度(前後方向の成分)との対応を示している。なお、図33においてはコントローラ7を後方(図3に示すZ軸負方向側)から見た図を示している。
図33に示す状態Aは、コントローラ7の上面が真上方向を向いている状態からコントローラ7を左回りに所定角度θaだけ回転させた状態である。なお、第3実施例では、コントローラ7の上面が真上方向を向いている状態におけるコントローラ上面に対する鉛直上向き方向を0°とする。コントローラ7が状態Aにあるとき、プレイヤカート91の加速度は“0”と算出される。第3実施例においては、この状態Aを基準状態とする。また、基準状態における撮像画像から算出される対象画像の方向を基準方向と呼ぶ。
図33に示す状態Bは、コントローラ7を状態Aから右回りに所定角度回転させた状態である。コントローラ7が状態Bにあるとき、プレイヤカート91の加速度は“A1”と算出される。また、図33に示す状態Cは、コントローラ7を状態Bからさらに右回りに所定角度回転させた状態である。状態Cは、コントローラ7の上面が真上方向を向いている状態からコントローラ7を右回りに所定角度θbだけ回転させた状態である。コントローラ7が状態Cにあるとき、プレイヤカート91の加速度は“Amax”と算出される。ここで、Amaxは加速度の最大値である。以上のように、プレイヤカート91の加速度は、コントローラ7を状態Aから右回りに回転させるほど大きくなり、状態Cとなった時点で最大値Amaxとなるように算出される。
次に、第3実施例におけるゲーム処理の詳細を説明する。図34は、第3実施例におけるゲーム装置3のメインメモリ13に記憶される主なデータを示す図である。第3実施例においては、図11に示したデータに加え、また、基準方向データ63がメインメモリ13に記憶される。また、速度ベクトルデータ65および加速度ベクトルデータ66が操作対象データ58としてメインメモリ13に記憶される。
基準方向データ63は、上記基準方向を示すデータである。基準方向は、撮像画像から得られる方向に関して基準となる方向である。基準方向は、プレイヤカート91の加速度を算出する際に用いられる。具体的には、プレイヤカート91の加速度は、基準方向と現在の方向(方向データ57により示される方向)との角度差に基づいて決定される。なお、第3実施例においては、基準方向は予め定められているものとするが、他の実施例においては、ゲーム開始時にプレイヤによって設定されてもよい。
速度ベクトルデータ65は、プレイヤカート91の速度を示すデータである。すなわち、速度ベクトルデータ65は、プレイヤカート91の1フレーム当たりの移動方向および移動量を示す。また、加速度ベクトルデータ66は、プレイヤカート91の加速度ベクトルを示すデータである。第3実施例においては、加速度ベクトルデータ66は、プレイヤカート91の速度を算出するために用いられる。
図35は、第3実施例におけるゲーム処理の流れを示すフローチャートである。なお、図35において、図12に示すゲーム処理のステップと同様のステップについては図12と同じステップ番号を付し、詳細な説明を省略する。図35に示すフローチャートが開始されるまでの処理は、図12に示した場合と同様である。
第3実施例におけるゲーム処理においては、まずステップS51において、初期処理が実行される。この初期処理においては、3次元の仮想ゲーム空間が構築されてモニタ2に表示される。具体的には、CPU10は、3次元の仮想ゲーム空間を構築し、当該ゲーム空間内にプレイヤカート91を含む複数のカートを配置する。また、当該ゲーム空間内における所定位置に所定の視線方向で仮想カメラを設定し、仮想カメラから見たゲーム空間の画像を生成してモニタ2に表示する。なお、ここでは、仮想カメラの位置および視線方向は、プレイヤカート91が画面に表示されるように自動的に制御されるものとする。
ステップS51の次に、図12と同様のステップS1の処理が実行される。続くステップS2の操作状態算出処理も、図12に示した操作状態算出処理と同様である。すなわち、操作状態算出処理によって、操作状態データ56が算出され、方向データ57がメインメモリ13に記憶される。ステップS2の次にステップS3の処理が実行される。
ステップS3においては、移動処理が実行される。第3実施例における移動処理では、プレイヤカート91を操作対象として、コントローラ7の回転操作および十字キー32aの押下操作に従ってプレイヤカート91が移動される。以下、移動処理の詳細を説明する。
図36は、第3実施例における移動処理の詳細を示すフローチャートである。移動処理においては、まずステップS53において、ステップS16で算出された方向に基づいてプレイヤカート91の加速度の前後方向の成分が算出される。なお、角度差は、−180°より大きく180°以下の範囲で表されるものとする。また、角度差は、基準ベクトルを基準として左回りする方向を正とし、右回りする方向を負とする。つまり、角度差が正であることは、基準方向を基準として撮像画像が左回りに回転していることであり、コントローラ7が指示方向を軸として基準状態から右回りに回転していることを表す。
具体的には、CPU10はまず、基準方向とステップS16で算出された方向との角度差を算出する。次に、算出された角度差に応じた大きさとなるように加速度の前後方向成分を算出する。図33に示したように、加速度の前後方向成分Aは、0≦A≦Amaxの範囲で、角度差に応じた大きさとなるように算出される。なお、コントローラ7が状態Aよりもさらに左回りに回転した状態にある場合、すなわち、角度差が負となる場合、加速度の前後方向成分は“0”と算出される。また、コントローラ7が状態Cよりもさらに右回りに回転した状態にある場合、すなわち、角度差がθa+θbよりも大きい値となる場合、加速度の前後方向成分は“Amax”と算出される。ステップS53の次にステップS54の処理が実行される。
ステップS54において、操作キーによる操作に基づいて加速度の左右方向の成分が決定される。すなわち、CPU10は、ステップS1で取得された操作データに基づいて、十字キー32aの右方向のキーまたは左方向のキーが押下されているかを判定する。そして、右方向のキーが押下されている場合、加速度の左右方向成分の大きさを、右方向を表す所定値に決定する。一方、左方向のキーが押下されている場合、加速度の左右方向成分の大きさを、左方向を表す所定値に決定する。以上のステップS53で算出された加速度の前後方向成分とステップS54で決定された左右方向成分とを合成することによって加速度のベクトルが得られる。得られた加速度のベクトルのデータは、加速度ベクトルデータ66としてメインメモリ13に記憶される。ステップS54の次にステップS55の処理が実行される。
ステップS55において、ステップS53およびS54で算出された加速度に基づいて速度が算出される。新たな速度ベクトルは、前回のフレームにおける速度ベクトルと、ステップS53およびS54で得られた加速度ベクトルとを加算することによって得られる。すなわち、CPU10は、メインメモリ13に記憶されている速度ベクトルデータ65および加速度ベクトルデータ66を参照して、新たな速度ベクトルを算出する。そして、算出された速度ベクトルのデータを新たな速度ベクトルデータ65としてメインメモリ13に更新して記憶する。ステップS55の次にステップS56の処理が実行される。
ステップS56において、ステップS55で算出された速度に基づいて移動後の位置が算出される。すなわち、CPU10は、プレイヤカートの現在位置を基点として、上記速度ベクトルの向きに当該速度ベクトルの大きさだけ移動した位置を、プレイヤカートの移動後の位置として算出する。算出された位置のデータは、位置データ59としてメインメモリ13に更新して記憶される。CPU10は、以上のステップS56の後、移動処理を終了する。
図35の説明に戻り、ステップS3のステップS52において、他のゲーム処理が実行される。例えば、プレイヤカート以外のカートに移動動作を行わせるための処理が実行される。続くステップS4において、表示処理が実行される。表示処理においては、ステップS3で決定された移動後の位置に配置されたプレイヤカートを含むゲーム空間の画像が表示される。これによって、プレイヤカートが移動する様子が画面に表示されることとなる。ステップS4の次のステップS5の処理は、図11と同様である。
以上のように、第3実施例によれば、コントローラ7自体を回転させる操作によって、ゲーム空間内におけるプレイヤカートの加速度(速度)を変化させることができる。さらに、コントローラ7に設けられた操作ボタンを押下する操作によって、プレイヤカートの移動方向を変化させることができる。つまり、第3実施例によれば、コントローラ7自体の操作とコントローラ7に設けられた操作ボタンの操作とによって、操作対象となるプレイヤカートの移動を制御することができる。これによって、コントローラ7自体を動かす操作とそれに設けられた操作ボタンに対する操作とを組み合わせて1つの操作対象を操作するという、従来にはない操作方法を実現することができる。
なお、以上の実施例においては、回転量の一例として回転角度、すなわち方向データ57に対応したベクトルと、基準ベクトルの差を、角度差として算出したが、ベクトル同士の差分をベクトル(差分ベクトル)として算出し、当該差分ベクトルを角度差の代わりに用いてもよい。さらに、差分ベクトルの所定成分の値のみを用いて操作対象を移動させてもよい。また、他の実施例においては、基準ベクトルを用いず、方向データに対応したベクトルの値のみを用いて操作対象を移動させてもよい。例えば、方向データに対応したベクトルの値と、その値をとる場合の操作対象の位置(画面上または仮想空間上の位置)とを対応付けておくことで、当該ベクトルの値のみを用いて操作対象を移動させることができる。このようにすることで、コントローラの傾きに応じた制御を可能としつつ、角度を算出するコストを軽減することができる。
なお、以上においては、本発明に係る情報処理システムおよびプログラムを、ゲームシステムおよびゲームプログラムとして実現する場合を例として説明したが、本発明は、ゲーム分野に限らず、撮像画像を用いて入力装置自体の位置や向きを検知する入力装置を用いる情報処理システムに適用することが可能である。
例えば、第1実施例は、ゲームのメニュー画面を表示する場合の他、表示画面上の任意の位置を指定するためのシステムにおいても適用することができる。このシステムは、例えば会議等で画面に表示される内容を説明者が説明する際に用いられる。具体的には、第1実施例と同様の方法で表示画面上のカーソルを移動させるとともに、第1実施例と同様の方法で表示画面に表示されている画像をスクロールさせる。これによれば、説明者は、表示画面上の任意の位置を指定するためにカーソルを移動させる操作と、表示画面の内容をスクロールさせる操作とを、1つのコントローラ7を用いて行うことができる。カーソルによって任意の位置を指定したり表示画面の内容をスクロールさせたりする操作を片手で行うことができるので、説明者にとっては非常に便利である。