(実施例1)
図1は、本発明の実施例にかかるゲームシステムの使用環境を示す。ゲームシステム1は、撮像装置2、画像表示装置3、音声出力装置4、ゲーム装置10およびコントローラ20を備える。撮像装置2、画像表示装置3、音声出力装置4およびコントローラ20は、ゲーム装置10に接続される。
コントローラ20は、ユーザが操作入力を行うための操作入力装置であり、またゲーム装置10は、コントローラ20における操作入力をもとにゲームアプリケーションを処理して、ゲームアプリケーションの処理結果を示す画像信号を生成する処理装置である。なお、本実施例に示す技術は、ゲームアプリケーションに限らず、他の種類のアプリケーションを実行する処理装置を備えたエンタテインメントシステムにおいても実現できる。以下では、エンタテインメントシステムを代表して、ゲームアプリケーションを実行するゲームシステム1について説明する。
撮像装置2は、CCD撮像素子またはCMOS撮像素子などから構成されるビデオカメラであり、実空間を所定の周期で撮像して、周期ごとのフレーム画像を生成する。たとえば、撮像装置2の撮像速度は30枚/秒として、画像表示装置3のフレームレートと一致させてもよい。撮像装置2は、USB(Universal Serial Bus)あるいはその他のインタフェースを介してゲーム装置10と接続する。
画像表示装置3は画像信号を出力するディスプレイであって、ゲーム装置10において生成された画像信号を受けて、ゲーム画面を表示する。音声出力装置4は音声を出力するスピーカであって、ゲーム装置10において生成された音声信号を受けて、ゲーム音声を出力する。画像表示装置3および音声出力装置4は、ゲームシステム1における出力装置を構成する。
ゲーム装置10と画像表示装置3は、有線により接続されてもよく、また無線により接続されてもよい。ゲーム装置10と画像表示装置3とはAVケーブルによって接続されてもよい。またゲーム装置10と画像表示装置3との間には、ネットワーク(LAN)ケーブルやワイヤレスLANなどで構築したホームネットワークが構築されてもよい。
コントローラ20は、ユーザによる操作入力をゲーム装置10に伝送する機能をもち、本実施例ではゲーム装置10との間で無線通信可能な無線コントローラとして構成される。コントローラ20とゲーム装置10は、Bluetooth(ブルートゥース)(登録商標)プロトコルを用いて無線接続を確立してもよい。ゲーム装置10は、複数のコントローラ20との無線接続を可能とし、すなわちゲームシステム1においては、ゲーム装置10とコントローラ20の1対N接続を実現できる。ゲーム装置10は親機すなわちマスタとして機能し、コントローラ20は子機すなわちスレーブとして機能する。なおコントローラ20は、無線コントローラに限らず、ゲーム装置10とケーブルを介して接続される有線コントローラであってもよい。
コントローラ20は、図示しないバッテリにより駆動され、ゲームを進行させる操作入力を行うための複数のボタンやキーを有して構成される。ユーザがコントローラ20のボタンやキーを操作すると、その操作入力が無線によりゲーム装置10に送信される。ゲーム装置10は、コントローラ20からゲームアプリケーションに関する操作入力を受信し、操作入力に応じてゲーム進行を制御して、ゲーム画像信号およびゲーム音声信号を生成する。生成されたゲーム画像信号およびゲーム音声信号は、それぞれ画像表示装置3および音声出力装置4により出力される。またゲーム装置10は、ゲームアプリケーションの進行状況に応じて、コントローラ20を振動させる振動制御信号をコントローラ20に送信する機能ももつ。コントローラ20は振動子を有し、振動制御信号を受信すると振動子を振動させる。
本実施例のゲームシステム1において、コントローラ20は、複数の発光素子を有して構成される。複数の発光素子はそれぞれ同色のLEDであって、ゲームアプリケーションで設定されるコントローラ番号を表現するインジケータとしての役割をもつ。ゲームアプリケーションにおけるコントローラ番号は、たとえばゲーム開始時にゲームキャラクタを選択する際などにユーザに利用されるため、ユーザに何らかの手段でコントローラ番号を通知する必要がある。そのためコントローラ20では、複数のLEDのうち、たとえば1番目のLEDが点灯していればコントローラ番号が1であり、また2番目のLEDが点灯していればコントローラ番号が2であるとしてユーザにコントローラ番号を知らしめる。なお、複数のLEDの組合わせによりコントローラ番号を表現することも可能である。
コントローラ20が有線コントローラである場合には、コントローラ20から延びるケーブルコネクタをゲーム装置10のポートに差し込んだ位置でコントローラ番号を決定することも可能である。しかしながら、複数のポートを備えたマルチポート装置をゲーム装置10に外付けして使用するような場合には、ユーザはすぐにコントローラ番号を知ることはできないため、複数のLEDを用いてユーザにコントローラ番号を通知することが好ましい。
ゲームシステム1においては、コントローラ20のLEDを、コントローラ番号のインジケータとしてだけではなく、ゲームアプリケーションの進行に影響を与えるゲーム入力としても利用する。この場合、LEDの制御は、インジケータとして点灯するのではなく、ゲームアプリケーションへの入力としての点灯に切り替えられる。撮像装置2はコントローラ20のLEDを撮像し、フレーム画像を生成してゲーム装置10に供給する。ゲーム装置10は、フレーム画像を取得して、フレーム画像におけるLED画像の位置からコントローラ20のフレーム画像中の位置や姿勢を推定して取得し、取得した位置情報および/または姿勢情報をゲームアプリケーションの処理に反映する。すなわち、本実施例のゲーム装置10は、コントローラ20において入力された操作入力だけでなく、取得したコントローラ20の位置情報や姿勢情報も用いてゲームアプリケーションを処理して、その処理結果を示す画像信号を生成する機能をもつ。
図2は、コントローラの外観構成を示す。コントローラ20には、方向キー21、アナログスティック27と、4種の操作ボタン26が設けられている。方向キー21、アナログスティック27、操作ボタン26は、筐体上面30に設けられた入力部である。4種のボタン22〜25には、それぞれを区別するために、異なる色で異なる図形が記されている。すなわち、○ボタン22には赤色の丸、×ボタン23には青色のバツ、□ボタン24には紫色の四角形、△ボタン25には緑色の三角形が記されている。コントローラ20の筐体背面29には、複数のLEDが設けられている。
ユーザは左手で左側把持部28aを把持し、右手で右側把持部28bを把持して、コントローラ20を操作する。方向キー21、アナログスティック27、操作ボタン26は、ユーザが左側把持部28a、右側把持部28bを把持した状態で操作可能なように、筐体上面30上に設けられる。
筐体上面30には、LED付きボタン31も設けられる。LED付きボタン31は、たとえば画像表示装置3にメニュー画面を表示させるためのボタンとして利用される。また、LEDの発光状態によりユーザへのメールの着信の知らせや、コントローラ20のバッテリの充電状態などを示す機能ももつ。たとえば充電中は赤色、充電が終了すると緑色に点灯し、充電残存量が残り少ないときには赤色を点滅させるようにLEDを点灯させる。
ユーザは画像表示装置3に表示されるゲーム画面を見ながらゲームを行うため、画像表示装置3は、矢印Aで示すコントローラ20の前方に存在している。そのため、通常は、画像表示装置3に対して、LEDを配置された筐体背面29が向き合うことになる。本実施例において撮像装置2は、ゲームアプリケーションの実行中にLEDを撮像する必要があるため、その撮像範囲が画像表示装置3と同じ方向を向くように配置されて、コントローラ20の筐体背面29と向き合うことが好ましい。一般にユーザは画像表示装置3の正面でゲームをプレイすることが多いため、撮像装置2は、その光軸の方向が画像表示装置3の正面方向と一致するように配置される。具体的に、撮像装置2は、画像表示装置3の近傍において、画像表示装置3の表示画面をユーザが視認可能な位置を撮像範囲に含むように配置されることが好ましい。これにより、撮像装置2は、ユーザの身体およびコントローラ20を撮像できる。
図3は、コントローラの背面側の外観構成を示す。図3では、コントローラ20の筐体上面30における方向キー21や操作ボタン26などの図示を省略している。筐体背面29にはLED配設領域42が設けられ、LED配設領域42内に第1LED40a、第2LED40b、第3LED40cおよび第4LED40dが配置される。以下、第1LED40a、第2LED40b、第3LED40cおよび第4LED40dを総称する場合には、「LED40」と表記する。LED配設領域42は、筐体背面29における中央領域に形成される。LED配設領域42の中央部には、USBコネクタ46が設けられる。USBコネクタ46には、ゲーム装置10から延びるUSBケーブルが接続されて、コントローラ20の充電処理を行うことができる。なおUSBケーブルが接続されると、コントローラ20を有線コントローラとして利用することも可能である。
筐体背面29側には、操作ボタン48a、48b、48c、48dがLED配設領域42を挟んで左右に設けられる。操作ボタン48a、48b、48c、48dは、ユーザが左側把持部28a、右側把持部28bを把持した状態でも人差指の先端で操作可能な位置に設けられる。これにより、操作ボタン48a、48b、48c、48dの操作時に、LED40は人差指によって隠れない。
LED40は、コントローラ番号を表現するインジケータとして利用されるが、コントローラ20を使用しているユーザからすると、一度確認できれば十分であって、常に見える筐体上面30に配置することは好ましくない。一方、他のユーザが存在する場合には、LED40を筐体背面29に配置することで、他のユーザから見えやすくなるという利点がある。また筐体上面30にはLED付きボタン31が存在するため、LED40を配置するとユーザが区別しづらくなる。そのため、コントローラ20は、LED40を筐体背面29に配置して構成される。
撮像装置2は、各画素におけるRGBの輝度値を取得する。発光したLED40を正確に検出するためには、LED40とLED40周辺の領域とのコントラストが大きいことが好ましい。そのためLED配設領域42は、その隣接する筐体色よりも明度の低い色をもち、たとえば黒色の配色を施される。LED配設領域42は、黒色の半透明板として構成され、LED40は、その背後すなわち筐体内部側に設けられる。これにより、LED40は点灯していなければ撮像装置2からは見えず、点灯したときのみ撮像される。黒色半透明板は、光を拡散してLED40の狭指向性を広指向性に変える役割ももつ。LED40をLED配設領域42に設けることで、発光したLED40とのコントラストを高めることができ、後の画像処理において、フレーム画像からLED画像を効果的に抽出することが可能となる。
第1LED40a、第2LED40b、第3LED40cおよび第4LED40dは、所定の2次元パターンで配設される。たとえば第1LED40a、第2LED40b、第3LED40cおよび第4LED40dは、矩形の頂点を構成する位置に配設される。ゲーム装置10は、この位置関係を予め把握しており、LED画像の抽出処理に利用する。なお各LED40の近傍には、数字が刻印または印刷されており、ユーザは点灯したLED40の近傍の数字をみて、コントローラ番号を知ることができる。
図4は、コントローラの内部構成を示す。コントローラ20は、無線通信モジュール58、処理部60、LED40および振動子44を備える。無線通信モジュール58は、ゲーム装置10の無線通信モジュールとの間でデータを送受信する機能をもつ。処理部60は、コントローラ20における所期の処理を実行する。
処理部60は、メイン制御部50、入力受付部52、PWM制御部54および駆動部56を有する。メイン制御部50は、無線通信モジュール58との間で必要なデータの送受を行う。
入力受付部52は、方向キー21、操作ボタン26、アナログスティック27などの入力部からの入力情報を受け付け、メイン制御部50に送る。メイン制御部50は、受け取った入力情報を無線通信モジュール58に供給し、無線通信モジュール58は、所定のタイミングでゲーム装置10に送信する。また、無線通信モジュール58はゲーム装置10から振動制御信号を受け取ると、メイン制御部50に供給し、メイン制御部50は、振動制御信号をもとに振動子44を振動させる駆動部56を動作させる。駆動部56は、振動子44を駆動するためのスイッチとして構成されてもよく、また供給電圧のデューティ比を可変とするPWM制御部として構成されてもよい。
本実施例において、PWM制御部54は、第1PWM制御部54a、第2PWM制御部54b、第3PWM制御部54cおよび第4PWM制御部54dから構成される。第1PWM制御部54a、第2PWM制御部54b、第3PWM制御部54cおよび第4PWM制御部54dは、それぞれ第1LED40a、第2LED40b、第3LED40cおよび第4LED40dの点灯を制御するために設けられる。PWM制御部54は、LED40に印加する電圧をPWM(パルス幅変調)により制御する。たとえば、PWM制御部54は、数kHzの高周波で印加電圧をPWM制御することで、LED40の輝度を調整することができる。またPWM制御部54は、数Hz〜100Hz程度の低周波で印加電圧をPWM制御することで、撮像装置2においてLED40の点灯のオンオフを認識させることができる。
本実施例のゲームシステム1において、まず、ゲームシステム1に参加を希望するユーザのコントローラ20が、ゲーム装置10との間で通信を確立する。このとき、コントローラ20の識別情報、たとえばブルートゥースアドレスがゲーム装置10に受け渡され、以後の通信は、このブルートゥースアドレスをもとに行われる。なお、通信プロトコルとしてブルートゥースを利用しない場合には、MACアドレスなどの機器アドレスが利用されてもよい。接続確立後、ユーザはゲームアプリケーションに参加できる。
このときコントローラ20には、ゲーム装置10からコントローラ番号を指示する情報が送信される。メイン制御部50は、この番号指示情報をもとに、設定されたコントローラ番号に対応するLED40のみを点灯させる。これによりユーザは、自身のコントローラ20のコントローラ番号を知ることができる。なお、番号指示情報の代わりに、コントローラ番号に対応するLED40の点灯を指示する制御信号がゲーム装置10から送信されてもよい。このようにメイン制御部50は、任意のLED40を点灯させることができる。
本実施例のゲームシステム1において、ゲーム装置10は、全てのLED40a〜40dを点灯した状態で撮像されたフレーム画像をもとに、コントローラ20の位置および姿勢を推定する。推定した位置および姿勢は、実行するゲームアプリケーションの入力として利用される。またゲーム装置10は、コントローラ20の方向キー21や操作ボタン26などの操作入力も受け付ける。これらの入力情報をもとに、ゲーム装置10は、ゲームアプリケーションのゲームパラメータを生成し、ゲームを進行制御して、ゲーム画像およびゲーム音声のAVデータを生成する。AVデータは、画像表示装置3および音声出力装置4において出力される。ユーザは、ゲーム画面を見ながら、コントローラ20を実空間上で動かし、さらには方向キー21や操作ボタン26を操作入力してゲームを行う。以下に、ゲーム装置10における処理を説明する。
図5は、ゲーム装置の構成を示す。ゲーム装置10は、入力部100、画像処理部102、位置推定部104、点滅指示部106、無線通信モジュール108、アプリケーション処理部110および出力部112を備える。本実施例におけるゲーム装置10の処理機能は、CPU、メモリ、メモリにロードされたプログラムなどによって実現され、ここではそれらの連携によって実現される構成を描いている。プログラムは、ゲーム装置10に内蔵されていてもよく、また記録媒体に格納された形態で外部から供給されるものであってもよい。したがってこれらの機能ブロックがハードウェアのみ、ソフトウェアのみ、またはそれらの組合せによっていろいろな形で実現できることは、当業者に理解されるところである。図示の例では、ゲーム装置10のCPUが、画像処理部102、位置推定部104、点滅指示部106、アプリケーション処理部110としての機能をもつ。なお、ハードウェアの構成上、ゲーム装置10は複数のCPUを有してもよい。このような場合、1つのCPUがゲームアプリケーションを実行するアプリケーション処理部110として機能し、他のCPUが、撮像装置2による撮影画像を処理する画像処理部102、位置推定部104、点滅指示部106として機能してもよい。
無線通信モジュール108は、コントローラ20の無線通信モジュール58との間で無線通信を確立する。同期確立フェーズにおいては、無線通信モジュール108が、周辺のコントローラ20を含む端末機器に対して接続照会すなわち「問い合わせ」処理を行う。具体的には、無線通信モジュール108が、近くにいる端末機器に対してIQ(問い合わせ)パケットをブロードキャストする。IQパケットを受信したコントローラ20の無線通信モジュール58は、BluetoothアドレスとBluetoothクロック情報を含むFHS(Frequency Hop Synchronization)パケットをゲーム装置10に返信する。この時点における送受信では、周波数ホッピングパターンに関する同意がゲーム装置10とコントローラ20との間で確立していないので、問い合わせ専用に定義された固定ホッピングパターンが用いられる。
無線通信モジュール108は、コントローラ20からFHSパケットを受け取り、どのようなコントローラ20が存在するかを把握した後、特定のコントローラ20に対してIDパケットを送信する。これは無線通信モジュール108による「呼び出し」処理である。特定のコントローラ20からIDパケットに対する応答が返ると、無線通信モジュール108はFHSパケットをコントローラ20に送信し、自分のアドレスとクロックをコントローラ20に知らせる。これにより、ゲーム装置10とコントローラ20は、同一のホッピングパターンを共有できるようになる。
「呼び出し」を行うと、コントローラ20とゲーム装置10との間にピコネットが形成され、「接続」状態に入る。ピコネットとは、Bluetooth端末同士を近づけたときに、端末の間で一時的に形成されるネットワークを意味し、最大で8台のBluetooth端末が1つのピコネットに参加することができる。接続したコントローラ20は、無線通信モジュール108からスレーブ識別子、つまり接続中のコントローラ20に与えられる3ビットのアドレス(1〜7)を割り振られる。このスレーブ識別子は、AM_ADDR(アクティブメンバーアドレス)と呼ばれる。「接続」状態になると、通信リンク設定のための制御パケットが送受信され、これにより「データ転送」が可能となる。
接続状態になり、コントローラ20がゲームアプリケーションに参加すると、アプリケーション処理部110は、コントローラ20のコントローラ番号を割り当て、コントローラ番号を指示する番号指示情報を生成する。無線通信モジュール108は、番号指示情報をコントローラ20に送信する。コントローラ20は、番号指示情報を受信すると、対応するLED40を点灯させる。なお、無線通信モジュール108は、番号指示情報の代わりに、コントローラ番号に対応するLED40の点灯を指示する制御信号をコントローラ20に送信してもよい。
ゲームアプリケーションが開始されると、点滅指示部106は、コントローラ20に対して所定の周期で点滅するように点滅パターンを指示する制御信号を生成する。この点滅制御信号は、無線通信モジュール108からコントローラ20に送信される。
入力部100はUSBインタフェースとして構成され、撮像装置2から所定の撮像速度(たとえば30フレーム/秒)でフレーム画像を取得する。画像処理部102は、後述するLED抽出アルゴリズムにしたがって、フレーム画像からLED画像を抽出する。位置推定部104は、抽出されたLED画像からLED画像の位置情報を取得し、コントローラ20の位置や姿勢を推定する。位置推定部104は、LED画像の位置情報を取得することから、位置取得部として機能してもよい。なおコントローラ20の位置は、4つのLED画像の重心位置に定められてよい。
点灯する4つのLED40の位置や姿勢から推定されるコントローラ20の位置情報および/または姿勢情報は、ゲームアプリケーションの入力として利用される。そのため位置推定部104で推定されたコントローラ20の位置情報および姿勢情報は、アプリケーション処理部110に逐次送られて、アプリケーションの処理に反映される。アプリケーション処理部110には、ユーザがコントローラ20の方向キー21などを操作した入力も無線通信モジュール108を介して送信される。アプリケーション処理部110は、コントローラ20の位置・姿勢情報と、コントローラ20における操作入力からゲームを進行させて、ゲームアプリケーションの処理結果を示す画像信号および音声信号を生成する。画像信号および音声信号は出力部112からそれぞれ画像表示装置3および音声出力装置4に送られ、出力される。
図6は、画像処理部の構成を示す。画像処理部102は、フレーム画像取得部130、現フレームバッファ132、前フレームバッファ134、差分画像生成部136、2値化画像生成部138、論理演算部140およびLED画像抽出部142を備える。
フレーム画像取得部130は、入力部100からフレーム画像データを取得し、現フレームバッファ132に一時記憶させる。前フレームバッファ134には、一つ前のフレーム画像データが記憶されている。差分画像生成部136は、現フレームバッファ132に記憶されている現フレームデータと、前フレームバッファ134に記憶されている前フレームデータとの差分画像を生成する。フレーム画像中の座標(x,y)における前フレームデータのR画素値をPr、G画素値をPg、B画素値をPbとし、現フレームデータのR画素値をCr、G画素値をCg、B画素値をCbとしたとき、差分画像関数F(x,y)は、以下の数式で表現される。
ここでThは、所定の閾値である。F(x,y)が0より大きければ、座標(x,y)の画素値が“1”に符号化され、表示上、その画素は白色とされる。一方、F(x,y)が0以下であれば、画素値が“0”に符号化され、表示上、その画素は黒色とされる。このように差分画像生成部136で生成される差分画像は、2値化処理された画像となる。差分画像を生成することで、前フレーム画像と現フレーム画像との間で動きのないオブジェクトの影響を取り除くことができる。
2値化画像生成部138は、現フレームデータを所定の閾値を用いて2値化処理して、2値化された画像を生成する。2値化画像生成部138は、所定の閾値より大きい輝度を保持する画素の画素値を“1”に符号化し、所定の閾値以下の輝度を保持する画素の画素値を“0”に符号化する。現フレーム画像の2値化画像を生成することで、現フレーム画像において明るいオブジェクトのみを抽出することができる。
論理演算部140は、差分画像生成部136で生成された差分画像と、2値化画像生成部138で生成された2値化画像とを論理演算した論理演算画像を生成する。詳細には、論理演算部140は、画素ごとに、差分画像の画素値と2値化画像の画素値との論理積演算を行うことで、論理積画像を生成する。これは、差分画像と2値化画像の対応する画素同士の画素値を数学的に論理積演算することで生成される。
図7(a)は、現フレーム画像を示す。現フレーム画像では、ユーザがコントローラ20を把持してゲームをプレイし、右側には照明が点灯している状態が撮像されている。このときコントローラ20の全LED40が点灯している。なお、全てのLED40は、同一の点灯パターンにより、同一輝度で発光している。
図7(b)は、現フレーム画像と前フレーム画像の差分画像を示す。前フレーム画像の位置からコントローラ20を動かすと、数式(1)により差分画像が生成される。この例では、コントローラ20や、コントローラ20と一緒に動く体の少なくとも一部の領域が、白色画像(画素値が“1”になる)として取得される。なお、常にこのような白色画像が取得されるわけではなく、図7(b)は、あくまでも数式(1)を満足したときに生成される差分画像の一例である。このとき、照明は動かないため、差分画像には含まれない。なお、ユーザがコントローラ20を動かさなければ、コントローラ20の白色画像は取得されない。
図8(a)は、現フレーム画像の2値化画像を示す。2値化画像では、図7(a)における高輝度領域、すなわち発光しているLEDと、照明のランプとが2値化されて白色画像に変換される。他のノイズを防ぐために、2値化処理する際に設定する閾値は、LEDの発光輝度から所定のマージン値を減じた輝度値に設定されていることが好ましい。
図8(b)は、論理積画像を示す。論理積画像は、図7(b)に示す差分画像と、図8(a)に示す2値化画像との論理積演算を行う。差分画像および2値化画像において、白色画素の画素値は“1”であり、黒色画素の画素値は“0”である。したがって、両方の画像において白色画素として存在している画素のみが、論理積画像において白色画素として生成されることになる。
このように差分画像と2値化画像の論理積をとることで、LED画像を抽出しやすい論理積画像を生成できる。論理積画像は、LED画像抽出部142に送られる。
論理積画像が生成されると、前フレームバッファ134に保持されている前フレームデータは、現フレームバッファ132に保持されている現フレームデータにより上書きされる。この上書き処理は、前フレームバッファ134が差分画像生成部136に読み出された直後に行われてもよい。その後、現フレームバッファ132に保持されている現フレームデータは、次のフレームデータにより上書きされて、次のフレームにおける論理積画像の生成処理を実行する。
LED画像抽出部142は、論理積画像からLED画像を抽出する。LED画像を抽出するためには、まず、LED画像の候補を検出する。続いて、任意の候補を第1LED40aと仮定し、その周辺領域を探索して、第2LED40bとなりうるLED画像候補があるか調査する。第2LED40bが見つかれば、また第1LED40aの周辺領域を探索して、第3LED40cとなりうるLED画像候補があるか調査する。第3LED40cが見つかれば、その周辺領域を探索して、第4LED40dとなりうるLED画像候補があるか調査する。この際、LED画像抽出部142は、複数のLED40により形成される2次元パターンを予め認識しており、この2次元パターンを利用して、LED画像の抽出処理を行う。以下では、説明の便宜上、コントローラ20の筐体背面29において、第1LED40a、第2LED40b、第3LED40c、第4LED40dが正方形の頂点を構成するように配置されている場合を例にとる。
なおLED画像抽出部142は、論理積画像を用いずに、2値化画像からLED画像を抽出することも可能である。2値化画像には、LED画像以外のノイズも含まれることになるが、たとえば差分画像においてLED画像を取得できない場合には、2値化画像を利用することで、LED画像の位置および姿勢を検出できる。以下に示す処理手順は、論理積画像および2値化画像のいずれを用いても実行できるが、論理積画像にはLED画像以外のノイズ成分が少ないため、論理積画像を利用する方が処理速度は速い。
図9は、LED画像候補の検出処理の処理手順を示すフローチャートである。LED画像抽出部142は、論理積画像において、白色画素(画素値が“1”になっている画素)が連続して存在する領域を1つの連結領域として取得する(S100)。次に、LED画像抽出部142は、白色画素連結領域の縁部分を抽出して、短辺および長辺を決定する(S102)。
LED画像抽出部142は、短辺が所定画素数Ma以上の画素で構成されているか否かを判定する(S104)。短辺が画素数Maより少ない画素で構成されている場合(S104のN)、LED画像抽出部142は、LED画像ではないとして、この白色画素連結領域の処理を終了する。短辺が画素数Ma以上の画素で構成されている場合(S104のY)、LED画像抽出部142は、長辺が所定画素数Mb以下の画素で構成されているか否かを判定する(S106)。長辺が画素数Mbより多い画素で構成されている場合(S106のN)、LED画像抽出部142は、LED画像ではないとして、この白色画素連結領域の処理を終了する。長辺が画素数Mb以下の画素で構成されている場合(S106のY)、LED画像抽出部142は、LED画像の候補であるとして、白色画素連結領域を構成する画素数を取得する(S108)。このLED画像候補検出処理は、全ての白色画素連結領域に対して繰り返される。これにより、論理積画像に含まれるLED画像候補を検出できる。なお、LED画像候補の座標は、連結領域の重心に設定する。
図10は、LED抽出処理の処理手順を示すフローチャートである。LED画像抽出部142は、検出されたLED画像候補のうち、任意のLED画像候補を第1LED40aであると仮定する(S120)。次に、第1LED40aに対して、第2LED40bとなりうる条件を満足するLED画像候補が存在するか否かを判定する(S122)。第2LED40bとなるLED画像候補が存在すれば(S122のY)、第1LED40aおよび第2LED40bに対して、第3LED40cとなりうる条件を満足するLED画像候補が存在するか否かを判定する(S124)。第3LED40cとなるLED画像候補が存在すれば(S124のY)、第1LED40a、第2LED40bおよび第3LED40cに対して、第4LED40dとなりうる条件を満足するLED画像候補が存在するか否かを判定する(S126)。第4LED40dとなるLED画像候補が存在すれば(S126のY)、コントローラ20の第1LED40a〜第4LED40dを抽出したことになる。なお、第2LED画像候補が存在しない場合(S122のN)、第3LED画像候補が存在しない場合(S124のN)、第4LED画像候補が存在しない場合(S126のN)は、別のLED画像候補を第1LED40aと仮定して、図8の処理を再実行する。
LED抽出処理においては、処理負荷を軽減するために、コントローラ20の姿勢が所定角度以上傾いていないことを処理条件として設定してもよい。LED40は比較的指向性が強いため、コントローラ20を傾けすぎると、撮像装置2において受光が難しくなる。このLED40の指向性を利用して、LED画像候補を探索する際に、第1LED40aから所定角度(たとえば45°)よりも傾いていないことを条件としてLED画像の抽出処理を行うことで、処理負荷を大幅に軽減することが可能となる。
本実施例では、前フレーム画像と現フレーム画像の差分画像を利用するため、コントローラ20に動きがない場合は、LED40の画像は差分画像から除かれる。そのため、差分画像を用いる場合には、図10に示すLED抽出処理により、必ずLED画像が見つかるわけではない。位置推定部104は、図10に示すLED抽出処理によりLED画像が見つからなかった場合は、コントローラ20が前フレームの位置から動いていないものと推定し、前フレームにおけるコントローラ20の位置情報および姿勢情報を取得する。このとき位置推定部104は、2値化画像を用いてLED画像を抽出してもよい。
図11は、図10のS122に示す第2LED検出処理の処理手順を示すフローチャートである。第1LED40aと仮定したLED画像候補の構成画素数をNとする。まずLED画像抽出部142は、LED画像候補の画素数が1/2×N以上であって、且つ2N以下であるか否かを判定する(S140)。これは、LED画像であれば、大きさや形は第1LED40aと大きく変わらないという事実に基づいている。LED画像候補の構成画素数が、構成画素数Nに対して所定の範囲内にあれば(S140のY)、そのLED画像候補が第1LED40aの右方に存在するか否かを判定する(S142)。右方であるか否かの判断は、第1LED40aの右上45°から右下45°の範囲内に存在するか否かにより決定される。第1LED40aの右方にある場合(S142のY)、第1LED40aとLED画像候補との距離D12が、Da以上であって且つDb以下であるか否かを判定する(S144)。ここでは、互いの距離が近すぎたり、また離れすぎている場合には、第2LED40bとして相応しくないことを判定している。距離D12がDa以上であって且つDb以下である場合(S144のY)、そのLED画像候補が第2LED40bとなりうることが判断され、第2LED40bの存在が確認される(S146)。一方、LED画像候補の構成画素数が所定の範囲内にない場合(S140のN)、LED40aの右方に存在しない場合(S142のN)、距離D12が所定の範囲内にない場合(S144のN)には、そのLED画像候補が第2LED40bでないと判断される。
図12は、図10のS124に示す第3LED検出処理の処理手順を示すフローチャートである。第1LED40aと仮定したLED画像候補の構成画素数をNとする。まずLED画像抽出部142は、LED画像候補の画素数が1/2×N以上であって、且つ2N以下であるか否かを判定する(S160)。LED画像候補の構成画素数が、構成画素数Nに対して所定の範囲内にあれば(S160のY)、そのLED画像候補が第1LED40aの下方に存在するか否かを判定する(S162)。下方であるか否かの判断は、第1LED40aの左下45°から右下45°の範囲内に存在するか否かにより決定される。第1LED40aの下方にある場合(S162のY)、第1LED40aとLED画像候補との距離が、1/√2×D12以上であって且つ√2D12以下であるか否かを判定する(S164)。ここでは、互いの距離が近すぎたり、また離れすぎている場合には、第3LED40cとして相応しくないことを判定している。距離が1/√2×D12以上であって且つ√2D12以下である場合(S164のY)、第1LED40aから第2LED40bまでの線分と、第1LED40aからLED画像候補までの線分の角度が所定の範囲内であるか否かが判定される(S166)。このとき、所定の範囲内にあれば(S166のY)、そのLED画像候補が第3LED40cとなりうることが判断され、第3LED40cの存在が確認される(S168)。一方、LED画像候補の構成画素数が所定の範囲内にない場合(S160のN)、LED40aの下方に存在しない場合(S162のN)、第1LED40aとの距離が所定の範囲内にない場合(S164のN)、角度が所定の範囲内にない場合(S166のN)には、そのLED画像候補が第3LED40cでないと判断される(S170)。
図13は、図10のS126に示す第4LED検出処理の処理手順を示すフローチャートである。第1LED40aと仮定したLED画像候補の構成画素数をNとする。まずLED画像抽出部142は、LED画像候補の画素数が1/2×N以上であって、且つ2N以下であるか否かを判定する(S180)。LED画像候補の構成画素数が、構成画素数Nに対して所定の範囲内にあれば(S180のY)、第1LED40aから第2LED40bのベクトルと、第3LED40cとLED画像候補のベクトルのなす角度が所定値以下であるか否かを判定する(S182)。第1LED40aから第2LED40bのベクトルと、第3LED40cとLED画像候補のベクトルのなす角度が所定値以下であれば(S182のY)、第1LED40aから第3LED40cのベクトルと、第2LED40bとLED画像候補のベクトルのなす角度が所定値以下あるか否かを判定する(S184)。第1LED40aから第3LED40cのベクトルと、第2LED40bとLED画像候補のベクトルのなす角度が所定値以下であれば(S184のY)、そのLED画像候補が第4LED40dとなりうることが判断され、第4LED40dの存在が確認される(S186)。一方、LED画像候補の構成画素数が所定の範囲内にない場合(S180のN)、第1LED40aから第2LED40bのベクトルと、第3LED40cとLED画像候補のベクトルのなす角度が所定値を超える場合(S182のN)、第1LED40aから第3LED40cのベクトルと、第2LED40bとLED画像候補のベクトルのなす角度が所定値を超える場合は(S184のN)、そのLED画像候補が第4LED40dでないと判断される(S188)。
以上により、LED画像抽出部142は、論理積画像から第1LED40a〜第4LED40dの画像を抽出することができる。抽出された第1LED40a〜第4LED40dの画像の位置情報は、位置推定部104に送られる。
位置推定部104は、コントローラ20におけるLED40の2次元配置に基づき、第1LED40a〜第4LED40dの画像のフレーム画像における位置情報を取得する。位置推定部104は、抽出した第1LED40a、第2LED40b、第3LED40cおよび第4LED40dのアフィン変換を求めて、実空間における位置および姿勢を算出する。実空間における位置は、直交座標系における座標(X,Y,Z)であり、実空間における姿勢は、X軸、Y軸、Z軸における回転角である。3軸における座標および回転角を求めることで、位置推定部104は、撮像装置2からの距離も含めた空間内での位置を推定できる。位置推定部104は、アフィン変換を求めることで、コントローラ20のフレーム画像中の位置を推定してもよい。たとえば、XYZ空間のうちのXY座標をとることでフレーム画像中の位置を取得することができる。位置推定部104は、推定したコントローラ20の位置や姿勢をアプリケーション処理部110に送る。
LED40の誤認識を回避するために、位置推定部104は、前回取得したLED画像の位置と、今回取得したLED画像の位置の変化量が所定値を超える場合、今回取得したLED画像の位置をエラーとして処理する。すなわち、1フレームの間に、位置や姿勢が所定値以上変化する場合は、外乱的な要素により他のオブジェクトをLED40として誤認識した可能性があるため、抽出したLED40の位置情報を破棄する。
しかしながら、そのような場合であっても、実際に大きな変化量でコントローラ20が移動することもあり得るため、位置推定部104は、連続して発生するエラーの回数をカウントし、カウント値が所定値に到達した場合に、そのときに取得したLED画像の位置を正常なものとして処理してもよい。
位置推定部104は、たとえば現フレーム画像や、論理積画像をもとに、LED40の移動方向や速度を推定することも可能である。たとえば撮像装置2のシャッタースピードを落とすと、LED40の画像が楕円や直方体として撮像されることになる。そこで、LED画像の形状から、移動方向のみならず、移動速度も推定することが可能である。たとえば移動方向および速度が推定できれば、撮像装置2において突然見えなくなった場合でも、コントローラ20の位置や姿勢を予測できる。全てのLED40の形状が同じ方向に偏っているような場合に、コントローラ20の移動方向と速度を推定してもよい。
アプリケーション処理部110は、推定されたコントローラ20の位置や姿勢を、ゲーム入力としてゲームアプリケーションの処理に反映する。この反映の手法は様々考えられるが、最も直観的には、推定したコントローラ20の位置に対応したゲーム画像中の位置に、仮想オブジェクトを追従させて表示する。ユーザが撮像装置2に対してコントローラ20を動かすと、その動きに追従してゲーム画像内の仮想オブジェクトを動かすことができる。
なお、理想的な状態であればフレーム画像ごとにLED40の位置や姿勢を求めてゲーム画像に反映していけばよいが、一方で、コントローラ20の向きや周辺光の環境などにより、フレーム画像においてLED40の位置や姿勢を求められない状況も発生しうる。そのような状況が続いた後に、突然、LED40の位置や姿勢が求められると、停止していた仮想オブジェクトが新たな位置にいきなり移動することになり、ユーザに違和感を与える。そのため、論理積画像からLED40の位置や姿勢を検出できたとしても、ゲーム画像としては、仮想オブジェクトを取得した位置まで移動させるのではなく、仮に情報落ちがあった場合であっても、スムーズな動きを実現できるように追従処理を行わせることとする。
図14(a)、図14(b)は、コントローラに対応する仮想オブジェクトがゲーム画面内で円滑な追従動作を実現するためのアルゴリズムを説明するための図である。説明の便宜上、仮想オブジェクトの位置変化について説明するが、姿勢変化についても同様のアルゴリズムを適用することができる。
位置推定部104において、アフィン変換を求めることで導出された位置パラメータが、Pi−1、Pi、Pi+1(Pの添字は、ゲーム画面フレームの番号を示す)とする。まず、フレーム画像が切り替り、PiからPi+1に位置パラメータが変化する場合を考える。
新たな位置パラメータ(Pi+1)が得られたとき、ゲーム画面に反映する位置パラメータは、以下の式で求められる。
Qi+1=(Qi+Pi+1)/2
すなわち、新たな位置パラメータPi+1に直接移動するのではなく、前フレームのゲーム画面における位置パラメータと、現フレームの新たな位置パラメータPi+1との中点を、ゲーム画面における新たな位置パラメータとして設定する。なお、位置パラメータQi+1は、位置パラメータQiと位置パラメータPi+1の中点である必要はなく、位置パラメータQiと位置パラメータPi+1の間の線分をA:Bに分割する点であってもよい。
図12(b)は、位置パラメータとしてPi+1が取得できなかった場合の例である。このような場合は、本アルゴリズムの効果を発揮できる。この場合は、最新の位置パラメータがPi+1の代わりに利用される。ここで最新の位置パラメータはPiであり、
Qi+1=(Qi+Pi)/2
として求められる。
本アルゴリズムによりゲーム画像における位置パラメータQを取得すると、空間内のコントローラ20が大きく変位したり、また論理積画像から抽出できない場合であっても、仮想オブジェクトは常に少しずつ移動できる。そのため、ゲーム画像中で仮想オブジェクトが急に動かなくなったり、また急に動いたりする状況の発生を回避でき、コントローラ20に対して円滑な追従処理を実現できる。
以上、本発明を実施例1をもとに説明した。この実施例は例示であり、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。
本実施例では、コントローラ20を撮像装置2で撮像して、フレーム画像からコントローラ20の位置や姿勢を推定し、その位置情報や姿勢情報をゲームアプリケーションの処理に反映させることとした。コントローラ20のLED40は、たとえばゲームアプリケーションの進行状況に応じて点灯パターンを変更してもよい。
ユーザがゲームアプリケーションに参加した直後に、ゲーム装置10は、コントローラ20に対して所定の低周波で4つのLED40を点灯させる制御信号を送信してもよい。点滅指示部106は、コントローラ20に対して所定の低周波での点滅パターンを指示する制御信号を生成する。この低周波点滅制御信号は、無線通信モジュール108からコントローラ20に送信される。なお、複数のコントローラ20が存在する場合には、コントローラ20ごとに点滅周波数が設定される。
コントローラ20は、指定された低周波でLED40を点灯し、撮像装置2は、30枚/秒の撮像速度でフレーム画像を撮像する。ゲーム装置10は、複数のフレーム画像から、所定の周期で点灯をオンオフしているLED画像を抽出する。ゲームシステム1内に複数のコントローラ20が存在する場合は、コントローラ20ごとに点灯の周期を設定する。これにより、コントローラ20の位置を確認できるとともに、それぞれのコントローラ20を区別して認識することもできる。この処理は、理想的にはゲームアプリケーションに参加後、1回行われればよいが、実空間内ではコントローラ20が撮像装置2から突然見えなくなることもある。そのため、数秒ごとなどの所定の周期で、各コントローラ20は、コントローラごとに設定された低周波でLED40を点滅させてもよい。
たとえば4つのLED40が低周波で点灯と消灯を行う場合には、LED40を撮像できるフレームと、撮像できないフレームとが所定の周期で切り替わることになる。撮像周期(30フレーム/秒)に対して、LED40を45Hzで点灯制御すると、連続した2枚のフレームで撮像され、次は撮像されない、という状況が繰り返される。フレーム画像に撮像される場合と撮像されない場合とがあるため、LED40が静止した状態であっても、位置情報を取得できる。
ここで低周波点灯とは、撮像周期に対して、LED発光が撮像されるフレームと撮像されないフレームとが存在しうるような周波数での点灯を意味する。一方、高周波点灯とは、撮像装置2の撮像周期(30フレーム/秒)に対して常にフレーム画像に撮像されるような周波数での点灯を意味する。たとえば、1kHzでLED40を点灯した場合であっても、たとえば撮像装置2の撮像周期が非常に高ければ、LED発光が撮像されるフレームと撮像されないフレームとが出現するため、LED40が静止した状態であっても、位置情報を取得できる。
高周波点灯するLED40の位置や姿勢は、ゲームアプリケーションの入力として利用される。そのため、位置推定部104で推定されたコントローラ20の位置情報は、アプリケーション処理部110に逐次送られて、アプリケーションの処理に反映される。アプリケーション処理部110には、ユーザがコントローラ20の方向キー21などを操作した入力も無線通信モジュール108を介して送信される。アプリケーション処理部110は、コントローラ20の位置・姿勢情報と、コントローラ20における操作入力からゲームを進行させて、ゲームアプリケーションの処理結果を示す画像信号および音声信号を生成する。
また、変形例として、4つのLED40のうちの1つを他のLED40とは異なる点滅パターンで点灯させることで、特定のLED40を認識することも可能となる。たとえば3つのLEDは高周波点灯を行い、1つのLEDに低周波点灯を行わせることで、たとえばフレーム画像中の第1LED40aがどれであるのかを確認することも可能となる。
実空間におけるコントローラ20の位置や姿勢を検出してゲームアプリケーションの処理に反映することで、新たなゲームアプリケーションを実現できる。テニスゲームを例にとると、フレーム画像におけるコントローラ20の高さをテニスボールの打点高さとし、コントローラ20の向きをボールの打球方向、コントローラ20を動かす速度を、ボールを打ち込む強さとして、コントローラ20を動かすことでゲームを進行させることができる。これらの動きは、実際のラケットを振る動きに近似しているため、テニスを実際にプレイするのに近い感覚をユーザに与えることができる。このとき、コントローラ20のボタンやキーをゲーム入力としてそのまま利用できるようにすることで、従来のゲーム操作入力を維持しながら、感覚的に斬新なゲーム入力を行わせることができる。このように、コントローラ20にインジケータとして設けたLEDを有効に活用することで、ゲームアプリケーションの幅を一層広げることができる。
たとえば、ボールを打ち込む強さをコントローラ20のボタン操作により定めてもよい。従来型のボタン操作と、斬新なゲーム入力とを組み合わせることで、新しい遊技性を実現できる。たとえば、相手のコートにボールを落とす位置をコントローラ20の向きで指定しながら、ボタン入力を行うことでボールを上げ、さらにコントローラ20を動かすことで、強いサーブを打てるようなテニスゲームを作ることも可能である。
ゲームアプリケーションとしては、たとえばオートバイのドライブゲームで、コントローラ20の姿勢を操作することで、オートバイをコントロールするゲーム入力として利用してもよい。このとき、スピードはコントローラ20を動かす速度で決定してもよく、またボタン入力で決定してもよい。このように、従来型のボタン入力と、コントローラ20の位置や姿勢による静的な入力と、またコントローラ20の移動速度などの状態変化をもとにした動的な入力とを組み合わせて利用することで、ゲームアプリケーションの操作性を向上できる。
たとえば、コントローラ20が画像表示装置3の画面からフレームアウトしそうな場合、アプリケーション処理部110は、コントローラ20の位置情報をもとに、ユーザに対してフレームアウトしそうな旨を通知する処理を行ってもよい。たとえば、コントローラ20がフレームアウトしそうな場合に、コントローラ20に対して振動子を振動させるための振動制御信号を生成して、無線通信モジュール108より送信させてもよい。また、コントローラ20の動きに追従する仮想オブジェクトをゲーム画像として表示させている場合には、ユーザに目立つように仮想オブジェクトを動かすことで、フレームアウトしそうなことをユーザに伝えてもよい。フレームアウトしそうであるか否かは、たとえばフレーム画像の位置で決定してもよく、フレーム画像の縁部に近い位置にコントローラ20の位置が推定される場合に、この通知処理を行ってもよい。
実施例において開示された発明の特徴は、次の項目によって規定されてもよい。
(項目1)
入力されるフレーム画像から発光体画像の位置を取得する画像処理装置であって、
前フレーム画像と現フレーム画像の差分画像を生成する差分画像生成部と、
現フレーム画像を所定の閾値を用いて2値化処理して2値化画像を生成する2値化画像生成部と、
前記差分画像と前記2値化画像とを論理演算した論理演算画像を生成する論理演算部と、
前記論理演算画像から発光体画像を抽出する抽出部と、
発光体画像のフレーム画像における位置を取得する位置取得部と、
を備えることを特徴とする画像処理装置。
(項目2)
前記論理演算部は、画素ごとに、前記差分画像の画素値と前記2値化画像の画素値との論理積演算を行うことで、論理演算画像を生成することを特徴とする項目1に記載の画像処理装置。
(項目3)
前記抽出部は、複数の発光体により形成される2次元パターンを予め認識しており、当該2次元パターンを利用して、発光体画像の抽出処理を行うことを特徴とする項目1または2に記載の画像処理装置。
(項目4)
前記位置取得部は、前回取得した発光体画像の位置と今回取得した発光体画像の位置の変化量が所定値を超える場合、今回取得した発光体画像の位置を、エラーとして処理することを特徴とする項目1から3のいずれかに記載の画像処理装置。
(項目5)
前記位置取得部は、連続して発生するエラーの回数をカウントし、カウント値が所定値に到達した場合に、そのときに取得した発光体画像の位置を正常なものとして処理することを特徴とする項目4に記載の画像処理装置。
(実施例2)
図15は、実施例2にかかるコントローラの背面側の外観構成を示す。コントローラ200の筐体背面29には、複数のLEDが設けられている。筐体背面側からみて、筐体上面右方には方向キー21が設けられ、上面左方には操作ボタン26が設けられる。また、方向キー21および操作ボタン26の内側には、2つのアナログスティック27が設けられる。
実施例2のコントローラ200において、第1LED210a、第2LED210b、第3LED210cおよび第4LED210dが、筐体背面29の上方且つ長手方向中央から右よりの位置に横一列に設けられる。以下、第1LED210a、第2LED210b、第3LED210cおよび第4LED210dを総称する場合には、「LED210」と表記する。また、筐体背面29の中央部には、USBコネクタ46が設けられる。USBコネクタ46には、ゲーム装置10から延びるUSBケーブルが接続されて、コントローラ200の充電処理を行うことができる。なおUSBケーブルが接続されると、コントローラ200を有線コントローラとして利用することも可能である。
筐体背面29側には、上側操作ボタン220a、上側操作ボタン220b、下側操作ボタン230a、下側操作ボタン230bが筐体背面長手方向の左右対称な位置にそれぞれ設けられる。上側操作ボタン220aおよび上側操作ボタン220bは、ユーザが右側把持部212a、左側把持部212bを把持した状態で、それぞれ右手および左手の人差指の先端で操作される位置に形成され、下側操作ボタン230aおよび下側操作ボタン230bは、それぞれ右手および左手の中指の先端で操作される位置に形成される。これによって、ユーザが上側操作ボタン220a、上側操作ボタン220b、下側操作ボタン230a、下側操作ボタン230bを操作する際、LED210が人差指または中指によって隠れない。
LED210の近傍には数字が刻印または印刷されており、LED210は、ゲームキャラクタと紐付けされたコントローラ番号を表現するインジケータとして利用されるが、コントローラ200を使用しているユーザからすると、一度確認できれば十分であって、常に見える筐体上面に配置することは好ましくない。一方、他のユーザが存在する場合には、LED210を筐体背面29に配置することで、他のユーザから見えやすくなるという利点がある。また筐体上面にはLED付きボタンが存在するため、上面にLED210を配置するとユーザが区別しづらくなる。そのため、コントローラ200は、LED210を筐体背面29に配置して構成される。
実施例2のコントローラ200において、上側操作ボタン220aおよび上側操作ボタン220bは、プッシュ式のボタンとして構成される。上側操作ボタン220からの入力は、押下されることで実行され、オンオフのデジタル入力を可能とする。一方、下側操作ボタン230aおよび下側操作ボタン230bは、回動支持されたトリガー式のボタンとして構成される。下側操作ボタン230は、回動可能な入力インタフェースであって、回動量に応じたアナログ入力を可能とする。なお、上側操作ボタン220についても同様にアナログ入力を可能とする入力インタフェースとして構成されてもよい。下側操作ボタン230は、回動軸により回動可能に支持された状態で、ばねなどにより筐体外向きに付勢されている。これにより、ユーザから押下されない状態では、下側操作ボタン230が筐体から離れる方向に付勢され、その位置を維持する。
図15に示すコントローラ200において、下側操作ボタン230は、筐体背面29の長手方向に実質的に平行に設けられた回転軸により回動可能に支持されて構成される。下側操作ボタン230は、その上側部分を回動支持され、ユーザは下側操作ボタン230の表面の下側を押下することで、下側操作ボタン230を筐体内に収容する方向に回動させることができる。下側操作ボタン230の表面の下端部には、回動軸から離れる向き、具体的には下向きないしは斜め下向きに張り出した突起部240が形成される。したがって突起部240は、回転軸よりも筐体裏面側に配置される。下側操作ボタン230aには突起部240aが形成され、下側操作ボタン230bには突起部240bが形成される。突起部240は、他の表面領域に対して筐体外向きに反る方向に形成されてもよい。このように突起部240を下側操作ボタン230の表面の一部を構成するように設けることで、ユーザが下側操作ボタン230を回動させる際に、最も効率的に力をかけられる位置に中指をガイドし、中指とのかかり具合を良好にして、中指が滑ってしまう状況を回避する。
下側操作ボタン230は、筐体内部から外部に露出して構成されるが、下側操作ボタン230の表面下端部に設けられた突起部240は、背面視において、その周囲の筐体部分よりも下方(裏面側)に張り出してもよい。中指を下側操作ボタン230に載せる際、中指をコントローラ200の裏面を這わせて下側操作ボタン230に到達させるユーザは少なくないと考えられる。このとき、突起部240が筐体よりも張り出してコントローラ200の外郭の一部を構成することで、裏面に沿って移動させられる中指が下側操作ボタン230に自然に到達できるようになる。
下側操作ボタン230の回動量検出手段として、静電容量式のセンサが採用されてもよい。静電容量式センサは、2つの電極間における静電容量の変化を検出して、下側操作ボタン230の回動量を検知することができる。コントローラ200において、電極間の静電容量をアナログ値として取得する検出手段が設けられ、検出手段により取得されたアナログ値が、回動量に応じたデジタル値に変換される。これにより、コントローラ200は、回動量に応じた入力値を取得することが可能となる。
他の例として、下側操作ボタン230の回動量検出手段に、抵抗変化を検出するセンサを採用してもよい。たとえば、筐体内部に所定の抵抗値で2端子間を導通している回路パターンを用意し、下側操作ボタン230の回動方向端部に導電ゴムを設ける。下側操作ボタン230が回動されると、回動方向端部に設けられた導電ゴムが筐体内部の回路パターンに接触する。導電ゴムは、回動量に応じて回路パターンとの接触面積が変化するように変形可能に形成され、これにより回動量に応じて2端子間の抵抗値が変化する。この抵抗値を検出することで、回動量を検出することができ、これによりコントローラ200は、回動量に応じた入力値を取得することが可能となる。
図16(a)および図16(b)は、実施例2にかかるコントローラ200の側面側の外観構成を示す。なお図16は、コントローラ200の右側面から見える下側操作ボタン230aを示しているが、左側面から見える下側操作ボタン230bについても同様の構造を有している。
図16(a)は、下側操作ボタン230aを回動しない状態を示し、図16(b)は、下側操作ボタン230aを最大に回動した状態を示す。下側操作ボタン230aの表面234aには、回動軸232aから離れる向きに張り出した突起部240aが形成されている。表面234aはなだらかな曲面として形成されてもよく、突起部240aは、指のひっかかり部分を構成するように、わずかに反る方向(筐体外向き)に傾斜する曲面を構成してもよい。
また突起部240aの先端部は、下側操作ボタン230aが筐体内に押し込まれるときに収容される本体部分236aの外郭部237aよりも、回動軸232aからの距離を長く設定される。本体部分236aは筐体に設けられた開口部から筐体内に収容されるが、突起部240aは、開口部に当接するように表面234aを延設して形成される。これにより、図16(b)に示すように、突起部240aは、回動されると、筐体の外表面、具体的には開口部の縁部に接触して回動動作を制限するストッパとして機能する。突起部240aを設けずに、下側操作ボタン230aを回動して全体を筐体内部に押し込んだ場合には、下側操作ボタン230aと開口部との間に異物が入り込んだようなとき、下側操作ボタン230aが引き出せないような状況が発生しうる。また、他の理由で下側操作ボタン230aの全体が開口部から引き出せないような状況も発生しうる。一方、実施例2のコントローラ200のように、ストッパとして機能する突起部240aを設けることで、下側操作ボタン230aが筐体内部に完全に押し込まれないため、そのような状況を回避できるという利点がある。なお図示するように、開口部を形成する筐体外郭部分を下方に向けて傾斜させることで、下側操作ボタン230の回動量すなわちストローク量を大きくすることができる。ストローク量を大きくすることで、入力可能なアナログ値の範囲を増やすことができる。
コントローラ200は、その裏面213aの曲面を滑らかに形成されることが好ましい。図16に示す側面図において、筐体裏面における右側把持部212aはS字状の曲面を有して構成されているが、中指を下側操作ボタン230aの表面234aに置くときに、中指を筐体裏面に沿わせて移動させるような場合には、筐体裏面をなだらかに形成しておくことで、中指を移動させやすくできる。このとき、下側操作ボタン230a近傍の裏面213aから中指をスムーズに下側操作ボタン230aに移動可能とするために、下側操作ボタン230a近傍の裏面の延長線上に、ばねにより筐体外向きに付勢された状態の突起部240aが配置されるようにしてもよい。
図17は、コントローラ200の裏面側の外観構成を示す。裏面において、右側把持部212aおよび左側把持部212bと、筐体裏面中央部分との間はなだらかに構成され、把持部と中央部分との間の接続部に段差を設けないことが好ましい。これにより、前記したように、指の移動をスムーズに行うことが可能となる。また、右側把持部212aおよび左側把持部212bに挟まれる中央部分は、全体として平坦に形成される。またコントローラ200はバッテリを内蔵しており、裏面にはバッテリ用蓋216が設けられる。バッテリはバッテリ用蓋216を取り外して交換することができる。
図18は、実施例2におけるコントローラ200の変形例を示す。図15に示すコントローラ200と比較すると、下側操作ボタン230a、230bを、図18に示すコントローラ200ではそれぞれ下側操作ボタン260a、260bに置き換えており、他の構造は図15に示す構造と同一である。なお下側操作ボタン260は、下側操作ボタン230と同様にトリガー式のボタンとして構成されており、その基本構造は下側操作ボタン230に関連して説明したとおりである。
下側操作ボタン260aおよび下側操作ボタン260bは、筐体背面長手方向の左右対称な位置にそれぞれ設けられる。ユーザが右側把持部212a、左側把持部212bを把持した状態で、下側操作ボタン260aおよび下側操作ボタン260bは、それぞれ右手および左手の中指で操作される位置に形成される。
下側操作ボタン260は、回動可能な入力インタフェースであって、回動量に応じたアナログ入力を可能とする。下側操作ボタン260は、回動軸により回動可能に支持された状態で、ばねなどにより筐体外向きに付勢されている。これにより、ユーザから押下されない状態では、下側操作ボタン230が筐体から離れる方向に付勢され、その位置を維持する。
図18に示すコントローラ200において、下側操作ボタン260は、筐体背面29の長手方向に実質的に垂直に設けられた回転軸により回動可能に支持されて構成される。下側操作ボタン260は、筐体長手方向における内側部分を回動支持され、ユーザは下側操作ボタン260の表面の外側を押下することで、下側操作ボタン260を筐体内に収容する方向に回動させることができる。下側操作ボタン260の表面の外側端部には、回動軸から離れる向きに張り出した突起部262が形成される。したがって突起部262は、回転軸よりも筐体側面側に配置される。下側操作ボタン260aには突起部262aが形成され、下側操作ボタン260bには突起部262bが形成される。突起部262は、他の表面領域に対して筐体外向きに反る方向に形成されてもよい。このように突起部240を下側操作ボタン230の表面の一部を構成するように設けることで、ユーザが下側操作ボタン230を回動させる際に、中指とのかかり具合を良好にし、中指が滑ってしまう状況を回避する。
また突起部262の先端部は、下側操作ボタン260が筐体内に押し込まれるときに本体部分が収容される開口部に当接するように下側操作ボタン260の外表面を延設して形成される。これにより、突起部262は、回動されると、筐体の外表面、具体的には開口部の縁部に接触して回動動作を制限するストッパとして機能する。
この変形例においては、下側操作ボタン260の突起部262を、筐体背面29長手方向の外向きに張り出すようにしたことで、手の小さい子供であっても容易に下側操作ボタン260を操作できるようになる。
図4に示すコントローラの内部構成に加えて、コントローラ200は、さらに3軸方向の加速度センサおよびジャイロセンサを有してもよい。
図19は、実施例2にかかるコントローラ200の内部構成を示す。図19では、図4に示す入力受付部52、PWM制御部54、駆動部56などの構成の図示は省略している。コントローラ200は、XYZの3軸方向の加速度成分を検出する3軸加速度センサ300と、筐体水平面(XZ平面)における角速度を検出するジャイロセンサ302を備える。なお、ここでは、筐体の長手方向をX軸、高さ方向をY軸、短手方向(奥行き方向)をZ軸と設定している。ジャイロセンサ302は、筐体内中央領域に配置され、たとえば図2に示す筐体上面図におけるLED付きボタン31の下方近傍に配置される。また3軸加速度センサ300も同様に筐体中央付近に配置されるのが好ましい。3軸加速度センサ300およびジャイロセンサ302による検出値は所定の周期でメイン制御部50から無線通信モジュール58に供給される。無線通信モジュール58は、3軸加速度センサ300およびジャイロセンサ302による検出値を、方向キー21や操作ボタン26などの操作入力とともに、所定の周期でゲーム装置10の無線通信モジュール108に送信する。
図20は、実施例2にかかるゲーム装置10の構成を示す。ゲーム装置10は、無線通信モジュール108にて、コントローラ200において3軸加速度センサ300およびジャイロセンサ302により計測された3軸方向の加速度成分および筐体水平面(XZ平面)に垂直な方向(Y軸方向)回りの角速度成分を取得する。3軸加速度成分および角速度成分は、無線通信モジュール108から位置推定部250に供給される。位置推定部250は、取得した3軸加速度成分および角速度成分をもとに、コントローラ200の位置や姿勢を推定できる。具体的に位置推定部250は、3軸加速度成分をもとに、コントローラ200の姿勢を取得できる。また、3軸加速度成分を1回積分することで移動速度を取得することができ、また2回積分することで位置を取得することができる。
なお実施例2のコントローラ200では、Y軸方向回りの角速度成分をジャイロセンサ302により検出している。したがって位置推定部250は、ジャイロセンサ302による検出値をもとに、コントローラ200の水平面における回転状態すなわち回転姿勢を推定してもよい。なお、3軸加速度センサ300が高精度に3軸加速度成分を取得できる場合には、コントローラ200の水平面における回転状態を3軸加速度成分から推定できるようにしてもよい。
以上のように、コントローラ200が3軸加速度センサ300およびジャイロセンサ302を備えることによって、撮像装置2によるフレーム画像の解析を行わなくても、コントローラ200の位置および姿勢を取得することが可能となる。なお、実施例1に関連して説明した撮像装置2によるフレーム画像の解析結果を更に利用して、コントローラ200の位置および姿勢の推定精度を高めるようにしてもよい。実施例2においてもゲーム装置10は、3軸加速度センサ300などを備えたコントローラ200の位置および姿勢を推定できるため、実施例1で説明したように、コントローラ200の位置および姿勢情報をゲームアプリケーションの処理に反映することが可能となる。したがって、実施例1において例示したゲームアプリケーションを、コントローラ200を採用したゲームシステム1において実現することが可能である。
以下では、コントローラ20ないしコントローラ200の位置および姿勢を取得できることを前提として、実施例1および実施例2にかかるゲームシステムにおいて実施することのできるアプリケーション例を示す。以下、コントローラを代表して、コントローラ200に関する説明を行う。ゲーム装置10は、3軸加速度成分および角速度成分をもとにコントローラ200の姿勢および位置を推定することになるが、実施例1で説明したコントローラ20に関しても撮像画像から姿勢および位置を推定できるため、以下の内容は、コントローラ20についても実現可能である。
まず、コントローラ200を動かすことでゲーム装置10に直観的な操作入力を行う例を示す。以下に、ゲームアプリケーションにおいて、ゲームオブジェクト(キャラクタ)を動作させる2つの操作入力例を示す。1つめの例は、ゲームオブジェクトを移動させる場合であり、2つめの例は、ゲームオブジェクトの姿勢を変化させる場合である。
なお上記したように、コントローラ200において、筐体の長手方向をX軸、高さ方向をY軸、短手方向(奥行き方向)をZ軸と設定する。以下、この方向を、それぞれ筐体X軸、筐体Y軸、筐体Z軸と呼ぶ。またゲームアプリケーションにおいては、画像表示装置3の画面中、横方向をX軸、縦方向をY軸、奥行き方向をZ軸と設定している。以下、これらの方向を、それぞれ画面X軸、画面Y軸、画面Z軸と呼ぶ。
1つめの例として、ゲームオブジェクトをゲーム空間上で移動させる場合、コントローラ200を左右に傾けることで、ゲーム装置10は、ゲームオブジェクトを画面X軸方向に動かすようにする。このときアプリケーション処理部110は、筐体X軸方向および筐体Y軸方向の加速度成分によりコントローラ200の左右方向の傾きを測定し、ゲームアプリケーションの処理に反映する。また、コントローラ200を前後に傾けることで、ゲーム装置10は、ゲームオブジェクトを画面Z軸方向に動かすようにする。このときアプリケーション処理部110は、筐体Y軸方向および筐体Z軸方向の加速度成分によりコントローラ200の前後方向の傾きを測定し、ゲームアプリケーションの処理に反映する。また、コントローラ200を瞬間的に前後に傾けて元の姿勢に戻すことで、ゲーム装置10は、ゲームオブジェクトを画面Y軸方向に動かすようにする。このときアプリケーション処理部110は、筐体Y軸方向および筐体Z軸方向の加速度成分の所定時間内の変化によりコントローラ200の瞬間的な前後方向の傾きを測定し、ゲームアプリケーションの処理に反映する。コントローラ200の傾きが所定の閾値を超えたことを、ゲームオブジェクトを画面Y軸方向に移動させるトリガとしてもよく、また段階的に設定した閾値と実際の瞬時的な傾き値とを比較して、画面Y軸方向の移動量を決定してもよい。なお、以上は、ゲームオブジェクトを画面中で直接移動させる例であるが、ゲームオブジェクトの背景画像を移動させることで、ゲームオブジェクトが画面中で移動するようにしてもよい。
2つめの例として、ゲームオブジェクトの姿勢をゲーム空間上で変化させる場合、コントローラ200を左右に傾けることで、ゲーム装置10は、ゲームオブジェクトの姿勢を画面X軸方向で傾けるようにする。このときアプリケーション処理部110は、筐体X軸方向および筐体Y軸方向の加速度成分によりコントローラ200の左右方向の傾きを測定し、ゲームアプリケーションの処理に反映する。また、コントローラ200を前後に傾けることで、ゲーム装置10は、ゲームオブジェクトの姿勢を画面Z軸方向で傾けるようにする。このときアプリケーション処理部110は、筐体Y軸方向および筐体Z軸方向の加速度成分によりコントローラ200の前後方向の傾きを測定し、ゲームアプリケーションの処理に反映する。なお、ゲームオブジェクトの自然な姿勢を保持するという観点から、左右方向または前後方向に傾けられたゲームオブジェクトの姿勢は、コントローラ200が傾いた姿勢を保持した場合であっても、所定の条件を満足した場合には元に戻してもよい。たとえば、コントローラ200が所定時間傾いた姿勢を保持したとき、コントローラ200の姿勢にかかわらず、アプリケーション処理部110は、ゲームオブジェクトの姿勢を元に戻してもよい。また、コントローラ200が所定の閾値を超える角度だけ傾けられた場合には、所定の閾値を超えたことをもって、ゲームオブジェクトの姿勢を元に戻してもよい。
以上示した2つの直観的な操作入力スキームは、アプリケーションごとに使い分けられる。すなわち、ロールプレイングゲームのようにゲームキャラクタをゲーム空間上で移動させるゲームの場合は、1つめの例として示した操作入力スキームを利用することができる。また、サーキットでオートバイを走らせるゲームのようにゲームキャラクタの姿勢で進行方向を定めるゲームの場合は、2つめの例として示した操作入力スキームを利用することができる。このように、操作入力スキームをゲームアプリケーションごとに設定することで、コントローラ200を傾けるなどの動作により直観的な操作入力が実現可能となる。
なお、コントローラ200の傾き情報をアプリケーションに反映させる程度は、アプリケーションごとに設定されてよい。具体的に、アプリケーションが異なれば、コントローラ200の傾きに応じてゲームキャラクタを傾ける程度が異なってよい。これは、アプリケーションごとに、コントローラ200の傾きとゲームキャラクタの傾きとを対応付けるテーブルを設定することで実現される。
アプリケーション処理部110は、コントローラ200の位置および姿勢情報をゲームアプリケーションの処理に反映させる際、その基準位置および基準姿勢を動的に設定することも可能である。多くの場合、ユーザは、コントローラ200を実空間にて水平となるようにコントローラ200を把持すると考えられる。しかしながら、利き手や個人的な癖などにより、コントローラ200を左右方向に傾けて把持するユーザも存在する。そのような場合に、アプリケーション処理部110が、上記した操作入力スキームによりコントローラ200の位置および姿勢情報を処理すると、たとえばゲームキャラクタが常に画面X軸方向に移動したり、また画面X軸方向に傾いたりすることになる。コントローラ200を前後方向に傾けて把持する場合も同様である。そのため、ユーザの個性による基準位置や基準姿勢をアプリケーション処理部110側で把握し、設定できるようにしてもよい。
たとえばアプリケーション処理部110は、コントローラ200が動かされていない状態が所定時間以上継続して、次に動きを検出した場合に、動かされていない状態における姿勢および位置を、そのコントローラ200の基準姿勢および基準位置として設定してもよい。コントローラ200が動かされていない状態とは、3軸加速度成分および角速度成分の変化が所定の閾値以下であるような場合も含む。たとえば、ユーザが、ある場所でゲームプレイをしており、何らかの事情で場所を移動したような場合、プレイ場所が変われば画像表示装置3との距離も変わるため、把持するコントローラ200の姿勢や位置も変化する。このような場合、所定時間継続して静止しているときのコントローラ200の姿勢および位置を、そのコントローラ200の基準姿勢および基準位置として都度設定することで、その基準姿勢および基準位置からの差分として取得されるコントローラ200の姿勢および位置情報をゲームアプリケーションの操作入力として適切に反映することが可能となる。
たとえばゲーム開始時にはコントローラ200を傾けていない状態を基準姿勢としてデフォルト設定しておき、ゲーム途中でその基準姿勢を逐次キャリブレーションすることで、ユーザの状況に応じた基準姿勢を取得できる。長時間のゲームプレイを行う場合、手が疲れてコントローラ200が前傾することが多いが、そのような場合でも基準姿勢をキャリブレーションすることで、基準姿勢を更新することができる。なお、基準姿勢を取得するタイミングを、操作ボタンの操作によりユーザ側からゲーム装置10に指示できるようにしてもよい。
以上の基準姿勢および基準位置の取得処理はアプリケーション処理部110で実行するとしたが、コントローラ200側で実行することも可能である。この場合、コントローラ200は、自身の基準姿勢および基準位置を演算により導出して、アプリケーション処理部110に送信することになる。この演算処理は、メイン制御部50により実行される。
なお、以上の基準姿勢および基準位置の取得処理は、コントローラ200が所定時間の不動状態の後に動かされたことを契機としたが、不動状態が所定時間続いた場合に、コントローラ200が置かれて放置されたものと判定することも可能である。たとえば、ゲーム中のユーザが所用によりコントローラ200を置いてゲームを中断するような場合である。このようなときには、アプリケーション処理部110は、コントローラ200が水平に載置されているものと判断して、そのときの位置および姿勢を取得してもよい。このときアプリケーション処理部110が、不動状態にある姿勢を、水平状態にあるコントローラ200の姿勢として取得する。なお、アプリケーション処理部110は、以前に取得した姿勢と大きく異なる場合は、水平に置かれていないと判断して、取得した姿勢情報をキャンセルしてもよい。
アプリケーション処理部110は、コントローラ200が特定の姿勢をとった場合に、その姿勢に応じた処理を実行してもよい。たとえばコントローラ200が逆さの状態にされたときに、画像表示装置3にメニュー画面を表示させるようにしてもよい。また、ユーザがコントローラ200を手にとったときに、画像表示装置3にメニュー画面を表示させるようにしてもよい。たとえば、長時間動きのなかったコントローラ200が動いたことが検出された場合に、コントローラ200がユーザの手にとられたことが判定されてもよい。
なお、コントローラ200が自身の動きを判断して、ゲーム装置10に動作指示を行うことも可能である。たとえば、コントローラ200が逆さの状態にされたとき、メイン制御部50は、3軸加速度センサ300の検出値によりその状態を検出し、ゲーム装置10に対してメニュー画面を表示するような指示を生成してもよい。また、ユーザがコントローラ200を手にとったときに、メイン制御部50は、3軸加速度センサ300の検出値によりその状態を検出し、ゲーム装置10に対してメニュー画面を表示するような指示を生成してもよい。これらの指示は無線通信モジュール58から送信される。また、別の処理を割り当てることも可能であり、コントローラ200が逆さの状態にされたとき、メイン制御部50は、自身のメイン電源を自律的に起動してもよい。この場合、メイン電源がオフであっても、メイン制御部50が3軸加速度センサ300の検出値を取得して、特定の姿勢にあることを判断できることが前提となる。
コントローラ200は、2軸方向(X軸、Z軸)のアナログ入力を可能とするアナログスティック27だけでなく、3軸方向の加速度成分を検出する3軸加速度センサ300を有することで、これらを用いた操作入力をアプリケーションの様々な処理に反映できる。
1・・・ゲームシステム、2・・・撮像装置、3・・・画像表示装置、4・・・音声出力装置、10・・・ゲーム装置、20・・・コントローラ、29・・・筐体背面、30・・・筐体上面、31・・・LED付きボタン、40・・・LED、40a・・・第1LED、40b・・・第2LED、40c・・・第3LED、40d・・・第4LED、42・・・LED配設領域、50・・・メイン制御部、52・・・入力受付部、54・・・PWM制御部、54a・・・第1PWM制御部、54b・・・第2PWM制御部、54c・・・第3PWM制御部、54d・・・第4PWM制御部、56・・・駆動部、58・・・無線通信モジュール、60・・・処理部、100・・・入力部、102・・・画像処理部、104・・・位置推定部、106・・・点滅指示部、108・・・無線通信モジュール、110・・・アプリケーション処理部、112・・・出力部、130・・・フレーム画像取得部、132・・・現フレームバッファ、134・・・前フレームバッファ、136・・・差分画像生成部、138・・・2値化画像生成部、140・・・論理演算部、142・・・LED画像抽出部、200・・・コントローラ、210・・・LED、230・・・下側操作ボタン、232a・・・回動軸、240・・・突起部、250・・・位置推定部、260・・・下側操作ボタン、262a・・・突起部、300・・・3軸加速度センサ、302・・・ジャイロセンサ。