(58)【調査した分野】(Int.Cl.,DB名)
右目用の実カメラおよび左目用の実カメラからの出力を利用して、立体視可能な立体表示装置の画面に、3次元の仮想オブジェクトを合成した実世界画像を立体表示する画像表示プログラムであって、コンピュータを、
前記右目用の実カメラから出力される実世界画像データと前記左目用の実カメラから出力される実世界画像データのうち、一方の実カメラから出力される実世界画像データ内の所定の撮像対象を認識することにより、当該一方の実カメラと前記所定の撮像対象との間の相対的な位置および姿勢を示す位置姿勢情報を算出する第1位置姿勢算出手段、
前記第1位置姿勢算出手段によって算出された前記位置姿勢情報を用いて、所定の仮想空間における右目用の画像を生成するための右仮想カメラと左目用の画像を生成するための左仮想カメラの両方についての位置および姿勢を決定する仮想カメラ設定手段、
前記右仮想カメラから見た前記仮想空間を示す右仮想空間画像を生成する右仮想空間画像生成手段、
前記左仮想カメラから見た前記仮想空間を示す左仮想空間画像を生成する左仮想空間画像生成手段、および、
前記右目用の実カメラから出力される実世界画像データに前記右仮想空間画像を合成し、かつ、前記左目用の実カメラから出力される実世界画像データに前記左仮想空間画像を合成して、前記立体表示装置に立体視のための画像出力を行う表示制御手段として機能させ、
前記仮想カメラ設定手段は、前記右仮想カメラと前記左仮想カメラとの間の相対姿勢の関係が、前記右目用の実カメラおよび前記左目用の実カメラとの間の設計上の相対姿勢の関係と同一になるように、前記右仮想カメラと前記左仮想カメラの位置および姿勢を決定する、画像表示プログラム。
前記第1位置姿勢算出手段は、前記一方の実カメラから出力される実世界画像データに基づいて、前記所定の撮像対象を原点とした座標系で表される座標値を前記一方の実カメラを原点とした第1撮像部座標系で表される座標値へと変換するための第1変換行列を生成する第1変換行列生成手段を含み、
前記第2位置姿勢算出手段は、前記他方の実カメラから出力される実世界画像データに基づいて、前記所定の撮像対象を原点とした座標系で表される座標値を前記他方の実カメラを原点とした第2撮像部座標系で表される座標値へと変換するための第2変換行列を生成する第2変換行列生成手段を含む、請求項8に記載の画像表示プログラム。
前記仮想カメラ相対位置関係決定手段は、前記2つの実カメラから新たな実世界画像データが出力される度に、前記右仮想カメラと前記左仮想カメラの相対位置関係を算出する処理を実行し、当該処理を複数回実行することによって得られた複数回分の相対位置関係算出結果に基づいて前記右仮想カメラと前記左仮想カメラの相対位置関係を確定する、請求項6に記載の画像表示プログラム。
前記仮想カメラ相対位置関係決定手段は、前記複数回の相対位置関係算出結果が全て所定の範囲に収まっている場合にのみ、当該複数回の相対位置関係算出結果に基づいて前記右仮想カメラと前記左仮想カメラの相対位置関係を確定する、請求項10に記載の画像表示プログラム。
前記奥行距離算出手段は、前記2つの実カメラから新たな実世界画像データが出力される度に、前記2つの実カメラに対する前記所定の撮像対象の奥行距離を算出する処理を実行し、当該処理を複数回実行することによって得られた複数回分の奥行距離算出結果に基づいて前記基準奥行距離を算出する、請求項13に記載の画像表示プログラム。
前記奥行距離算出手段は、前記複数回の奥行距離算出結果が全て所定の範囲に収まっている場合にのみ、当該複数回の奥行距離算出結果に基づいて前記基準奥行距離を算出する、請求項14に記載の画像表示プログラム。
前記第1位置姿勢算出手段および前記表示制御手段によって利用される前記実世界画像データは、前記実カメラからリアルタイムに出力される実世界画像データである、請求項1に記載の画像表示プログラム。
右目用の実カメラおよび左目用の実カメラからの出力を利用して、立体視可能な立体表示装置の画面に、3次元の仮想オブジェクトを合成した実世界画像を立体表示する画像表示装置であって、
前記右目用の実カメラから出力される実世界画像データと前記左目用の実カメラから出力される実世界画像データのうち、一方の実カメラから出力される実世界画像データ内の所定の撮像対象を認識することにより、当該一方の実カメラと前記所定の撮像対象との間の相対的な位置および姿勢を示す位置姿勢情報を算出する第1位置姿勢算出手段、
前記第1位置姿勢算出手段によって算出された前記位置姿勢情報を用いて、所定の仮想空間における右目用の画像を生成するための右仮想カメラと左目用の画像を生成するための左仮想カメラの両方についての位置および姿勢を決定する仮想カメラ設定手段、
前記右仮想カメラから見た前記仮想空間を示す右仮想空間画像を生成する右仮想空間画像生成手段、
前記左仮想カメラから見た前記仮想空間を示す左仮想空間画像を生成する左仮想空間画像生成手段、および、
前記右目用の実カメラから出力される実世界画像データに前記右仮想空間画像を合成し、かつ、前記左目用の実カメラから出力される実世界画像データに前記左仮想空間画像を合成して、前記立体表示装置に立体視のための画像出力を行う表示制御手段を備え、
前記仮想カメラ設定手段は、前記右仮想カメラと前記左仮想カメラとの間の相対姿勢の関係が、前記右目用の実カメラおよび前記左目用の実カメラとの間の設計上の相対姿勢の関係と同一になるように、前記右仮想カメラと前記左仮想カメラの位置および姿勢を決定する、画像表示装置。
右目用の実カメラおよび左目用の実カメラからの出力を利用して、立体視可能な立体表示装置の画面に、3次元の仮想オブジェクトを合成した実世界画像を立体表示する画像表示システムであって、
前記右目用の実カメラから出力される実世界画像データと前記左目用の実カメラから出力される実世界画像データのうち、一方の実カメラから出力される実世界画像データ内の所定の撮像対象を認識することにより、当該一方の実カメラと前記所定の撮像対象との間の相対的な位置および姿勢を示す位置姿勢情報を算出する第1位置姿勢算出手段、
前記第1位置姿勢算出手段によって算出された前記位置姿勢情報を用いて、所定の仮想空間における右目用の画像を生成するための右仮想カメラと左目用の画像を生成するための左仮想カメラの両方についての位置および姿勢を決定する仮想カメラ設定手段、
前記右仮想カメラから見た前記仮想空間を示す右仮想空間画像を生成する右仮想空間画像生成手段、
前記左仮想カメラから見た前記仮想空間を示す左仮想空間画像を生成する左仮想空間画像生成手段、および、
前記右目用の実カメラから出力される実世界画像データに前記右仮想空間画像を合成し、かつ、前記左目用の実カメラから出力される実世界画像データに前記左仮想空間画像を合成して、前記立体表示装置に立体視のための画像出力を行う表示制御手段を備え、
前記仮想カメラ設定手段は、前記右仮想カメラと前記左仮想カメラとの間の相対姿勢の関係が、前記右目用の実カメラおよび前記左目用の実カメラとの間の設計上の相対姿勢の関係と同一になるように、前記右仮想カメラと前記左仮想カメラの位置および姿勢を決定する、画像表示システム。
右目用の実カメラおよび左目用の実カメラからの出力を利用して、立体視可能な立体表示装置の画面に、3次元の仮想オブジェクトを合成した実世界画像を立体表示する画像表示方法であって、
前記右目用の実カメラから出力される実世界画像データと前記左目用の実カメラから出力される実世界画像データのうち、一方の実カメラから出力される実世界画像データ内の所定の撮像対象を認識することにより、当該一方の実カメラと前記所定の撮像対象との間の相対的な位置および姿勢を示す位置姿勢情報を算出する第1位置姿勢算出ステップ、
前記第1位置姿勢算出ステップにおいて算出された前記位置姿勢情報を用いて、所定の仮想空間における右目用の画像を生成するための右仮想カメラと左目用の画像を生成するための左仮想カメラの両方についての位置および姿勢を決定する仮想カメラ設定ステップ、
前記右仮想カメラから見た前記仮想空間を示す右仮想空間画像を生成する右仮想空間画像生成ステップ、
前記左仮想カメラから見た前記仮想空間を示す左仮想空間画像を生成する左仮想空間画像生成ステップ、および、
前記右目用の実カメラから出力される実世界画像データに前記右仮想空間画像を合成し、かつ、前記左目用の実カメラから出力される実世界画像データに前記左仮想空間画像を合成して、前記立体表示装置に立体視のための画像出力を行う表示制御ステップを備え、
前記仮想カメラ設定ステップにおいては、前記右仮想カメラと前記左仮想カメラとの間の相対姿勢の関係が、前記右目用の実カメラおよび前記左目用の実カメラとの間の設計上の相対姿勢の関係と同一になるように、前記右仮想カメラと前記左仮想カメラの位置および姿勢を決定する、画像表示方法。
【発明を実施するための形態】
【0050】
(ゲーム装置の構成)
以下、本発明の一実施形態に係るゲーム装置について説明する。
図1〜
図3は、ゲーム装置10の外観を示す平面図である。ゲーム装置10は携帯型のゲーム装置であり、
図1〜
図3に示すように折り畳み可能に構成されている。
図1および
図2は、開いた状態(開状態)におけるゲーム装置10を示し、
図3は、閉じた状態(閉状態)におけるゲーム装置10を示している。
図1は、開状態におけるゲーム装置10の正面図であり、
図2は、開状態におけるゲーム装置10の右側面図である。ゲーム装置10は、撮像部によって画像を撮像し、撮像した画像を画面に表示したり、撮像した画像のデータを保存したりすることが可能である。また、ゲーム装置10は、交換可能なメモリカード内に記憶され、または、サーバーや他のゲーム装置から受信したゲームプログラムを実行可能であり、仮想空間に設定された仮想カメラで撮像した画像などのコンピュータグラフィックス処理により生成された画像を画面に表示したりすることができる。
【0051】
まず、
図1〜
図3を参照して、ゲーム装置10の外観構成について説明する。
図1〜
図3に示されるように、ゲーム装置10は、下側ハウジング11および上側ハウジング21を有する。下側ハウジング11と上側ハウジング21とは、開閉可能(折り畳み可能)に接続されている。本実施形態では、各ハウジング11および21はともに横長の長方形の板状形状であり、互いの長辺部分で回転可能に接続されている。
【0052】
図1および
図2に示されるように、下側ハウジング11の上側長辺部分には、下側ハウジング11の内側面(主面)11Bに対して垂直な方向に突起する突起部11Aが設けられる。また、上側ハウジング21の下側長辺部分には、上側ハウジング21の下側面から当該下側面に垂直な方向に突起する突起部21Aが設けられる。下側ハウジング11の突起部11Aと上側ハウジング21の突起部21Aとが連結されることにより、下側ハウジング11と上側ハウジング21とが、折り畳み可能に接続される。
【0053】
(下側ハウジングの説明)
まず、下側ハウジング11の構成について説明する。
図1〜
図3に示すように、下側ハウジング11には、下側LCD(Liquid Crystal Display:液晶表示装置)12、タッチパネル13、各操作ボタン14A〜14L(
図1、
図3)、アナログスティック15、LED16A〜16B、挿入口17、および、マイクロフォン用孔18が設けられる。以下、これらの詳細について説明する。
【0054】
図1に示すように、下側LCD12は下側ハウジング11に収納される。下側LCD12は横長形状であり、長辺方向が下側ハウジング11の長辺方向に一致するように配置される。下側LCD12は下側ハウジング11の中央に配置される。下側LCD12は、下側ハウジング11の内側面(主面)に設けられ、下側ハウジング11に設けられた開口部から当該下側LCD12の画面が露出される。ゲーム装置10を使用しない場合には閉状態としておくことによって、下側LCD12の画面が汚れたり傷ついたりすることを防止することができる。下側LCD12の画素数は、例えば、256dot×192dot(横×縦)であってもよい。下側LCD12は、後述する上側LCD22とは異なり、画像を(立体視可能ではなく)平面的に表示する表示装置である。なお、本実施形態では表示装置としてLCDを用いているが、例えばEL(Electro Luminescen
ce:電界発光)を利用した表示装置など、他の任意の表示装置を利用してもよい。また、下側LCD12として、任意の解像度の表示装置を利用することができる。
【0055】
図1に示されるように、ゲーム装置10は、入力装置として、タッチパネル13を備えている。タッチパネル13は、下側LCD12の画面上に装着されている。なお、本実施形態では、タッチパネル13は抵抗膜方式のタッチパネルである。ただし、タッチパネルは抵抗膜方式に限らず、例えば静電容量方式等、任意の方式のタッチパネルを用いることができる。本実施形態では、タッチパネル13として、下側LCD12の解像度と同解像度(検出精度)のものを利用する。ただし、必ずしもタッチパネル13の解像度と下側LCD12の解像度が一致している必要はない。また、下側ハウジング11の上側面には挿入口17(
図1および
図3(d)に示す点線)が設けられている。挿入口17は、タッチパネル13に対する操作を行うために用いられるタッチペン28を収納することができる。なお、タッチパネル13に対する入力は通常タッチペン28を用いて行われるが、タッチペン28に限らずユーザの指でタッチパネル13に対する入力をすることも可能である。
【0056】
各操作ボタン14A〜14Lは、所定の入力を行うための入力装置である。
図1に示されるように、下側ハウジング11の内側面(主面)には、各操作ボタン14A〜14Lのうち、十字ボタン14A(方向入力ボタン14A)、ボタン14B、ボタン14C、ボタン14D、ボタン14E、電源ボタン14F、セレクトボタン14J、HOMEボタン14K、およびスタートボタン14Lが、設けられる。十字ボタン14Aは、十字の形状を有しており、上下左右の方向を指示するボタンを有している。ボタン14B、ボタン14C、ボタン14D、ボタン14Eは、十字状に配置される。ボタン14A〜14E、セレクトボタン14J、HOMEボタン14K、およびスタートボタン14Lには、ゲーム装置10が実行するプログラムに応じた機能が適宜割り当てられる。例えば、十字ボタン14Aは選択操作等に用いられ、各操作ボタン14B〜14Eは例えば決定操作やキャンセル操作等に用いられる。また、電源ボタン14Fは、ゲーム装置10の電源をオン/オフするために用いられる。
【0057】
アナログスティック15は、方向を指示するデバイスであり、下側ハウジング11の内側面の下側LCD12より左側領域の上部領域に設けられる。
図1に示すように、十字ボタン14Aは下側LCD12より左側領域の下部領域に設けられるので、アナログスティック15は、十字ボタン14Aの上方に設けられる。また、アナログスティック15、および、十字ボタン14Aは、下側ハウジングを把持した左手の親指で操作可能な位置に設計される。また、アナログスティック15を上部領域に設けたことにより、下側ハウジング11を把持する左手の親指が自然と位置するところにアナログスティック15が配され、十字ボタン14Aは、左手の親指を少し下にずらした位置に配される。アナログスティック15は、そのキートップが、下側ハウジング11の内側面に平行にスライドするように構成されている。アナログスティック15は、ゲーム装置10が実行するプログラムに応じて機能する。例えば、3次元仮想空間に所定のオブジェクトが登場するゲームがゲーム装置10によって実行される場合、アナログスティック15は、当該所定のオブジェクトを3次元仮想空間内で移動させるための入力装置として機能する。この場合において、所定のオブジェクトはアナログスティック15のキートップがスライドした方向に移動される。なお、アナログスティック15として、上下左右および斜め方向の任意の方向に所定量だけ傾倒することでアナログ入力を可能としたものを用いても良い。
【0058】
十字状に配置される、ボタン14B、ボタン14C、ボタン14D、ボタン14Eの4つのボタンは、下側ハウジング11を把持する右手の親指が自然と位置するところに配置される。また、これらの4つのボタンと、アナログスティック15とは、下側LCD12を挟んで、左右対称に配置される。これにより、ゲームプログラムによっては、例えば、
左利きの人が、これらの4つのボタンを使用して方向指示入力をすることも可能である。
【0059】
また、下側ハウジング11の内側面には、マイクロフォン用孔18が設けられる。マイクロフォン用孔18の下部には後述する音声入力装置としてのマイク(
図6参照)が設けられ、当該マイクがゲーム装置10の外部の音を検出する。
【0060】
図3(a)は閉状態におけるゲーム装置10の左側面図であり、
図3(b)は閉状態におけるゲーム装置10の正面図であり、
図3(c)は閉状態におけるゲーム装置10の右側面図であり、
図3(d)は閉状態におけるゲーム装置10の背面図である。
図3(b)および(d)に示されるように、下側ハウジング11の上側面には、Lボタン14GおよびRボタン14Hが設けられている。Lボタン14Gは、下側ハウジング11の上面の左端部に設けられ、Rボタン14Hは、下側ハウジング11の上面の右端部に設けられる。Lボタン14GおよびRボタン14Hは、例えば、撮像部のシャッターボタン(撮影指示ボタン)として機能することができる。また、
図3(a)に示されるように、下側ハウジング11の左側面には、音量ボタン14Iが設けられる。音量ボタン14Iは、ゲーム装置10が備えるスピーカの音量を調整するために用いられる。
【0061】
図3(a)に示されるように、下側ハウジング11の左側面には開閉可能なカバー部11Cが設けられる。このカバー部11Cの内側には、ゲーム装置10とデータ保存用外部メモリ45とを電気的に接続するためのコネクタ(図示せず)が設けられる。データ保存用外部メモリ45は、コネクタに着脱自在に装着される。データ保存用外部メモリ45は、例えば、ゲーム装置10によって撮像された画像のデータを記憶(保存)するために用いられる。なお、上記コネクタおよびそのカバー部11Cは、下側ハウジング11の右側面に設けられてもよい。
【0062】
また、
図3(d)に示されるように、下側ハウジング11の上側面には、ゲーム装置10とゲームプログラムを記録した外部メモリ44を挿入するための挿入口11Dが設けられ、その挿入口11Dの内部には、外部メモリ44と電気的に着脱自在に接続するためのコネクタ(図示せず)が設けられる。当該外部メモリ44がゲーム装置10に接続されることにより、所定のゲームプログラムが実行される。なお、上記コネクタおよびその挿入口11Dは、下側ハウジング11の他の側面(例えば、右側面等)に設けられてもよい。
【0063】
また、
図1および
図3(c)に示されるように、下側ハウジング11の下側面にはゲーム装置10の電源のON/OFF状況をユーザに通知する第1LED16A、下側ハウジング11の右側面にはゲーム装置10の無線通信の確立状況をユーザに通知する第2LED16Bが設けられる。ゲーム装置10は他の機器との間で無線通信を行うことが可能であり、第1LED16Bは、無線通信が確立している場合に点灯する。ゲーム装置10は、例えば、IEEE802.11.b/gの規格に準拠した方式により、無線LANに接続する機能を有する。下側ハウジング11の右側面には、この無線通信の機能を有効/無効にする無線スイッチ19が設けられる(
図3(c)参照)。
【0064】
なお、図示は省略するが、下側ハウジング11には、ゲーム装置10の電源となる充電式電池が収納され、下側ハウジング11の側面(例えば、上側面)に設けられた端子を介して当該電池を充電することができる。
【0065】
(上側ハウジングの説明)
次に、上側ハウジング21の構成について説明する。
図1〜
図3に示すように、上側ハウジング21には、上側LCD(Liquid Crystal Display:液晶表示装置)22、外側撮像部23(外側撮像部(左)23aおよび外側撮像部(右)23b)、内側撮像部24、3D調整スイッチ25、および、3Dインジケータ26が設けら
れる。以下、これらの詳細について説明する。
【0066】
図1に示すように、上側LCD22は上側ハウジング21に収納される。上側LCD22は、横長形状であり、長辺方向が上側ハウジング21の長辺方向に一致するように配置される。上側LCD22は上側ハウジング21の中央に配置される。上側LCD22の画面の面積は、下側LCD12の画面の面積よりも大きく設定される。また、上側LCD22の画面は、下側LCD12の画面よりも横長に設定される。すなわち、上側LCD22の画面のアスペクト比における横幅の割合は、下側LCD12の画面のアスペクト比における横幅の割合よりも大きく設定される。
【0067】
上側LCD22の画面は、上側ハウジング21の内側面(主面)21Bに設けられ、上側ハウジング21に設けられた開口部から当該上側LCD22の画面が露出される。また、
図2に示すように、上側ハウジング21の内側面は、透明なスクリーンカバー27によって覆われている。当該スクリーンカバー27は、上側LCD22の画面を保護するとともに、上側LCD22と上側ハウジング21の内側面と一体的にさせ、これにより統一感を持たせている。上側LCD22の画素数は、例えば、640dot×200dot(横×縦)であってもよい。なお、本実施形態では上側LCD22は液晶表示装置であるとしたが、例えばEL(Electro Luminescence:電界発光)を利用した表示装置などが利用されてもよい。また、上側LCD22として、任意の解像度の表示装置を利用することができる。
【0068】
上側LCD22は、立体視可能な画像を表示することが可能な表示装置である。また、本実施例では、実質的に同一の表示領域を用いて左目用画像と右目用画像が表示される。具体的には、左目用画像と右目用画像が所定単位で(例えば、1列ずつ)横方向に交互に表示される方式の表示装置である。または、左目用画像と右目用画像とが交互に表示される方式の表示装置であってもよい。また、本実施例では、裸眼立体視可能な表示装置である。そして、横方向に交互に表示される左目用画像と右目用画像とを左目および右目のそれぞれに分解して見えるようにレンチキュラー方式やパララックスバリア方式(視差バリア方式)のものが用いられる。本実施形態では、上側LCD22はパララックスバリア方式のものとする。上側LCD22は、右目用画像と左目用画像とを用いて、裸眼で立体視可能な画像(立体画像)を表示する。すなわち、上側LCD22は、視差バリアを用いてユーザの左目に左目用画像をユーザの右目に右目用画像を視認させることにより、ユーザにとって立体感のある立体画像(立体視可能な画像)を表示することができる。また、上側LCD22は、上記視差バリアを無効にすることが可能であり、視差バリアを無効にした場合は、画像を平面的に表示することができる(上述した立体視とは反対の意味で平面視の画像を表示することができる。すなわち、表示された同一の画像が右目にも左目にも見えるような表示モードである)。このように、上側LCD22は、立体視可能な画像を表示する立体表示モードと、画像を平面的に表示する(平面視画像を表示する)平面表示モードとを切り替えることが可能な表示装置である。この表示モードの切り替えは、後述する3D調整スイッチ25によって行われる。
【0069】
外側撮像部23は、上側ハウジング21の外側面(上側LCD22が設けられた主面と反対側の背面)21Dに設けられた2つの撮像部(23aおよび23b)の総称である。外側撮像部(左)23aと外側撮像部(右)23bの撮像方向は、いずれも当該外側面21Dの外向きの法線方向である。また、これらの撮像部はいずれも、上側LCD22の表示面(内側面)の法線方向と180度反対の方向に設計される。すなわち、外側撮像部(左)23aの撮像方向および外側撮像部(右)23bの撮像方向は、平行である。外側撮像部(左)23aと外側撮像部(右)23bとは、ゲーム装置10が実行するプログラムによって、ステレオカメラとして使用することが可能である。また、プログラムによっては、2つの外側撮像部(23aおよび23b)のいずれか一方を単独で用いて、外側撮像
部23を非ステレオカメラとして使用することも可能である。また、プログラムによっては、2つの外側撮像部(23aおよび23b)で撮像した画像を合成してまたは補完的に使用することにより撮像範囲を広げた撮像をおこなうことも可能である。本実施形態では、外側撮像部23は、外側撮像部(左)23aおよび外側撮像部(右)23bの2つの撮像部で構成される。外側撮像部(左)23aおよび外側撮像部(右)23bは、それぞれ所定の共通の解像度を有する撮像素子(例えば、CCDイメージセンサやCMOSイメージセンサ等)と、レンズとを含む。レンズは、ズーム機構を有するものでもよい。
【0070】
図1の破線および
図3(b)の実線で示されるように、外側撮像部23を構成する外側撮像部(左)23aおよび外側撮像部(右)23bは、上側LCD22の画面の横方向と平行に並べられて配置される。すなわち、2つの撮像部を結んだ直線が上側LCD22の画面の横方向と平行になるように、外側撮像部(左)23aおよび外側撮像部(右)23bが配置される。
図1の破線で示す23aおよび23bは、上側ハウジング21の内側面とは反対側の外側面に存在する外側撮像部(左)23aおよび外側撮像部(右)23bをそれぞれ表している。
図1に示すように、ユーザが上側LCD22の画面を正面から視認した場合に、外側撮像部(左)23aは左側に外側撮像部(右)23bは右側にそれぞれ位置している。外側撮像部23をステレオカメラとして機能させるプログラムが実行されている場合、外側撮像部(左)23aは、ユーザの左目で視認される左目用画像を撮像し、外側撮像部(右)23bは、ユーザの右目で視認される右目用画像を撮像する。外側撮像部(左)23aおよび外側撮像部(右)23bの間隔は、人間の両目の間隔程度に設定され、例えば、30mm〜70mmの範囲で設定されてもよい。なお、外側撮像部(左)23aおよび外側撮像部(右)23bの間隔は、この範囲に限らない。
【0071】
なお、本実施例においては、外側撮像部(左)23aおよび外側撮像部(右)23はハウジングに固定されており、撮像方向を変更することはできない。
【0072】
また、外側撮像部(左)23aおよび外側撮像部(右)23bは、上側LCD22(上側ハウジング21)の左右方向に関して中央から対称となる位置にそれぞれ配置される。すなわち、外側撮像部(左)23aおよび外側撮像部(右)23bは、上側LCD22を左右に2等分する線に対して対称の位置にそれぞれ配置される。また、外側撮像部(左)23aおよび外側撮像部(右)23bは、上側ハウジング21を開いた状態において、上側ハウジング21の上部であって、上側LCD22の画面の上端よりも上方の位置の裏側に配置される。すなわち、外側撮像部(左)23aおよび外側撮像部(右)23bは、上側ハウジング21の外側面であって、上側LCD22を外側面に投影した場合、投影した上側LCD22の画面の上端よりも上方に配置される。
【0073】
このように、外側撮像部23の2つの撮像部(23aおよび23b)が、上側LCD22の左右方向に関して中央から対称の位置に配置されることにより、ユーザが上側LCD22を正視した場合に、外側撮像部23の撮像方向をユーザの視線方向と一致させることができる。また、外側撮像部23は、上側LCD22の画面の上端より上方の裏側の位置に配置されるため、外側撮像部23と上側LCD22とが上側ハウジング21の内部で干渉することがない。従って、外側撮像部23を上側LCD22の画面の裏側に配置する場合と比べて、上側ハウジング21を薄く構成することが可能となる。
【0074】
内側撮像部24は、上側ハウジング21の内側面(主面)21Bに設けられ、当該内側面の内向きの法線方向を撮像方向とする撮像部である。内側撮像部24は、所定の解像度を有する撮像素子(例えば、CCDイメージセンサやCMOSイメージセンサ等)と、レンズとを含む。レンズは、ズーム機構を有するものでもよい。
【0075】
図1に示すように、内側撮像部24は、上側ハウジング21を開いた状態において、上
側ハウジング21の上部であって、上側LCD22の画面の上端よりも上方に配置され、上側ハウジング21の左右方向に関して中央の位置(上側ハウジング21(上側LCD22の画面)を左右に2等分する線の線上)に配置される。具体的には、
図1および
図3(b)に示されるように、内側撮像部24は、上側ハウジング21の内側面であって、外側撮像部23の左右の撮像部(外側撮像部(左)23aおよび外側撮像部(右)23b)の中間の裏側の位置に配置される。すなわち、上側ハウジング21の外側面に設けられた外側撮像部23の左右の撮像部を上側ハウジング21の内側面に投影した場合、当該投影した左右の撮像部の中間に、内側撮像部24が設けられる。
図3(b)で示される破線24は、上側ハウジング21の内側面に存在する内側撮像部24を表している。
【0076】
このように、内側撮像部24は、外側撮像部23とは反対方向を撮像する。内側撮像部24は、上側ハウジング21の内側面であって、外側撮像部23の左右の撮像部の中間位置の裏側に設けられる。これにより、ユーザが上側LCD22を正視した際、内側撮像部24でユーザの顔を正面から撮像することができる。また、外側撮像部23の左右の撮像部と内側撮像部24とが上側ハウジング21の内部で干渉することがないため、上側ハウジング21を薄く構成することが可能となる。
【0077】
3D調整スイッチ25は、スライドスイッチであり、上述のように上側LCD22の表示モードを切り替えるために用いられるスイッチである。また、3D調整スイッチ25は、上側LCD22に表示された立体視可能な画像(立体画像)の立体感を調整するために用いられる。
図1〜
図3に示されるように、3D調整スイッチ25は、上側ハウジング21の内側面および右側面の端部に設けられ、ユーザが上側LCD22を正視した場合に、当該3D調整スイッチ25を視認できる位置に設けられる。また、3D調整スイッチ25の操作部は、内側面および右側面の両方に突出しており、どちらからも視認および操作することができる。なお、3D調整スイッチ25以外のスイッチは全て下側ハウジング11に設けられる。
【0078】
図4は、
図1に示す上側ハウジング21のA−A’線断面図である。
図4に示すように、上側ハウジング21の内側面の右端部には、凹部21Cが形成され、当該凹部21Cに3D調整スイッチ25が設けられる。3D調整スイッチ25は、
図1および
図2に示されるように、上側ハウジング21の正面および右側面から視認可能に配置される。3D調整スイッチ25のスライダ25aは、所定方向(上下方向)の任意の位置にスライド可能であり、当該スライダ25aの位置に応じて上側LCD22の表示モードが設定される。
【0079】
図5Aから
図5Cは、3D調整スイッチ25のスライダ25aがスライドする様子を示す図である。
図5Aは、3D調整スイッチ25のスライダ25aが最下点(第3の位置)に存在する様子を示す図である。
図5Bは、3D調整スイッチ25のスライダ25aが最下点よりも上方位置(第1の位置)に存在する様子を示す図である。
図5Cは、3D調整スイッチ25のスライダ25aが最上点(第2の位置)に存在する様子を示す図である。
【0080】
図5Aに示すように、3D調整スイッチ25のスライダ25aが最下点位置(第3の位置)に存在する場合、上側LCD22は平面表示モードに設定され、上側LCD22の画面には平面画像が表示される(なお、上側LCD22を立体表示モードのままとして、左目用画像と右目用画像を同一の画像とすることにより平面表示してもよい)。一方、
図5Bに示す位置(最下点より上側の位置(第1の位置))から
図5Cに示す位置(最上点の位置(第2の位置))までの間にスライダ25aが存在する場合、上側LCD22は立体表示モードに設定される。この場合、上側LCD22の画面には立体視可能な画像が表示される。スライダ25aが第1の位置から第2の位置の間に存在する場合、スライダ25aの位置に応じて、立体画像の見え方が調整される。具体的には、スライダ25aの位置に応じて、右目用画像および左目用画像の横方向の位置のずれ量が調整される。3D調整
スイッチ25のスライダ25aは、第3の位置で固定されるように構成されており、第1の位置と第2の位置との間では上下方向に任意の位置にスライド可能に構成されている。例えば、スライダ25aは、第3の位置において、3D調整スイッチ25を形成する側面から
図5Aに示す横方向に突出した凸部(図示せず)によって固定されて、所定以上の力が上方に加わらないと第3の位置よりも上方にスライドしないように構成されている。第3の位置から第1の位置にスライダ25aが存在する場合、立体画像の見え方は調整されないが、これはいわゆるあそびである。他の例においては、あそびをなくして、第3の位置と第1の位置とを同じ位置としてもよい。また、第3の位置を第1の位置と第2の位置の間としてもよい。その場合、スライダを第3の位置から第1の位置の方向に動かした場合と、第2の方向に動かした場合とで、右目用画像および左目用画像の横方向の位置のずれ量の調整する方向が逆になる。
【0081】
3Dインジケータ26は、上側LCD22が立体表示モードか否かを示す。3Dインジケータ26は、LEDであり、上側LCD22の立体表示モードが有効の場合に点灯する。なお、3Dインジケータ26は、上側LCD22が立体表示モードになっており、かつ、立体視画像を表示するプログラム処理が実行されているとき(すなわち、3D調整スイッチが上記第1の位置から上記第2の位置にあるときに、左目用画像と右目用画像が異なるような画像処理が実行されているとき)に限り、点灯するようにしてもよい。
図1に示されるように、3Dインジケータ26は、上側ハウジング21の内側面に設けられ、上側LCD22の画面近傍に設けられる。このため、ユーザが上側LCD22の画面を正視した場合、ユーザは3Dインジケータ26を視認しやすい。従って、ユーザは上側LCD22の画面を視認している状態でも、上側LCD22の表示モードを容易に認識することができる。
【0082】
また、上側ハウジング21の内側面には、スピーカ孔21Eが設けられる。後述するスピーカ43からの音声がこのスピーカ孔21Eから出力される。
【0083】
(ゲーム装置10の内部構成)
次に、
図6を参照して、ゲーム装置10の内部の電気的構成について説明する。
図6は、ゲーム装置10の内部構成を示すブロック図である。
図6に示すように、ゲーム装置10は、上述した各部に加えて、情報処理部31、メインメモリ32、外部メモリインターフェイス(外部メモリI/F)33、データ保存用外部メモリI/F34、データ保存用内部メモリ35、無線通信モジュール36、ローカル通信モジュール37、リアルタイムクロック(RTC)38、加速度センサ39、電源回路40、およびインターフェイス回路(I/F回路)41等の電子部品を備えている。これらの電子部品は、電子回路基板上に実装されて下側ハウジング11(または上側ハウジング21でもよい)内に収納される。
【0084】
情報処理部31は、所定のプログラムを実行するためのCPU(Central Processing Unit)311、画像処理を行うGPU(Graphics Processing Unit)312等を含む情報処理手段である。情報処理部31のCPU311は、ゲーム装置10内のメモリ(例えば外部メモリI/F33に接続された外部メモリ44やデータ保存用内部メモリ35)に記憶されているプログラムを実行することによって、当該プログラムに応じた処理(例えば、撮影処理や、後述する画像表示処理)を実行する。なお、情報処理部31のCPU311によって実行されるプログラムは、他の機器との通信によって他の機器から取得されてもよい。また、情報処理部31は、VRAM(Video RAM)313を含む。情報処理部31のGPU312は、情報処理部31のCPU311からの命令に応じて画像を生成し、VRAM313に描画する。そして、情報処理部31のGPU312は、VRAM313に描画された画像を上側LCD22及び/又は下側LCD12に出力し、上側LCD22及び/又は下側LCD12に
当該画像が表示される。
【0085】
情報処理部31には、メインメモリ32、外部メモリI/F33、データ保存用外部メモリI/F34、および、データ保存用内部メモリ35が接続される。外部メモリI/F33は、外部メモリ44を着脱自在に接続するためのインターフェイスである。また、データ保存用外部メモリI/F34は、データ保存用外部メモリ45を着脱自在に接続するためのインターフェイスである。
【0086】
メインメモリ32は、情報処理部31(のCPU311)のワーク領域やバッファ領域として用いられる揮発性の記憶手段である。すなわち、メインメモリ32は、上記プログラムに基づく処理に用いられる各種データを一時的に記憶したり、外部(外部メモリ44や他の機器等)から取得されるプログラムを一時的に記憶したりする。本実施形態では、メインメモリ32として例えばPSRAM(Pseudo−SRAM)を用いる。
【0087】
外部メモリ44は、情報処理部31によって実行されるプログラムを記憶するための不揮発性の記憶手段である。外部メモリ44は、例えば読み取り専用の半導体メモリで構成される。外部メモリ44が外部メモリI/F33に接続されると、情報処理部31は外部メモリ44に記憶されたプログラムを読み込むことができる。情報処理部31が読み込んだプログラムを実行することにより、所定の処理が行われる。データ保存用外部メモリ45は、不揮発性の読み書き可能なメモリ(例えばNAND型フラッシュメモリ)で構成され、所定のデータを格納するために用いられる。例えば、データ保存用外部メモリ45には、外側撮像部23で撮像された画像や他の機器で撮像された画像が記憶される。データ保存用外部メモリ45がデータ保存用外部メモリI/F34に接続されると、情報処理部31はデータ保存用外部メモリ45に記憶された画像を読み込み、上側LCD22及び/又は下側LCD12に当該画像を表示することができる。
【0088】
データ保存用内部メモリ35は、読み書き可能な不揮発性メモリ(例えばNAND型フラッシュメモリ)で構成され、所定のデータを格納するために用いられる。例えば、データ保存用内部メモリ35には、無線通信モジュール36を介した無線通信によってダウンロードされたデータやプログラムが格納される。
【0089】
無線通信モジュール36は、例えばIEEE802.11.b/gの規格に準拠した方式により、無線LANに接続する機能を有する。また、ローカル通信モジュール37は、所定の通信方式(例えば独自プロトコルによる通信や、赤外線通信)により同種のゲーム装置との間で無線通信を行う機能を有する。無線通信モジュール36およびローカル通信モジュール37は情報処理部31に接続される。情報処理部31は、無線通信モジュール36を用いてインターネットを介して他の機器との間でデータを送受信したり、ローカル通信モジュール37を用いて同種の他のゲーム装置との間でデータを送受信したりすることができる。
【0090】
また、情報処理部31には、加速度センサ39が接続される。加速度センサ39は、3軸(xyz軸)方向に沿った直線方向の加速度(直線加速度)の大きさを検出する。加速度センサ39は、下側ハウジング11の内部に設けられる。加速度センサ39は、
図1に示すように、下側ハウジング11の長辺方向をx軸、下側ハウジング11の短辺方向をy軸、下側ハウジング11の内側面(主面)に対して垂直な方向をz軸として、各軸の直線加速度の大きさを検出する。なお、加速度センサ39は、例えば静電容量式の加速度センサであるとするが、他の方式の加速度センサを用いるようにしてもよい。また、加速度センサ39は1軸又は2軸方向を検出する加速度センサであってもよい。情報処理部31は、加速度センサ39が検出した加速度を示すデータ(加速度データ)を受信して、ゲーム装置10の姿勢や動きを検出することができる。
【0091】
また、情報処理部31には、RTC38および電源回路40が接続される。RTC38は、時間をカウントして情報処理部31に出力する。情報処理部31は、RTC38によって計時された時間に基づき現在時刻(日付)を計算する。電源回路40は、ゲーム装置10が有する電源(下側ハウジング11に収納される上記充電式電池)からの電力を制御し、ゲーム装置10の各部品に電力を供給する。
【0092】
また、情報処理部31には、I/F回路41が接続される。I/F回路41には、マイク42およびスピーカ43が接続される。具体的には、I/F回路41には、図示しないアンプを介してスピーカ43が接続される。マイク42は、ユーザの音声を検知して音声信号をI/F回路41に出力する。アンプは、I/F回路41からの音声信号を増幅し、音声をスピーカ43から出力させる。また、タッチパネル13はI/F回路41に接続される。I/F回路41は、マイク42およびスピーカ43(アンプ)の制御を行う音声制御回路と、タッチパネルの制御を行うタッチパネル制御回路とを含む。音声制御回路は、音声信号に対するA/D変換およびD/A変換を行ったり、音声信号を所定の形式の音声データに変換したりする。タッチパネル制御回路は、タッチパネル13からの信号に基づいて所定の形式のタッチ位置データを生成して情報処理部31に出力する。タッチ位置データは、タッチパネル13の入力面において入力が行われた位置の座標を示す。なお、タッチパネル制御回路は、タッチパネル13からの信号の読み込み、および、タッチ位置データの生成を所定時間に1回の割合で行う。情報処理部31は、タッチ位置データを取得することにより、タッチパネル13に対して入力が行われた位置を知ることができる。
【0093】
操作ボタン14は、上記各操作ボタン14A〜14Lからなり、情報処理部31に接続される。操作ボタン14から情報処理部31へは、各操作ボタン14A〜14Iに対する入力状況(押下されたか否か)を示す操作データが出力される。情報処理部31は、操作ボタン14から操作データを取得することによって、操作ボタン14に対する入力に従った処理を実行する。
【0094】
下側LCD12および上側LCD22は情報処理部31に接続される。下側LCD12および上側LCD22は、情報処理部31(のGPU312)の指示に従って画像を表示する。本実施形態では、情報処理部31は、上側LCD22に立体画像(立体視可能な画像)を表示させる。
【0095】
具体的には、情報処理部31は、上側LCD22のLCDコントローラ(図示せず)と接続され、当該LCDコントローラに対して視差バリアのON/OFFを制御する。上側LCD22の視差バリアがONになっている場合、情報処理部31のVRAM313に格納された右目用画像と左目用画像とが、上側LCD22に出力される。より具体的には、LCDコントローラは、右目用画像について縦方向に1ライン分の画素データを読み出す処理と、左目用画像について縦方向に1ライン分の画素データを読み出す処理とを交互に繰り返すことによって、VRAM313から右目用画像と左目用画像とを読み出す。これにより、右目用画像および左目用画像が、画素を縦に1ライン毎に並んだ短冊状画像に分割され、分割された右目用画像の短冊状画像と左目用画像の短冊状画像とが交互に配置された画像が、上側LCD22の画面に表示される。そして、上側LCD22の視差バリアを介して当該画像がユーザに視認されることによって、ユーザの右目に右目用画像が、ユーザの左目に左目用画像が視認される。以上により、上側LCD22の画面には立体視可能な画像が表示される。
【0096】
外側撮像部23および内側撮像部24は、情報処理部31に接続される。外側撮像部23および内側撮像部24は、情報処理部31の指示に従って画像を撮像し、撮像した画像データを情報処理部31に出力する。
【0097】
3D調整スイッチ25は、情報処理部31に接続される。3D調整スイッチ25は、スライダ25aの位置に応じた電気信号を情報処理部31に送信する。
【0098】
また、3Dインジケータ26は、情報処理部31に接続される。情報処理部31は、3Dインジケータ26の点灯を制御する。例えば、情報処理部31は、上側LCD22が立体表示モードである場合、3Dインジケータ26を点灯させる。以上がゲーム装置10の内部構成の説明である。
【0099】
(ゲーム装置10の動作の概要)
以下、本実施形態におけるゲーム装置10の動作の概要について説明する。本実施形態では、画像表示プログラムに基づいて、外側撮像部23(外側撮像部(左)23a、外側撮像部(右)23b)によって現在撮像されている実世界の画像と、3次元の仮想空間に存在する仮想オブジェクトの画像とを合成した合成画像が、上側LCD22の画面に立体視可能に表示される。
【0100】
(実世界画像の立体視表示)
外側撮像部23で撮影された2つの撮影画像は所定の視差を有するように上側LCDに供給されて立体視表示される。
【0101】
図7は、外側撮像部23によって3つのボール60a〜60c(実オブジェクト)が撮像されているときに上側LCD22の画面に表示される立体画像の一例を示している。外側撮像部23によって3つのボール60a〜60cが撮像されると、上側LCD22には、これらのボール60a〜60cが立体視可能に表示される。
図7に示されるように、上側LCD22の画面上では、外側撮像部23に最も近いボール60aが最も手前に位置するようにユーザに視認され、外側撮像部23から最も遠いボール60cが最も遠くに位置するようにユーザに視認される。なお、
図7では、理解を容易にするために、上側LCD22の画面からボールをはみ出して図示しているが、実際にはボールは画面内に表示される。後述の
図8や
図10についても同様である。なお、
図7では、後述するマーカー61(
図8参照)が外側撮像部23によって撮像されていないため、上側LCD22の画面には仮想オブジェクトは表示されていない。また、
図7、
図8、
図10等においては、表示対象が飛び出ているように視認される様子を図示しているが、立体視可能に表示する、と言った場合、必ずしも飛び出し方向に視認される場合のみでなく、画面より奥側に、奥行きを持って表示される場合も含む。
【0102】
(実世界画像およびCG画像の立体視表示)
図8は、外側撮像部23によってマーカー61(実オブジェクト)が撮像されているときに上側LCD22の画面に表示される立体画像の一例を示している。
図8に示すように、マーカー61には、矢印を含む正方形が描かれており、CPU311は、外側撮像部23から取得される画像に対して例えばパターンマッチング等の画像処理を行うことによって、当該画像にマーカーが含まれているか否かを判定することができる。外側撮像部23によってマーカー61が撮像されているときには、上側LCD22には、実世界画像としてマーカー61が立体視可能に表示されるとともに、マーカー61の位置に仮想オブジェクト62(例えば犬を模した仮想オブジェクト)が立体視可能に合成表示される。なお、
図9に示すように、マーカー61には向き(前方向、右方向、上方向)が定義されており、マーカー61の姿勢に応じた姿勢で仮想オブジェクトを配置することができる。例えば、仮想オブジェクト62の前方向がマーカー61の前方向と一致するように、マーカー61の上に仮想オブジェクト62を配置することが可能である。
【0103】
図10は、外側撮像部23によってマーカー61が撮像されているときに上側LCD2
2の画面に表示される立体画像の他の一例を示している。このように、ユーザーがゲーム装置10を移動させることによって、上側LCD22の画面に表示されるマーカー61の位置および向きが変化すると、それに追従するように、仮想オブジェクト62の位置および向きが変化する。よって、ユーザーには仮想オブジェクト62があたかも実世界に本当に存在しているかのように見える。
【0104】
以下、
図11〜
図40を参照して、ゲーム装置10において画像表示プログラムに基づいて実行される画像表示処理の詳細について説明する。
【0105】
(メモリマップ)
まず、画像表示処理の際にメインメモリ32に記憶される主なデータについて説明する。
図11は、ゲーム装置10のメインメモリ32のメモリマップを示す図である。
図11に示されるように、メインメモリ32には、画像表示プログラム70、最新左実世界画像71L、最新右実世界画像71R、表示用左実世界画像72L、表示用右実世界画像72R、立体視ゼロ距離73、仮想オブジェクト情報74、左変換行列75L、右変換行列75R、左ビュー行列76L、右ビュー行列76R、左射影行列77L、右射影行列77R、表示モード78、マーカー認識モード79、メイン実世界画像識別情報80、各種変数81等が記憶される。
【0106】
画像表示プログラム70は、CPU311に上記画像表示処理を実行させるためのプログラムである。
【0107】
最新左実世界画像71Lは、外側撮像部(左)23aによって撮像された最新の画像である。
【0108】
最新右実世界画像71Rは、外側撮像部(右)23bによって撮像された最新の画像である。
【0109】
表示用左実世界画像72Lは、外側撮像部(左)23aによって撮像された画像のうち、上側LCD22に表示されることが決定された最新の画像である。
【0110】
表示用右実世界画像72Rは、外側撮像部(右)23bによって撮像された画像のうち、上側LCD22に表示されることが決定された最新の画像である。
【0111】
立体視ゼロ距離73は、外側撮像部23から撮影方向にどれだけの距離だけ離れた物体が、上側LCD22の画面に立体表示されたときに上側LCD22の画面と同じ奥行き位置にあるように視認されるかを示す変数であり、例えば、センチメートルの単位で表される。本実施形態では、立体視ゼロ距離73は25cmで固定とするが、これは単なる一例に過ぎず、ユーザーの指示に応じて、またはコンピュータによって自動的に、立体視ゼロ距離73を随時変更するようにしても構わない。立体視ゼロ距離73は、マーカー61からの距離や、外側撮像部23とマーカー61の間の距離における比で指定しても構わない。また、必ずしも現実空間の距離として指定せず、仮想空間における距離で指定してもよい。マーカー61のサイズが既知のときなどには、実世界における長さの単位と仮想空間における長さの単位とを一致させることができる。このように両者の単位を一致させることができる場合には、立体視ゼロ距離73を実世界における長さの単位で設定できる。しかしながら、両者の単位を一致させることができない場合には、立体視ゼロ距離73を仮想空間における長さの単位で設定してもよい。なお、後述の通り、本実施形態においては、マーカー61のサイズを用いずに、実世界における長さの単位と仮想空間における長さの単位とを一致させることができる。
【0112】
仮想オブジェクト情報74は、前述の仮想オブジェクト62に関連する情報であって、仮想オブジェクト62の形状を表す3Dモデルデータ(ポリゴンデータ)や、仮想オブジェクト62の模様を表すテクスチャデータや、仮想空間における仮想オブジェクト62の位置や姿勢の情報などを含む。
【0113】
左変換行列75Lは、左実世界画像におけるマーカー61の位置および姿勢を認識することにより計算される行列であり、マーカー61の位置および姿勢を基準として設定される座標系(マーカー座標系)で表された座標を外側撮像部(左)23aの位置および姿勢を基準として表された座標系(外側撮像部(左)座標系)に変換する座標変換行列である。左変換行列75Lは、マーカー61の位置および姿勢に対する外側撮像部(左)23aの相対的な位置および姿勢の情報を含む行列であり、より具体的には、マーカー座標系における外側撮像部(左)23aの位置および姿勢の情報を含む行列である。
【0114】
右変換行列75Rは、右実世界画像におけるマーカー61の位置および姿勢を認識することにより計算される行列であり、マーカー座標系で表された座標を外側撮像部(右)23bの位置および姿勢を基準として表された座標系(外側撮像部(右)座標系)に変換する座標変換行列である。右変換行列75Rは、マーカー61の位置および姿勢に対する外側撮像部(右)23bの相対的な位置および姿勢の情報を含む行列であり、より具体的には、マーカー座標系における外側撮像部(右)23bの位置および姿勢の情報を含む行列である。
【0115】
なお、本明細書において、マーカー座標系から外側撮像部(左)座標系または外側撮像部(右)座標系への変換行列のことを「マーカー・カメラ変換行列」と呼ぶ。左変換行列75Lおよび右変換行列75Rは「マーカー・カメラ変換行列」である。
【0116】
左ビュー行列76Lは、左仮想カメラから見た仮想オブジェクト62を描画する際に用いられる行列であり、仮想世界のワールド座標系で表された座標を左仮想カメラ座標系で表された座標へと変換するための座標変換行列である。左ビュー行列76Lは、仮想世界のワールド座標系における左仮想カメラの位置および姿勢の情報を含む行列である。
【0117】
右ビュー行列76Rは、右仮想カメラから見た仮想オブジェクト62を描画する際に用いられる行列であり、仮想世界のワールド座標系で表された座標を右仮想カメラ座標系で表された座標へと変換するための座標変換行列である。右ビュー行列76Rは、仮想世界のワールド座標系における右仮想カメラの位置および姿勢の情報を含む行列である。
【0118】
左射影行列77Lは、左仮想カメラから見た仮想世界(仮想世界に存在する仮想オブジェクト62)を描画する際に用いられる行列であり、左仮想カメラ座標系で表された座標をスクリーン座標系で表された座標へと変換するための座標変換行列である。
【0119】
右射影行列77Rは、右仮想カメラから見た仮想世界(仮想世界に存在する仮想オブジェクト62)を描画する際に用いられる行列であり、右仮想カメラ座標系で表された座標をスクリーン座標系で表された座標へと変換するための座標変換行列である。
【0120】
表示モード78は、現在の処理モードを示すデータであって、より具体的には、実世界画像と仮想空間画像とを同期させて合成表示する同期表示モードか、実世界画像と仮想空間画像とを同期させずに合成表示する非同期表示モードかを示すデータである。
【0121】
マーカー認識モード79は、現在の処理モードを示すデータであって、より具体的には、左実世界画像と右実世界画像のいずれか一方のみに対してマーカー認識処理を行う片画像認識モードか、左実世界画像と右実世界画像の両方に対してそれぞれマーカー認識処理
を行う両画像認識モードかを示すデータである。
【0122】
メイン実世界画像識別情報80は、左実世界画像と右実世界画像のいずれがメイン実世界画像なのかを示すデータである。上記の片画像認識モードでは、メイン実世界画像に対してのみマーカー認識処理が行われ、他方の実世界画像(以下、サブ実世界画像と称す)に対してはマーカー認識処理は行われない。
【0123】
各種変数81は、画像表示プログラム70の実行の際に用いられる変数であって、
図12に示すような変数を含む。これらの変数の意味については、以下の説明において随時説明する。
【0124】
ゲーム装置10の電源が投入されると、ゲーム装置10の情報処理部31(CPU311)は、図示しないROMに記憶されている起動プログラムを実行し、これによってメインメモリ32等の各ユニットが初期化される。次に、データ保存用内部メモリ35に記憶された画像表示プログラムがメインメモリ32に読み込まれ、情報処理部31のCPU311によって当該画像表示プログラムの実行が開始される。
【0125】
以下、
図13〜
図19のフローチャートを参照して、画像表示プログラムに基づいて実行される処理の流れを説明する。なお、
図13〜
図19のフローチャートは、単なる一例に過ぎない。したがって、同様の結果が得られるのであれば、各ステップの処理順序を入れ替えてもよい。また、変数の値や、判断ステップで利用される閾値も、単なる一例に過ぎず、必要に応じて他の値を採用してもよい。また、本実施形態では、
図13〜
図19のフローチャートの全てのステップの処理をCPU311が実行するものとして説明するが、
図13〜
図19のフローチャートの一部のステップの処理を、CPU311以外のプロセッサや専用回路が実行するようにしてもよい。
【0126】
(マーカー処理)
図13は、画像表示プログラム70に基づいてCPU311によって実行されるマーカー処理の流れを示すフローチャートである。マーカー処理は、後述するメイン処理と並列的に実行される処理であり、本実施形態では、CPU311がアイドル状態のときに実行される。以下、マーカー処理の詳細について説明する。
【0127】
図13のステップS10において、CPU311は、外側撮像部23から両方の実世界画像(すなわち左実世界画像および右実世界画像)を取得したか否かを判断し、両方の実世界画像が取得されている場合には処理はステップS11に進む。外側撮像部23から取得された最新の左実世界画像は、最新左実世界画像71Lとしてメインメモリ32に格納され、最新の右実世界画像は、最新右実世界画像71Rとしてメインメモリ32に格納される。
【0128】
なお、前述のように、上側ハウジング21において、外側撮像部(左)23aと外側撮像部(右)23bは一定の間隔(例えば3.5cm、以下、撮像部間距離)だけ離れている。したがって、外側撮像部(左)23aと外側撮像部(右)23bによって同時にマーカー61を撮像した場合、
図20に示すように、外側撮像部(左)23aによって撮像された左実世界画像におけるマーカー61の位置及び姿勢と、外側撮像部(右)23bによって撮像された右実世界画像におけるマーカー61の位置及び姿勢との間には、視差によるズレが生じる。
【0129】
ステップS11において、CPU311は、メイン実世界画像に対してマーカー認識処理を行う。より具体的には、パターンマッチング手法等によってメイン実世界画像にマーカー61が含まれているか否かを判断し、メイン実世界画像にマーカー61が含まれてい
る場合には、メイン実世界画像におけるマーカー61の位置および姿勢に基づいて、左変換行列75Lまたは右変換行列75Rを算出する(メイン実世界画像が左実世界画像である場合には、左変換行列75Lを算出し、メイン実世界画像が右実世界画像である場合には、右変換行列75Rを算出する)。
【0130】
なお、左変換行列75Lは、左実世界画像におけるマーカー61の位置および姿勢に基づいて計算される外側撮像部(左)23aの位置および姿勢を反映した行列である。より正確には、
図21に示すように、マーカー座標系(実世界におけるマーカー61の位置を原点とし、マーカー61の縦方向、横方向、法線方向の各方向を各軸とする座標系)で表された座標を、左実世界画像におけるマーカー61の位置および姿勢に基づいて計算された外側撮像部(左)23aの位置および姿勢を基準とした外側撮像部(左)座標系で表される座標へと変換するための座標変換行列である。
【0131】
また、右変換行列75Rは、右実世界画像におけるマーカー61の位置および姿勢に基づいて計算される外側撮像部(右)23bの位置および姿勢を反映した行列である。より正確には、
図22に示すように、マーカー座標系で表された座標を、右実世界画像におけるマーカー61の位置および姿勢に基づいて計算された外側撮像部(右)23bの位置および姿勢を基準とした外側撮像部(右)座標系で表される座標へと変換するための座標変換行列である。
【0132】
なお、マーカー認識精度に誤差が全く無く、かつゲーム装置10に対する外側撮像部(左)23aおよび外側撮像部(右)23bの取り付け精度に誤差が全く無いと仮定すると、右実世界画像のマーカー認識結果である右変換行列75Rが示す外側撮像部(右)23bの位置は、左実世界画像のマーカー認識結果である左変換行列75Lが示す外側撮像部(左)23aの位置を、外側撮像部(左)座標系のx軸方向(ゲーム装置10の横方向であり使用時の水平方向)に沿って一定距離(撮像部間距離)だけずらした位置となり、右変換行列75Rが示す外側撮像部(右)23bの姿勢と左変換行列75Lが示す外側撮像部(左)23aの姿勢はゲーム装置10における外側撮像部(左)23aと外側撮像部(右)23bの取り付け状態と同じとなる。本実施例においては、ゲーム装置10において外側撮像部(左)23aと外側撮像部(右)23bは平行に取り付けられるように設計さているので、外側撮像部(左)座標系のx軸,y軸,z軸が、外側撮像部(右)座標系のx軸,y軸,z軸とそれぞれ平行となる。しかしながら実際には、マーカー認識精度にも、ゲーム装置10に対する外側撮像部(左)23aおよび外側撮像部(右)23bの取り付け精度にも誤差があるため、左変換行列75Lが示す外側撮像部(左)23aの位置及び姿勢と、右変換行列75Rが示す外側撮像部(右)23bの位置及び姿勢は、理想的な関係にはならない。例えば、左変換行列75Lと右変換行列75Rは、外側撮像部(左)23aと外側撮像部(右)23bが近すぎたり、離れすぎたり、外側撮像部(左)23aの姿勢と外側撮像部(右)23bの姿勢が異なったりするような行列になる。また、外側撮像部(左)23aの姿勢と外側撮像部(右)23bの姿勢が平行でないような行列になる。
【0133】
ここで、ARでは、マーカー座標系を外側撮像部(左)座標系または外側撮像部(右)座標系に変換する行列を仮想カメラのビュー行列に指定することにより、実世界画像にCG画像を合成することができるが、単に、左変換行列75Lを左ビュー行列76Lに指定し、右変換行列75Rを右ビュー行列76Rに指定して仮想空間画像を上側LCD22に立体表示する場合には、仮想オブジェクト62が正常に立体視できないことがあり得る。そこで本実施形態では、後述する説明から明らかになるように、左実世界画像および右実世界画像のいずれか一方のマーカー認識結果(マーカー・カメラ変換行列)から計算される一方の仮想カメラの位置及び姿勢(ビュー行列)に基づいて、左仮想カメラ63Lの位置及び姿勢と右仮想カメラ63Rの位置及び姿勢が理想的な関係となるように、他方の仮
想カメラの位置及び姿勢(ビュー行列)が決定される。
【0134】
なお、ステップS11において、メイン実世界画像からマーカー61が認識されなかった場合には、左変換行列75Lまたは右変換行列75Rにヌル値が格納され、これによって、左実世界画像または右実世界画像におけるマーカー61の認識に失敗したことが記録される。
【0135】
ステップS12において、CPU311は、マーカー認識モードが片画像認識モードであるかどうかを判断する。そして、片画像認識モードである場合には、処理はステップS13に進み、そうでない場合(すなわち両画像認識モードである場合)には、処理はステップS14に進む。
【0136】
ステップS13において、CPU311は、左実世界画像及び右実世界画像のうち、メイン実世界画像ではない方の実世界画像(以下、サブ実世界画像と称す)のマーカー認識結果を“失敗”とみなす。より具体的には、メイン実世界画像が左実世界画像である場合には、右変換行列75Rにヌル値を格納し、メイン実世界画像が右実世界画像である場合には、左変換行列75Lにヌル値を格納する。
【0137】
ステップS14において、CPU311は、サブ実世界画像に対してマーカー認識処理を行う。より具体的には、パターンマッチング手法等によってサブ実世界画像にマーカー61が含まれているか否かを判断し、サブ実世界画像にマーカー61が含まれている場合には、サブ実世界画像におけるマーカー61の位置および姿勢に基づいて、左変換行列75Lまたは右変換行列75Rを算出する(サブ実世界画像が左実世界画像である場合には、左変換行列75Lを算出し、サブ実世界画像が右実世界画像である場合には、右変換行列75Rを算出する)。
【0138】
ステップS15において、CPU311は、表示モードが同期表示モードであるかどうかを判断する。そして、同期表示モードである場合には、処理はステップS17に進み、そうでない場合(すなわち非同期表示モードである場合)には、処理はステップS16に進む。
【0139】
ステップS16において、CPU311は、最新左実世界画像71L及び最新右実世界画像71Rを、表示用左実世界画像72L及び表示用右実世界画像72Rとしてそれぞれメインメモリ32に記憶する。そして、処理はステップS10に戻る。
【0140】
ステップS17において、CPU311は、マーカー認識モードが片画像認識モードかどうかを判断する。そして、片画像認識モードである場合には、処理はステップS18に進み、そうでない場合(すなわち両画像認識モードである場合)には、処理はステップS19に進む。
【0141】
ステップS18において、CPU311は、メイン実世界画像のマーカー認識に成功したかどうかを判断する。より具体的には、CPU311は、メイン実世界画像が左実世界画像である場合には、左変換行列75Lにヌル値ではない有効な行列が格納されているかどうかを判断し、メイン実世界画像が右実世界画像である場合には、右変換行列75Rにヌル値ではない有効な行列が格納されているかどうかを判断する。そして、メイン実世界画像のマーカー認識に成功したと判断された場合には、処理はステップS16に進み、そうでない場合には、処理はステップS10に戻る。
【0142】
ステップS19において、CPU311は、左実世界画像及び右実世界画像の少なくとも一方のマーカー認識に成功したかどうかを判断する。より具体的には、CPU311は
、左変換行列75L及び右変換行列75Rの両方に、ヌル値ではない有効な行列が格納されているかどうかを判断する。そして、左実世界画像及び右実世界画像の少なくとも一方のマーカー認識に成功したと判断された場合には、処理はステップS16に進み、そうでない場合には、処理はステップS10に戻る。
【0143】
(メイン処理)
図14は、画像表示プログラム70に基づいてCPU311によって実行されるメイン処理の流れを示すフローチャートである。メイン処理は、上述したマーカー処理と並列的に実行される処理である。以下、メイン処理の詳細について説明する。
【0144】
図14のステップS20において、CPU311は、3次元の仮想空間の所定位置に仮想オブジェクト62を配置する。本実施形態では、仮想空間の原点(ワールド座標系の原点)に仮想オブジェクト62を配置する。
【0145】
ステップS21において、CPU311は、更新処理を実行する。この更新処理では、仮想オブジェクト62を描画するために用いられる種々の変数を更新するための処理である。更新処理の詳細については後述する。
【0146】
ステップS22において、CPU311は、仮想オブジェクト処理を実行する。仮想オブジェクト処理とは、仮想空間に配置された仮想オブジェクト62に関する処理であり、例えば、必要に応じて、仮想オブジェクト62の大きさを変化させたり、仮想オブジェクト62に所定の動作(仮想空間内で移動する。例えば、仮想空間の原点の周りを歩くような移動をさせると、マーカー座標系の原点の周りを歩くような表示がされる)を行わせたりする。なお、仮想オブジェクト62の移動制御は、仮想空間のワールド座標系における仮想オブジェクトの位置座標を変更することにより実現される。
【0147】
ステップS23において、CPU311は、立体視ゼロ距離73に応じて左実世界画像のうちの表示に使う範囲である描画範囲を決定する。より具体的には、
図23に示すように、外側撮像部23から立体視ゼロ距離73の値(例えば30cm)だけ撮影方向に離れており、かつ外側撮像部(左)23aと外側撮像部(右)23bから等距離にある点を立体視ゼロ点とし、外側撮像部(左)23aから見て当該立体視ゼロ点が中心にくるような範囲を、左実世界画像の描画範囲として決定する。当該範囲の横方向の長さは、例えば、
図23に示すように、外側撮像部(左)23aの撮影方向に垂直な直線を、外側撮像部(左)23aの画角を表す直線によって切り取った線分上での比として求めることができ、当該比を実世界画像の横方向の長さに対応させることによって、実世界画像上での範囲として決定される。なお、当該範囲の縦方向の長さについては、表示画面の縦横比に合うように、横方向の長さから決定される。
【0148】
なお、後述するステップS27において右実世界画像の描画範囲を決定するときには、
図24に示すように、外側撮像部(右)23bから見て当該立体視ゼロ点が中心にくるような範囲を、右実世界画像の描画範囲として決定する。これにより、上側LCD22に表示される左目用画像における立体視ゼロ点の位置と右目用画像における立体視ゼロ点の位置が、上側LCD22の画面上で一致することになり、ユーザーから見て画面と同じ奥行き位置に存在するように見える。
【0149】
ステップS24において、CPU311は、表示用左実世界画像72Lにおける、ステップS23で決定した描画範囲を、上側LCD22へ供給すべき左目用画像を一時的に記憶するためのVRAM313内の所定の記憶領域(以下、左フレームバッファと称す)に描画する。
【0150】
ステップS25において、CPU311は、ARActive(
図12参照)の値がtrueかどうかを判断する。ARActiveとは、実世界画像に仮想オブジェクトを合成表示することができる状況かどうかを示す変数(フラグ)であって、実世界画像に仮想オブジェクトを合成表示することができる状況では、その値がtrueに設定され、実世界画像に仮想オブジェクトを合成表示することができない状況(例えば、マーカー61が全く認識できていない状況など)では、その値がfalse(初期値)に設定される。ARActiveの値がtrueである場合には、処理はステップS26に進み、そうでない場合(すなわちARActiveの値がfalseである場合)には、処理はステップS27に進む。
【0151】
ステップS26において、CPU311は、例えば
図23に示すように、左仮想カメラ63Lから見た仮想空間(以下、左目用の仮想空間画像と称す)を左フレームバッファに上書きする(実際には、典型的には、CPU311からの指示にしたがってGPU312によって描画される)。これにより、
図26に示すように、ステップS24で左フレームバッファに描画された左実世界画像に左目用の仮想空間画像が合成される。左フレームバッファに描画された画像は、所定のタイミングで左目用画像として上側LCD22へ供給されることになる。なお、当該左目用の仮想空間画像においては、仮想空間の背景は透明であり、そのため、実世界画像に仮想空間画像を合成することで、実世界画像上に仮想オブジェクト62が存在するような画像が生成される。
【0152】
ステップS27において、CPU311は、立体視ゼロ距離73に応じて右実世界画像の描画範囲を決定する。なお、描画範囲を決定するための処理の詳細は左実世界画像の描画範囲の決定の処理と同じであるため省略する。
【0153】
ステップS28において、CPU311は、表示用右実世界画像72Rにおける、ステップS27で決定した描画範囲を、上側LCD22へ供給すべき右目用画像を一時的に記憶するためのVRAM313内の所定の記憶領域(以下、右フレームバッファと称す)に描画する。
【0154】
ステップS29において、CPU311は、ARActiveの値がtrueかどうかを判断する。ARActiveの値がtrueである場合には、処理はステップS30に進み、そうでない場合(すなわちARActiveの値がfalseである場合)には、処理はステップS31に進む。
【0155】
ステップS30において、CPU311は、右仮想カメラ63Rから見た仮想空間(以下、右目用の仮想空間画像と称す)を右フレームバッファに上書きする(実際には、典型的には、CPU311からの指示にしたがってGPU312によって描画される)。これにより、ステップS28で右フレームバッファに描画された右実世界画像に右目用の仮想空間画像が合成される。右フレームバッファに描画された画像は、所定のタイミングで右目用画像として上側LCD22へ供給されることになる。
【0156】
ステップS31において、CPU311は、上側LCD22からの割り込み信号(垂直同期割り込み)を待機し、当該割り込み信号が発生した場合には、処理はステップS21に戻る。これにより、ステップS21〜S31の処理が一定の周期(例えば、60分の1秒の周期)で繰り返される。
【0157】
(更新処理)
次に、メイン処理におけるステップS21の更新処理の詳細について、
図15のフローチャートを参照して説明する。
【0158】
図15のステップS40において、CPU311は、前述のマーカー処理におけるマーカー認識結果(すなわち、左変換行列75L及び右変換行列75R)が更新されたかどうかを判断し、更新されている場合には処理はステップS41に進み、まだ更新されていない場合には処理はステップS44に進む。
【0159】
ステップS41において、CPU311は、左実世界画像及び右実世界画像の両方の実世界画像のマーカー認識に成功しているかどうかを判断する。そして、両方の実世界画像のマーカー認識に成功している場合には、処理はステップS42に進み、いずれか一方もしくは両方の実世界画像のマーカー認識に失敗している場合には、処理はステップS44に進む。
【0160】
ステップS42において、CPU311は、EyeWidth(
図12参照)の値が0であるか、または、EyeMeasure(
図12参照)の値がtrueであるかどうかを判断する。EyeWidthとは、左変換行列75Lと右変換行列75Rとを用いて算出される、外側撮像部(左)23aと外側撮像部(右)23bとの位置関係における、両撮像部間の距離を示す。なお、ここで両撮像部間の距離とは、実世界のスケールとして求める必要はなく、仮想空間での距離として求めてもよい。具体的には、左変換行列75Lが示す、マーカー61の位置と外側撮像部(左)23aの位置との関係と、右変換行列75Rが示すマーカー61の位置と外側撮像部(右)23bの位置との関係とから、マーカー61の位置を基準として、外側撮像部(左)23aの位置と外側撮像部(右)23bの位置との関係を求めた場合の距離を求めている。なお、当該距離が未確定の場合には、その値が0(初期値)に設定される。なお、本実施形態では、EyeWidthはスカラー値であるが、EyeWidthを、左変換行列75Lが示す外側撮像部(左)23aの位置と右変換行列75Rが示す外側撮像部(右)23bの位置との間を結ぶベクトルにしてもよい。また、EyeWidthを、左変換行列75Lが示す外側撮像部(左)23aの位置と右変換行列75Rが示す外側撮像部(右)23bの位置との間を結ぶベクトルの、撮影方向に直交する成分の長さにしてもよい。なお、後述の通り、EyeWidthは、仮想空間における左仮想カメラ63Lと右仮想カメラ63Rの距離(間隔)の設定に用いる。EyeMeasureとは、EyeWidthを再計算すべきか否かを示す変数(フラグ)であって、EyeWidthを再計算すべき状況では、その値がtrueに設定され、そうでない状況では、その値がfalse(初期値)に設定される。EyeWidthの値が0であるか、または、EyeMeasureの値がtrueである場合には、処理はステップS43に進み、そうでない場合(すなわちEyeWidthの値が0以外の値であり、なおかつ、EyeMeasureの値がfalseである場合)には、処理はステップS44に進む。
【0161】
ステップS43において、CPU311は、仮想カメラ間隔決定処理を実行する。仮想カメラ間隔決定処理では、左仮想カメラ63Lと右仮想カメラ63Rの間隔(すなわちEyeWidth)が適宜に決定および更新される。仮想カメラ間隔決定処理の詳細については後述する。
【0162】
ステップS44において、CPU311は、ビュー行列生成処理を実行する。ビュー行列生成処理では、すでに決定されている左仮想カメラ63Lと右仮想カメラ63Rの間隔(すなわちEyeWidth)に基づいて、左ビュー行列76Lと右ビュー行列76Rが計算される。ビュー行列生成処理の詳細については後述する。
【0163】
ステップS45において、CPU311は、メイン実世界画像設定処理を実行する。メイン実世界画像設定処理では、左実世界画像と右実世界画像の間で、メイン実世界画像が適宜に切り替えられる(これは、外側撮像部(左)23aと外側撮像部(右)との間で、メイン撮像部を切り替えることと等価である)。メイン実世界画像設定処理の詳細につい
ては後述する。
【0164】
ステップS46において、CPU311は、表示モード切替処理を実行し、そして更新処理を終了する。表示モード切替処理では、同期表示モードと非同期表示モードの間で、表示モードが適宜に切り替えられる。表示モード切替処理の詳細については後述する。
【0165】
(仮想カメラ間隔決定処理)
次に、更新処理(
図15)におけるステップS43の仮想カメラ間隔決定処理の詳細について、
図16のフローチャートを参照して説明する。ここでは、前述の通り、左変換行列75Lが示すマーカー61の位置に対する外側撮像部(左)23aの位置と右変換行列75Rが示すマーカー61の位置に対する外側撮像部(右)23bの位置との距離を求める。この距離を計算する方法はいくつかあるが、本実施例では、計算方法の一例として、以下の方法を採用する。
【0166】
図16のステップS50において、CPU311は、左変換行列75Lおよび右変換行列75Rに基づいて、座標V0を計算する。以下、
図27〜
図29を参照して、V0の計算方法を説明する。なお、
図27〜
図29においては、左実世界画像に基づいて計算される、マーカー61に対する外側撮像部(左)23aの相対位置及び相対姿勢と、右実世界画像に基づいて計算される、マーカー61に対する外側撮像部(右)23bの相対位置及び相対姿勢とが、前述したように必ずしも理想的な関係とはならないことを強調するために、外側撮像部(左)23aの撮影方向と外側撮像部(右)23bの撮影方向が互いに大きくずれているように図示している。
【0167】
まず、
図27に示すように、(0,0,0)に対して、左変換行列75Lを乗算すると、外側撮像部(左)座標系で表されたマーカー座標系の原点の座標V1が求まる。座標V1は、左実世界画像に基づいて計算された、外側撮像部(左)23aに対するマーカー61の相対位置を表している。この座標V1が外側撮像部(右)座標系で表された座標であると見なすと、座標V1が示す位置は、外側撮像部(右)座標系では
図28に示す位置へと移動する。この座標V1に対して、さらに右変換行列75Rの逆行列を乗算する。右変換行列75Rの逆行列を乗算することは、外側撮像部(右)座標系で表された座標をマーカー座標系で表された座標に変換することに相当する。したがって、上記逆行列の乗算は、外側撮像部(右)座標系で表された座標V1(
図28)を、
図29に示すように、マーカー座標系で表された座標V0へと変換することになる。このようにして計算された座標V0は、左実世界画像に基づいて計算された、外側撮像部(左)23aに対するマーカー61の相対位置(すなわち、外側撮像部(左)座標系で表されるマーカー座標系の原点の
座標)と、右実世界画像に基づいて計算された、外側撮像部(右)23bに対するマーカー61の相対位置(すなわち、外側撮像部(右)座標系で表されるマーカー座標系の原点
の座標)との差を示している。本実施形態では、このマーカー61の相対位置の差を、外側撮像部(左)23aと外側撮像部(右)23bの取り付け位置の差によって生じるものであると考えて、外側撮像部(左)23aと外側撮像部(右)23bの取り付け位置を推定している。
【0168】
ステップS51において、CPU311は、左変換行列75Lに基づいて、外側撮像部(左)座標系で表されたマーカー座標系の原点の座標V1を計算する。具体的には、(0,0,0)に対して、左変換行列75Lを乗算することで、外側撮像部(左)座標系で表されたマーカー座標系の原点の座標V1が求まる。なお、ここでは、外側撮像部(左)座標系で表されたマーカー座標系の原点の座標をV1としたが、これに替えて、外側撮像部(右)座標系で表されたマーカー座標系の原点の座標をV1としてもよい。
【0169】
ステップS52において、CPU311は、ステップS50で求めたV0の大きさ(原
点からの距離)(
図29参照)を、ew(
図12参照)に格納し、ステップS51で求めたV1のz軸値の絶対値(
図27参照)を、ed(
図12参照)に格納する。ただし、ewの値は、マーカー座標系における長さの単位で計算されており、実世界における長さの単位と一致するものではない。そして、前述の通り、外側撮像部(左)23aと外側撮像部(右)23bの間の実距離は既知(例えば3.5cm)であるので、この実距離とewの値を用いて、実世界における長さの単位と仮想空間における長さの単位とを一致させることができる。なお、マーカー61のサイズが既知であれば、マーカー画像の認識結果に基づいて求められるマーカー61のサイズと、実世界におけるマーカー61のサイズとの対応関係から、実世界における長さの単位と仮想空間における長さの単位とを一致させることもできる。
【0170】
なお、ゲーム装置10に対する外側撮像部(左)23aおよび外側撮像部(右)23bの取り付け精度の誤差により、外側撮像部(左)23aの撮影方向と外側撮像部(右)23bの撮影方向が平行になっていない場合には、このようにして計算される外側撮像部(左)23aと外側撮像部(右)23bの間の距離(ew)は、外側撮像部23とマーカー61との間の撮影方向についての距離に応じて変動する。それゆえ、後述するように、外側撮像部23とマーカー61との間の撮影方向についての距離が変化したときには、外側撮像部(左)23aと外側撮像部(右)23bの間の距離(後述するEyeWidth)は、そのときのマーカー・カメラ変換行列を用いて再計算される。
【0171】
なお、本実施形態では、ewをV0の大きさとしたが、V0の「左変換行列75Lにより示される外側撮像部(左)23aの位置と右変換行列75Rにより示される外側撮像部(右)23bの位置を結ぶ方向」の成分としてもよい。
【0172】
このようにして計算されたewは「外側撮像部(左)23aと外側撮像部(右)23bとの間のマーカー座標系における間隔」であるが、これを左仮想カメラ63Rと右仮想カメラ63Rとの間の間隔として用いる(後述のステップS65またはS68)。
【0173】
なお、ewを求める方法は、上述した方法以外にもある。例えば、(0,0,0)に左変換行列75Lを乗算することによって、外側撮像部(左)座標系で表されたマーカー座標系の原点の座標Vl(すなわち、外側撮像部(左)23aに対するマーカー61の相対位置)を求めるとともに、(0,0,0)に右変換行列75Rを乗算することによって、外側撮像部(右)で表されたマーカー座標系の原点の座標Vr(すなわち、外側撮像部(右)23bに対するマーカー61の相対位置)を求め、こうして求めた座標Vlと座標Vrの間の距離を計算することによって、ewを求めても構わない。
【0174】
ステップS53において、CPU311は、LogIndex(
図12参照)の値が1(初期値)より大きいかどうかを判断し、1より大きい場合には処理はステップS57に進み、そうでない場合(すなわち1である場合)には処理はステップS54に進む。LogIndexは、後述する配列(LogWidth、LogDepth)の各要素を識別するための変数である。
【0175】
ステップS54において、CPU311は、ステップS52で求めたewの値を配列LogWidth[LogIndex]に格納する。さらに、ステップS52で求めたedの値を配列LogDepth[LogIndex]に格納する。さらに、LogIndexの値をインクリメントする。LogWidthは、ewの値を複数保持しておくための配列変数である。LogDepthは、edの値を複数保持しておくための配列変数である。
【0176】
ステップS55において、CPU311は、LogIndexの値がLogMaxの値
よりも大きいかどうかを判定し、大きい場合には処理はステップS56に進み、そうでない場合(すなわちLogIndexの値がLogMaxの値以下の場合)には、仮想カメラ間隔決定処理を終了する。
【0177】
ステップS56において、CPU311は、LogWidthの各要素の平均値を計算し、当該平均値をEyeWidthに格納する。さらに、LogDepthの各要素の平均値を計算し、当該平均値をEyeDepthに格納する。さらに、EyeMeasureの値をfalseに設定する。さらに、マーカー認識モード79を、片画像認識モードに設定する。EyeDepthとは、左変換行列75Lが示す外側撮像部(左)23aのマーカー座標系における位置を示す座標(または右変換行列75Rが示す外側撮像部(右)23bのマーカー座標系における位置を示す座標)から、マーカー座標系の原点までの奥行き距離(深さ:撮影方向についての距離)を示す変数であって、後述する
図17のステップS72における判断の際の基準値として用いられる。EyeDepthの初期値は0である。ステップS56の処理が終了すると、仮想カメラ間隔決定処理は終了する。
【0178】
ステップS57において、CPU311は、ステップS52で求めたewの値とLogWidth[1]の値の差の絶対値が、LogWidth[1]の値の10%よりも小さく、かつ、ステップS52で求めたedの値とLogDepth[1]の値の差の絶対値が、LogDepth[1]の値の10%よりも小さいかどうかを判断する。そして、ステップS57の判断結果が肯定である場合には処理はステップS54に進み、ステップS57の判断結果が否定である場合には処理はステップS58に進む。
【0179】
ステップS58において、CPU311は、LogIndexの値を1(初期値)にリセットして、仮想カメラ間隔決定処理を終了する。
【0180】
以上のように、仮想カメラ間隔決定処理では、左実世界画像に含まれるマーカー61の位置及び姿勢に基づいて計算される外側撮像部(左)23aの位置と、右実世界画像に含まれるマーカー61の位置及び姿勢に基づいて計算される外側撮像部(右)23bの位置とに基づいて、ewとedが計算される。このようにして計算されたewの値とedの値が、LogWidthとLogDepthに順次格納される。このとき、新たに計算されたewの値が、LogWidthに最初に格納されたewの値(すなわちLogWidth[1]の値)を基準とした所定範囲(±10%)から外れた場合や、新たに計算されたedの値が、LogDepthに最初に格納されたedの値(すなわちLogDepth[1]の値)を基準とした所定範囲(±10%)から外れた場合には、LogWidthとLogDepthに再び最初からewの値とedの値を格納し直す。したがって、逐次計算されるewの値とedの値に大きな変動が見られない場合(すなわち、ewの値とedの値が一定期間、ある程度安定している場合)にのみ、それらのewの値の平均値とそれらのedの値の平均値が、EyeWidthおよびEyeDepthに格納される。
【0181】
ところで、ユーザがゲーム装置10を移動させたり回転させたりしているときには、外側撮像部23によって撮像される左実世界画像および右実世界画像がぼけやすく、マーカー61の認識精度が著しく低下し、逐次検出されるewの値やedの値が大きく変動しやすい。そこで、このような状況で検出される信頼性の低いewの値およびedの値に基づいてEyeWidthの値およびEyeDepthの値を決定することは避けるべきである。よって、本実施形態では、逐次計算されるewの値とedの値に大きな変動が見られない場合にのみ、それらの値に基づいてEyeWidthの値およびEyeDepthの値を決定している。また、複数回計算されたewの値およびedの値の平均値をEyeWidthの値およびEyeDepthの値として用いることにより、EyeWidthの値およびEyeDepthの値の精度を高めることができる。
【0182】
(ビュー行列生成処理)
次に、更新処理(
図15)におけるステップS44のビュー行列生成処理の詳細について、
図17のフローチャートを参照して説明する。
【0183】
図17のステップS60において、CPU311は、EyeWidthが0より大きいかどうかを判断し、0より大きい場合には処理はステップS63に進み、そうでない場合(すなわち、0である場合)には処理はステップS61に進む。
【0184】
ステップS61において、CPU311は、表示モードが同期表示モードであるかどうかを判断する。そして、同期表示モードである場合には、ビュー行列生成処理を終了し、そうでない場合(すなわち非同期表示モードである場合)には、処理はステップS62に進む。
【0185】
ステップS62において、CPU311は、ARActiveの値をfalseに設定する。そして、ビュー行列生成処理を終了する。
【0186】
ステップS63において、CPU311は、左変換行列75Lを参照して、左実世界画像のマーカー認識に成功しているかどうかを判断し、左実世界画像のマーカー認識に成功している場合には処理はステップS64に進み、そうでない場合(すなわち、左変換行列75Lの値がヌル値である場合)には処理はステップS66に進む。
【0187】
ステップS64において、CPU311は、左変換行列75Lの値を、左ビュー行列76Lに格納する。これは、左実世界画像に含まれるマーカー61の位置及び姿勢に基づいて計算されたマーカー座標系における外側撮像部(左)23aの位置及び姿勢を、左目用の仮想空間画像を生成するための左仮想カメラ63Lの位置及び姿勢としてそのまま扱うことを意味する。
【0188】
ステップS65において、CPU311は、左ビュー行列76Lの値に対して平行移動行列(−EyeWidth,0,0)を乗算した結果の値を、右ビュー行列76Rに格納する。これは、
図30に示すように、前述のステップS64において設定された仮想空間のワールド座標系における左仮想カメラ63Lの位置から、左仮想カメラ座標系のx軸の正方向にEyeWidthの値だけずらした位置を、右目用の仮想空間画像を生成するための右仮想カメラ63Rの位置として扱うことを意味する。また、右仮想カメラ63Rの姿勢は、左仮想カメラ63Lの姿勢と同じとなる(すなわち、左仮想カメラ座標系のx軸,y軸,z軸が、右仮想カメラ座標系のx軸,y軸,z軸とそれぞれ平行となる)。これにより、左仮想カメラ63Lの位置及び姿勢と、右仮想カメラ63Rの位置及び姿勢との整合性が保たれるので、上側LCD22において正常に立体視できるように仮想オブジェクト62を表示することができる。
【0189】
ステップS66において、CPU311は、右変換行列75Rを参照して、右実世界画像のマーカー認識に成功しているかどうかを判断し、右実世界画像のマーカー認識に成功している場合には処理はステップS67に進み、そうでない場合(すなわち、右変換行列75Rの値がヌル値である場合)にはビュー行列生成処理を終了する。
【0190】
ステップS67において、CPU311は、右変換行列75Rの値を、右ビュー行列76Rに格納する。これは、右実世界画像に含まれるマーカー61の位置及び姿勢に基づいて計算されたマーカー座標系における外側撮像部(右)23bの位置及び姿勢を、右目用の仮想空間画像を生成するための右仮想カメラ63Rの位置及び姿勢としてそのまま扱うことを意味する。
【0191】
ステップS68において、CPU311は、右ビュー行列76Rの値に対して平行移動行列(EyeWidth,0,0)を乗算した結果の値を、左ビュー行列76Lに格納する。これは、
図31に示すように、前述のステップS67において設定された仮想空間のワールド座標系における右仮想カメラ63Rの位置から、右仮想カメラ座標系のx軸の負方向にEyeWidthの値だけずらした位置を、左目用の仮想空間画像を生成するための左仮想カメラ63Lの位置として扱うことを意味する。また、左仮想カメラ63Lの姿勢は、右仮想カメラ63Rの姿勢と同じとなる(すなわち、左仮想カメラ座標系のx軸,y軸,z軸が、右仮想カメラ座標系のx軸,y軸,z軸とそれぞれ平行となる)。これにより、左仮想カメラ63Lの位置及び姿勢と、右仮想カメラ63Rの位置及び姿勢との整合性が保たれるので、上側LCD22において正常に立体視できるように仮想オブジェクト62を表示することができる。
【0192】
このように、本実施例では、一方の仮想カメラ(例えば、左仮想カメラ63L)の位置および姿勢については、一方の外側撮像部(例えば、外側撮像部(左)23a)の撮影画像から算出された「マーカー・カメラ変換行列」を用いて設定するが(より具体的には、そのまま用いる)、他方の仮想カメラ(例えば、右仮想カメラ63R)の位置および姿勢については、他方の外側撮像部(例えば、外側撮像部(右)23b)の撮影画像から算出された「マーカー・カメラ変換行列」を用いずに設定する。
【0193】
ステレオカメラでARの立体視表示をおこなう場合においては、仮想カメラは右用と左用の2つを設定する必要があり、また、「マーカー・カメラ変換行列」は外側撮像部(左)23aによる変換行列(左変換行列25L)と外側撮像部(右)23bによる変換行列(右変換行列25R)がある。本実施形態では、各仮想カメラ63L,63Rを設定するときに、各変換行列25L,25Rを用いるのではなくて、1つの変換行列を設定して(変換行列25L,25Rの一方の変換行列をそのまま用いて、または、両方の変換行列25L,25Rから別の新たな1つの変換行列を生成して(平均位置、平均姿勢とするなど))、その1つの変換行列を用いて両方の仮想カメラ63L,63Rの位置および姿勢を設定する。これにより、AR認識における精度の問題を解消することができる。
【0194】
ステップS69において、CPU311は、ARActiveの値をtrueに設定する。これにより、実世界画像に対する仮想オブジェクト62の合成表示が開始または再開される。
【0195】
ステップS70において、CPU311は、EyeMeasureの値がtrueかどうかを判断し、trueである場合にはビュー行列生成処理を終了し、そうでない場合(すなわちfalseである場合)には処理はステップS71に進む。
【0196】
ステップS71において、CPU311は、ステップS64またはステップS68で決定された左ビュー行列76Lに基づいて、左仮想カメラ座標系で表された仮想空間の原点の座標Vを計算する。具体的には、
図32に示すように、(0,0,0)に対して左ビュー行列76Lを乗算することで、左仮想カメラ座標系で表された仮想空間の原点の座標Vが求まる。なお、ここでは、左仮想カメラ座標系で表された仮想空間の原点の座標をVとしたが、これに替えて、ステップS65またはステップS67で決定された右ビュー行列76Rに基づいて計算された、右仮想カメラ座標系で表された仮想空間の原点の座標をVとしてもよい。このようにして求められたVは、外側撮像部(左)座標系におけるマーカー61の位置と実質的に同一である(ただし、このVの値は、仮想空間またはマーカー座標系における長さの単位で計算されており、実世界における長さの単位と一致するものではない。)。
【0197】
ステップS72において、CPU311は、Vのz座標値の絶対値(|V.z|)とE
yeDepthの値との差の絶対値が、EyeDepthの値の20%よりも大きいかどうかを判断し、大きい場合には処理はステップS73に進み、そうでない場合にはビュー行列生成処理を終了する。|V.z|は、外側撮像部23からマーカー61までの撮影方向についての距離(深さ)と実質的に同一である。すなわち、ステップS72では、仮想カメラ間隔決定処理(
図16)においてEyeWidthの値を計算したときを基準として、外側撮像部23からマーカー61までの奥行き距離(深さ)が、±20%の範囲を超えて変化したかどうかを判断している。
【0198】
ステップS73において、CPU311は、EyeMeasureの値をtrueに設定し、さらに、LogIndexの値を1にリセットし、さらに、マーカー認識モード79を両画像認識モードに設定して、ビュー行列生成処理を終了する。この結果、仮想カメラ間隔決定処理によるEyeWidthの計算処理が再び開始されることになる。
【0199】
上記のように、仮想カメラ間隔決定処理において、EyeWidthの値を前回計算したときを基準として、外側撮像部23からマーカー61までの奥行き距離(深さ)が所定範囲を超えて変化したときに、EyeWidthを再計算する理由は、ゲーム装置10に対する外側撮像部(左)23aおよび外側撮像部(右)23bの取り付け精度の誤差により、外側撮像部23からマーカー61までの奥行き距離(深さ)に応じて最適な仮想カメラ間隔(EyeWidth)が変化するからである。例えば、外側撮像部(左)23aの撮影方向と外側撮像部(右)23bの撮影方向が平行になっていない状況において、
図33に示すように外側撮像部23からマーカー61までの奥行距離がD1であるときに仮想カメラ間隔決定処理において計算されるEyeWidthの値をEyeWidth1とすると、仮想空間において、左仮想カメラ63Lと右仮想カメラ63Rは、
図34に示すようにEyeWidth1の間隔を開けて配置されるのが適切である(そうすることによって、例えば仮想空間の原点に配置した仮想オブジェクトが、実世界画像のマーカー61上に実在するかのように、適切に立体表示されるようになる。)。そして、
図35に示すように外側撮像部23からマーカー61までの奥行距離がD1よりも小さいD2に変化した場合には、仮想カメラ間隔決定処理において計算されるEyeWidthの値は、EyeWidth1よりも小さいEyeWidth2となり、仮想空間において、左仮想カメラ63Lと右仮想カメラ63Rは、
図36に示すようにEyeWidth2の間隔を開けて配置されるのが適切である。
【0200】
(メイン実世界画像設定処理)
次に、更新処理(
図15)におけるステップS45のメイン実世界画像設定処理の詳細について、
図18のフローチャートを参照して説明する。
【0201】
図18のステップS80において、CPU311は、ARActiveの値がtrueかどうかを判断し、trueである場合には、処理はステップS81に進み、そうでない場合(すなわちARActiveの値がfalseである場合)には、メイン実世界画像設定処理を終了する。
【0202】
ステップS81において、CPU311は、左射影行列77Lおよび右射影行列77Rを生成する。左射影行列77Lは、左仮想カメラ63Lから見た仮想空間の描画範囲を規定する行列であって、本実施形態では、
図37に示すように、メイン処理のステップS23で決定した左実世界画像の描画範囲に対応するような左射影行列77Lが生成される。右射影行列77Rは、右仮想カメラ63Rから見た仮想空間の描画範囲を規定する行列であって、本実施形態では、
図38に示すように、メイン処理のステップS27で決定した右実世界画像の描画範囲に対応するような右射影行列77Rが生成される。
【0203】
具体的には、左仮想カメラ63Lの射影行列は、外側撮像部(左)23aの水平方向の
画角と、当該左仮想カメラの水平方向の画角との比が、左実世界画像の横方向の長さにおける描画範囲の横方向の位置および大きさを表す比と、同じになるような画角を持つ視体積を定義する射影行列として設定される。
【0204】
ステップS82において、CPU311は、メイン実世界画像が左実世界画像かどうかを判断し、メイン実世界画像が左実世界画像である場合には処理はステップS83に進み、そうでない場合(すなわち、メイン実世界画像が右実世界画像である場合)には処理はステップS86に進む。
【0205】
ステップS83において、CPU311は、(0,0,0,1)に左ビュー行列76Lおよび左射影行列77Lを乗算することによって、ベクトルVを求める。
【0206】
ステップS84において、CPU311は、ベクトルVの第1成分(x)を第4成分(w)で乗算した結果の値(V.x/V.w)が0.5より大きいかどうかを判断し、0.5より大きい場合には処理はステップS85に進み、そうでない場合にはメイン実世界画像設定処理を終了する。上記のV.x/V.wの値は、左目用の仮想空間画像上で、仮想空間のワールド座標系の原点が、画像の左右方向のどの位置に存在するかを示している(なお、「左目用の仮想空間画像上で、仮想空間のワールド座標系の原点が、画像の左右方向のどの位置に存在するか」は、「外側撮像部(左)23aの撮影画像上で、マーカー座標系の原点が、画像の左右方向のどの位置に存在するか」と等価である)。仮想空間のワールド座標系の原点が左目用の仮想空間画像の中央に位置するときは、V.x/V.wの値が0となり、仮想空間のワールド座標系の原点が左目用の仮想空間画像の左端に近づくほど、V.x/V.wの値が−1.0に近づき、仮想空間のワールド座標系の原点が左目用の仮想空間画像の右端に近づくほど、V.x/V.wの値が+1.0に近づく。V.x/V.wの値が0.5より大きいということは、仮想空間のワールド座標系の原点が左目用の仮想空間画像の右端領域(
図39の斜線領域)に位置することを意味する。言い換えれば、外側撮像部(左)23aによって撮像された左実世界画像の右端領域にマーカー61が位置していることを意味する。
【0207】
ステップS85において、CPU311は、メイン実世界画像を左実世界画像から右実世界画像へと変更する。すなわち、左仮想カメラ63Lによる仮想空間画像上で、仮想空間の原点が、画像の中心よりも所定距離だけ(または画像の左右幅の所定割合だけ)右の位置よりも右側に存在するときに、メイン実世界画像を右実世界画像に変更する。または、外側撮像部(左)23aによる撮影画像上で、マーカー座標系の原点が、画像の中心よりも所定距離だけ(または画像の左右幅の所定割合だけ)右の位置よりも右側に存在するときに、メイン実世界画像を右実世界画像に変更する。これにより、例えば左実世界画像においてマーカー61の位置が徐々に右方向へ移動して、最終的に左実世界画像からマーカー61が消えてしまったとしても、左実世界画像からマーカー61が消えてしまう前にメイン実世界画像が右実世界画像へと変更されるので、片画像認識モードにおいて継続的にマーカー61を認識することが可能となる。ステップS85の処理が終わると、メイン実世界画像設定処理を終了する。
【0208】
ステップS86において、CPU311は、(0,0,0,1)に右ビュー行列76Rおよび右射影行列77Rを乗算することによって、ベクトルVを求める。
【0209】
ステップS87において、CPU311は、ベクトルVの第1成分(x)を第4成分(w)で乗算した結果の値(V.x/V.w)が−0.5より小さいかどうかを判断し、−0.5より小さい場合には処理はステップS87に進み、そうでない場合にはメイン実世界画像設定処理を終了する。上記のV.x/V.wの値は、右目用の仮想空間画像上で、仮想空間のワールド座標系の原点が、画像の左右方向のどの位置に存在するかを示してい
る。仮想空間のワールド座標系の原点が右目用の仮想空間画像の中央に位置するときは、V.x/V.wの値が0となり、仮想空間のワールド座標系の原点が右目用の仮想空間画像の左端に近づくほど、V.x/V.wの値が−1.0に近づき、仮想空間のワールド座標系の原点が右目用の仮想空間画像の右端に近づくほど、V.x/V.wの値が+1.0に近づく。V.x/V.wの値が−0.5より小さいということは、仮想空間のワールド座標系の原点が右目用の仮想空間画像の左端領域(
図40の斜線領域)に位置することを意味する。言い換えれば、外側撮像部(右)23bによって撮像された右実世界画像の左端領域にマーカー61が位置していることを意味する。
【0210】
ステップS88において、CPU311は、メイン実世界画像を右実世界画像から左実世界画像へと変更する。これにより、例えば右実世界画像においてマーカー61の位置が徐々に左方向へ移動して、最終的に右実世界画像からマーカー61が消えてしまったとしても、右実世界画像からマーカー61が消えてしまう前にメイン実世界画像が左実世界画像へと変更されるので、片画像認識モードにおいて継続的にマーカー61を認識することが可能となる。ステップS88の処理が終わると、メイン実世界画像設定処理を終了する。
【0211】
(表示モード切替処理)
次に、更新処理(
図15)におけるステップS46の表示モード切替処理の詳細について、
図19のフローチャートを参照して説明する。
【0212】
図19のステップS90において、CPU311は、表示モードが同期表示モードかどうかを判断し、同期表示モードである場合には処理はステップS91に進み、そうでない場合(すなわち、非同期表示モードである場合)には処理はステップS96に進む。
【0213】
ステップS91において、CPU311は、EyeWidthが0より大きく、かつ、左実世界画像および右実世界画像のいずれかの実世界画像のマーカー認識に成功しているかどうかを判断する。そして、判断結果が肯定である場合には、処理はステップS92に進み、判断結果が否定である場合(すなわち、EyeWidthが0であるか、もしくは、左実世界画像および右実世界画像の両方の実世界画像のマーカー認識に失敗している場合)には、処理はステップS93に進む。
【0214】
ステップS92において、CPU311は、SyncCount(
図12参照)の値を20に設定する。SyncCountは、表示モードを同期表示モードから非同期表示モードへと切り替えるタイミングを決定するための変数である。ステップS92の処理が終わると、表示モード切替処理を終了する。
【0215】
ステップS93において、CPU311は、SyncCountの値をデクリメントする。
【0216】
ステップS94において、CPU311は、SyncCountの値が0より大きいかどうかを判断し、0より大きい場合には表示モード切替処理を終了、そうでない場合(すなわち、0である場合)には処理はステップS95に進む。
【0217】
ステップS95において、CPU311は、LogIndexの値を1に設定し、さらにEyeWidthおよびEyeDepthの値を0に設定し、さらに表示モード78を同期表示モードから非同期表示モードへと変更し、さらにマーカー認識モード79を両画像認識モードに設定する。ステップS95の処理が終わると、表示モード切替処理を終了する。
【0218】
ステップS96において、CPU311は、EyeWidthが0より大きく、かつ、左実世界画像および右実世界画像のいずれかの実世界画像のマーカー認識に成功しているかどうかを判断する。そして、判断結果が肯定である場合には、処理はステップS97に進み、判断結果が否定である場合(すなわち、EyeWidthが0であるか、もしくは、左実世界画像および右実世界画像の両方の実世界画像のマーカー認識に失敗している場合)には、表示モード切替処理を終了する。
【0219】
ステップS97において、CPU311は、SyncCountの値を20に設定し、さらに表示モードを非同期表示モードから同期表示モードへと変更する。ステップS97の処理が終わると、表示モード切替処理を終了する。
【0220】
上記のように、表示モード切替処理によって、同期表示モードと非同期表示モードとの間で表示モードが適宜に切り替えられる。より具体的には、画像表示プログラムの実行が開始された直後は表示モードは非同期表示モードとなり、上側LCD22には常に最新の実世界画像が表示される。その後、マーカー61が認識されて、上側LCD22に表示される実世界画像に仮想オブジェクト62を合成表示できる状態になった時点で、表示モードは非同期表示モードから同期表示モードへと変化する。同期表示モードでは、仮想オブジェクト62を実世界画像内の正しい位置に合成表示するために、最後にマーカー61を認識することができた実世界画像(必ずしも最新の実世界画像とは限らない)に仮想オブジェクト62を合成した合成画像が、上側LCD22に表示される。これにより、実世界画像に合成表示される仮想オブジェクト62の位置ズレを防止することができる。その後、マーカー61を認識することができない状態が一定時間継続した時点で、表示モードは同期表示モードから非同期表示モードへと変化し、上側LCD22には常に最新の実世界画像が表示されるようになる。これにより、マーカー61を認識することができない状態が続いたときに、上側LCD22に古い画像が表示され続けてしまうことを防止することができる。
【0221】
(本実施形態の効果)
以上のように、本実施形態によれば、左実世界画像および右実世界画像のいずれか一方のマーカー認識結果から計算される一方の外側撮像部(外側撮像部(左)23aまたは外側撮像部(右)23b)のマーカー座標系における位置及び姿勢に基づいて、一方の仮想カメラの位置および姿勢が決定され、さらに、左仮想カメラ63Lの位置及び姿勢と右仮想カメラ63Rの位置及び姿勢が理想的な関係となるように、他方の仮想カメラの位置及び姿勢が決定される。したがって、立体視可能な表示装置において、正常に立体視できるように仮想オブジェクト62を表示することができる。
【0222】
また、左実世界画像に対するマーカー認識結果に基づいて計算された外側撮像部(左)23aの位置と、右実世界画像に対するマーカー認識結果に基づいて計算された外側撮像部(右)23bの位置とに基づいて、両外側撮像部の間隔を算出し、その結果に基づいて仮想カメラ間隔(EyeWidth)を決定し、一方の仮想カメラの位置を当該仮想カメラの座標系の撮影方向に直交する方向に当該間隔だけ移動させることにより他方の仮想カメラの位置を決定する。これにより、両仮想カメラが撮影方向に直行する方向に並ぶように設定することができる。また、仮に、外側撮像部(左)23aと外側撮像部(右)23bの間隔が既知でない場合や、ゲーム装置10に対する外側撮像部(左)23aおよび外側撮像部(右)23bの取り付け精度が悪い場合であっても、左仮想カメラ63Lと右仮想カメラ63Rを理想的な間隔で配置することができる。
【0223】
また、仮想カメラ間隔決定処理によって仮想カメラ間隔(EyeWidth)が決定された後は、メイン実世界画像に対してのみマーカー認識処理を行えばよいため、常に左実世界画像と右実世界画像の両方に対してマーカー認識処理を行う場合と比較して、処理負
担を軽減することができる。
【0224】
なお、外側撮像部(左)23aと外側撮像部(右)23bの間隔が既知である場合には、仮想カメラ間隔決定処理の結果に基づいて、実世界における外側撮像部(左)23aと外側撮像部(右)23bの間隔(例えば3.5cm)に対応する、マーカー座標系における外側撮像部(左)23aと外側撮像部(右)23bの間隔(EyeWidth)が判明する。したがって、例えば、身長が30cmのキャラクタ(仮想オブジェクト)を実世界画像に合成表示したり、実世界画像に合成表示されるキャラクタ(仮想オブジェクト)を秒速10cmで移動させたりというように、仮想空間において、実世界のスケールに基づいた処理を行うことが可能となる。
【0225】
(変形例)
なお、上記実施形態では、実世界画像に含まれるマーカー61の位置及び姿勢を認識して、その認識結果に応じて実世界画像に仮想オブジェクト62を合成しているが、他の実施形態では、マーカー61に限らず、任意の認識対象の位置及び/又は姿勢を認識して、その認識結果に応じて実世界画像に仮想オブジェクト62を合成してもよい。認識対象の一例として、人物の顔が挙げられる。
【0226】
また、上記実施形態では、外側撮像部23によってリアルタイムに撮像される実世界画像に基づいて上側LCD22に立体画像を表示しているが、他の実施形態では、外側撮像部23や外部のステレオカメラ等によって過去に撮像された動画像データに基づいて上側LCD22に立体画像を表示するようにしてもよい。
【0227】
また、上記実施形態では、外側撮像部23がゲーム装置10に予め搭載されているが、他の実施形態では、ゲーム装置10に着脱可能な外付け型のカメラを利用してもよい。
【0228】
また、上記実施形態では、上側LCD22がゲーム装置10に予め搭載されているが、他の実施形態では、ゲーム装置10に着脱可能な外付け型の立体視ディスプレイを利用してもよい。
【0229】
また、上記実施形態では、マーカー座標系の原点の位置に仮想オブジェクト62を配置しているが、他の実施形態では、マーカー座標系の原点から離れた位置に仮想オブジェクト62を配置してもよい。
【0230】
また、上記実施形態では、仮想空間に仮想オブジェクトを1つだけ配置しているが、他の実施形態では、仮想空間に複数の仮想オブジェクトを配置してもよい。
【0231】
また、上記実施形態では、仮想カメラ間隔決定処理において、マーカー座標系における外側撮像部(左)23aと外側撮像部(右)23bの間隔(EyeWidth)を計算した後、当該間隔に基づいて、マーカー認識結果に基づいて計算された左仮想カメラ63Lおよび右仮想カメラ63Rのいずれか一方の仮想カメラの位置及び姿勢から、他方の仮想カメラの位置及び姿勢を決定しているが、他の実施形態では、左実世界画像に対するマーカー認識結果に基づいて計算された外側撮像部(左)23aの位置及び姿勢と、右実世界画像に対するマーカー認識結果に基づいて計算された外側撮像部(右)23bの位置及び姿勢とに基づいて、外側撮像部23の位置および姿勢(例えば、外側撮像部(右)23aの位置と外側撮像部(左)23bの位置の平均位置、外側撮像部(右)23aの姿勢と外側撮像部(左)23bの姿勢の平均姿勢)を算出し、それに基づいて、左仮想カメラ63Lおよび右仮想カメラ63Rの位置及び/又は姿勢を決定するようにしてもよい。例えば、左仮想カメラ63Lおよび右仮想カメラ63Rの姿勢が、いずれも、左実世界画像に対するマーカー認識結果に基づいて計算された外側撮像部(左)23aの姿勢と、右実世界
画像に対するマーカー認識結果に基づいて計算された外側撮像部(右)23bの姿勢のちょうど中間の姿勢となるように、左仮想カメラ63Lおよび右仮想カメラ63Rの姿勢を決定するようにしてもよい。また例えば、仮想カメラ間隔決定処理において外側撮像部(左)23aと外側撮像部(右)23bの間隔(EyeWidth)を計算した後に、左実世界画像に対するマーカー認識結果に基づいて計算された外側撮像部(左)23aの位置と、右実世界画像に対するマーカー認識結果に基づいて計算された外側撮像部(右)23bの位置の平均位置に対応する仮想空間内の位置から互いに反対方向にEyeWidth/2だけ仮想カメラの撮影方向と直交する方向にずらすことによって、左仮想カメラ63Lおよび右仮想カメラ63Rの位置を決定するようにしてもよい。
【0232】
また、上記実施形態では、仮想カメラ間隔決定処理によって仮想カメラ間隔(EyeWidth)が決定された後は、メイン実世界画像に対してのみマーカー認識処理を行っているが、他の実施形態では、常に左実世界画像と右実世界画像の両方に対してマーカー認識処理を行うようにしてもよい。
【0233】
また、上記実施形態では、上側LCD22がパララックスバリア方式の立体表示装置であるが、他の実施形態では、上側LCD22がレンチキュラー方式等の他の任意の方式の立体表示装置であってもよい。例えば、レンチキュラー方式の立体表示装置を利用する場合には、左目用画像と右目用画像をCPU311または他のプロセッサで合成してから、当該合成画像をレンチキュラー方式の立体表示装置に供給するようにしてもよい。
【0234】
また、上記実施形態では、ゲーム装置10を用いて実世界画像に仮想オブジェクトを合成表示しているが、他の実施形態では、任意の情報処理装置または情報処理システム(例えば、PDA(Personal Digital Assistant)、携帯電話、パーソナルコンピュータ、カメラ等)を用いて実世界画像に仮想オブジェクトを合成表示してもよい。
【0235】
また、上記実施形態では、一台の情報処理装置(ゲーム装置10)のみによって画像表示処理を実行しているが、他の実施形態では、互いに通信可能な複数の情報処理装置を有する画像表示システムにおいて、当該複数の情報処理装置が画像表示処理を分担して実行するようにしてもよい。