実施の形態1
本実施の形態は、視差を有する一対のステレオ画像のうち右目用画像を右目に、左目用画像を左目に到達させることにより立体視させる3次元画像表示システムに関する。その限りにおいて画像の表示形態やユーザの鑑賞形態は限定されない。例えば平板型ディスプレイやスクリーンに同時あるいは交互に視差画像を表示させ、偏光眼鏡やシャッター眼鏡により鑑賞する態様が考えられる。あるいは左右の目に対し独立に画像を提示できるヘッドマウントディスプレイを利用することも考えられる。
図1は、本実施の形態における画像表示システムの構成の一例を示す図である。この例の画像表示システムは表示装置として平板型ディスプレイ12を導入している。平板型ディスプレイ12は、無線通信またはUSBなどの周辺機器を接続するインタフェース14で画像生成装置200に接続される。画像生成装置200は、さらにネットワークを介してサーバに接続されてもよい。その場合、サーバは、複数のユーザがネットワークを介して参加できるゲームなどのオンラインアプリケーションを画像生成装置200に提供してもよい。画像生成装置200はゲーム装置、パーソナルコンピュータ、携帯端末などのいずれでもよい。また画像生成装置200と平板型ディスプレイ12とを一体的に構成してもよい。
図2は、画像表示システムによって実現される表示の形態を説明するための図である。本実施の形態では、画像を表す平面を、さらに仮想空間に配置した状態を作り出す。すなわち観念的には、立体視用の画像を表示させた画像スクリーン20を仮想空間における場22上に配置させ、ユーザ24が、ビュースクリーン26を介してそれを鑑賞できるようにする。ここでビュースクリーン26は、平板型ディスプレイ12に表示される画像の視野に対応する。なお仮想空間における場22は仮想空間の座標系を表象しているに過ぎず、形状などを限定する主旨ではない。また必ずしも表示させなくてよい。
図3は、図2の態様を実現するために画像生成装置200が生成する画像を模式的に示している。本実施の形態において画像スクリーン20に表示させる画像は、立体視用の一対の視差画像、すなわち左目用画像30aおよび右目用画像30bで構成される。図2で示すような画像を立体視させるためには、同じオブジェクトが左目用画像30aでは右寄りに、右目用画像30bでは左寄りに表れる。
また画像スクリーン20に対する視点の位置が左右の目で異なるため、それぞれの視点に対応する位置に左目用画像30a、右目用画像30bを表示させる必要がある。すなわち画像スクリーン20の枠の位置は左目用画像30a、右目用画像30bで異なり、それらを同一平面上に重ねて表すと、平面32に示すような位置関係となる。このような左目用画像30a、右目用画像30bを生成し、既知の手法により左目、右目にそれぞれ到達させることにより、ユーザには画像スクリーン20に表れるオブジェクトが立体に見えるようになる。
このように本実施の形態では、あらかじめ立体視用に準備された一対の画像を鑑賞する態様を想定している。仮想的な空間を立体視させる技術としては、仮想世界が3次元空間で定義済みであり、鑑賞者の左右の視点に応じたビュースクリーンに仮想世界のオブジェクトを射影して視差画像を生成する技術がある。一方、3次元動画のようにあらかじめ撮影または生成された2次元画像を立体視させる場合、元々視差が与えられているためそのままでは鑑賞者の視点が限定される。
図4は、立体視用の画像を取得する段階で与えられる視差と画像の関係を説明するための図である。同図は想定する左右の視点(カメラ70a、70b)、画像が取得される画像スクリーン76、および画像に写るオブジェクト78を含む仮想的な空間を俯瞰した状態を模式的に示している。なお当該画像はステレオカメラで撮影した画像とすることもでき、カメラ70a、70bはその場合のステレオカメラに相当する。
また同図では一対の画像の平面を画像スクリーン76で同時に表している。以後、このように画像スクリーン76上で元々取得されている画像を、鑑賞段階での表示画像と区別するために「原画像」と呼ぶことがある。また以後の説明において原画像の平面と垂直な方向をZ軸、画像平面における水平方向および垂直方向をそれぞれX軸、Y軸とする。
原画像にはオブジェクト78の像が表れている。例えばオブジェクト78表面のある点80は、左のカメラ70aからは光軸82aから右側にaだけ離れた位置84aに、右のカメラ70bからは光軸82bから左側にbだけ離れた位置84bに表れる。つまり点80に対する視差Dpはa+bである。実際には様々な位置にオブジェクトが存在してよく、その深さ方向の距離に応じた視差で、左右の原画像に像が表される。
画像スクリーン76からオブジェクト78上の点80までの距離Zpは、視差Dpを用いて三角形の相似により次のように求められる。
Ewp : Exp - Dp = Scp + Zp : Zp
よって
Zp = Scp * Ewp / Dp - Scp
ここでEwpは左右のカメラ70a、70bの間隔、Scpはカメラ70a、70bから画像スクリーン76までの距離である。
このように得られた原画像を上述のように鑑賞する場合を考える。図5は適切な位置から視差画像を鑑賞する場合の視点と画像の関係を示している。図の形式は図4と同様である。画像を鑑賞する段階では、鑑賞者の視点88a、88bと、それらから距離Scsだけ隔てた位置に鑑賞者が見るビュースクリーン86が存在する。そのような空間に図4で示した視差画像取得時の位置関係を当てはめた場合、図示するように鑑賞者の視点88a、88bがカメラ70a、70bと同じ位置になるように画像スクリーン76の位置を決め、その位置での視差画像をビュースクリーン86にそれぞれ射影すれば、オブジェクト78を歪みなく立体視できる。
これは原画像を取得した際のカメラ70a、70bの視錐台と、それを鑑賞する際の視点88a、88bの視錐台がそれぞれ一致していることに相当する。一方、鑑賞者が移動して視点88a、88bが図示するような位置関係から外れると、オブジェクトが歪んで見えたり適正に立体視できなかったりすることが考えられる。場合によっては体調に悪影響を及ぼすこともある。
図6は、図5の配置において、仮想空間における鑑賞者の視点がずれたときの視覚的な歪みを説明するための図である。図6に示すように、鑑賞者の視点がX軸方向にx_offだけずれ、視点88a、88bから視点89a、89bへ移動した場合、そのままの画像では、視点に対して相対的に像が移動していることになる。結果として仮想空間においてオブジェクト78がオブジェクト79の位置に動いたように見え、視覚的な歪みを生じさせる。本実施の形態では表示画像を適切に補正することにより、視点がずれても歪みのない立体映像を視認できるようにする。
具体的には視点が移動しても、それに応じて仮想空間でのオブジェクトの位置が変化したり歪んだりすることがないように原画像を補正する。なお以後の説明では、図5に示した、カメラと鑑賞者の視錐台が一致した状態での視点の位置を基点とし、そこからの視点の移動とそれによる画像の変化に主眼を置く。
図7は、本実施の形態における画像生成装置200が、原画像から表示画像を生成する処理手順の概略を示すフローチャートである。画像生成装置200はまず、ユーザの視点の位置を取得する(S10)。例えば立体映像を鑑賞するユーザの姿を、図示しない撮像装置で撮影し、その画像に基づきユーザの位置や姿勢を取得する。発光マーカーを備えた眼鏡をかけさせることにより、より厳密に頭部の位置や傾きを取得してもよい。このようにして取得した頭部の位置や姿勢から、視点の位置を推定できる。このほか、ユーザの視点の取得方法が様々に考えられることは当業者には理解されるところである。
次に画像生成装置200は、表示装置の画面に対応するビュースクリーン上の画素が原画像のどの位置に対応するかを計算する(S12)。より詳細にはまず、視点の動きに応じて画像に表されているオブジェクトが変化しないように、すなわちオブジェクトの位置が仮想空間で固定されて見えるように、像を構成する各画素の移動量、移動方向を求めて原画像を変化させた補正画像を生成する。
そのうえで、視線の方向に応じて補正画像全体に透視変換をかける。定性的には、このような一連の動きを逆に辿ることにより、ビュースクリーンの画素ごとに原画像の対応する位置を求められる。そして原画像における当該位置のカラー値をビュースクリーンの画素に反映させることにより表示画像を描画する(S14)。これらの処理を左右の視点に対して行うことで、表示画像を生成できる。当該表示画像のデータを、表示装置に出力することで(S16)、視点が移動しても歪みが生じない立体画像を視認させることができる。
図7のS12およびS16の2段階の処理は、原画像自体を順次変化させて実現することも可能である。すなわち視点の移動により、一旦、原画像を変化させた補正画像を生成し、それをビュースクリーン上に透視変換することにより表示画像を描画できる。ただしこの場合、原画像に対して2度の変換処理が施されるため、表示画像の品質が維持されない可能性がある。そこで上述の補正画像そのものを生成する代わりに、視点移動に応じた補正画像における各画素が、元は原画像のどの位置にあったかを表す画像マップを生成する。
そして当該画像マップをビュースクリーン上に射影してビュースクリーンとマップとの位置関係を特定したうえで、ビュースクリーン上の画素が原画像のどの位置に対応するかを確認して原画像からカラー値を取得する。このようにすることで、原画像に対する操作は1度ですむことになり、画質を原画像レベルに維持することができる。
ここで補正画像における各画素が原画像のどの位置に対応するかを表す情報は、画像平面上で始点および終点が規定されるベクトル値となるため、以後、「画像参照ベクトル」と呼ぶ。また補正画像上で画素ごとに画像参照ベクトルの情報を保持する、画像平面に対応するマップを「画像参照ベクトルマップ」または単に「マップ」と呼ぶ。
図8は画像生成装置200の内部回路構成を示している。画像生成装置200は、CPU(Central Processing Unit)222、GPU(Graphics Processing Unit)224、メインメモリ226を含む。これらの各部は、バス230を介して相互に接続されている。バス230にはさらに入出力インタフェース228が接続されている。
入出力インタフェース228には、USBやIEEE1394などの周辺機器インタフェースや、有線又は無線LANのネットワークインタフェースからなる通信部232、ハードディスクドライブや不揮発性メモリなどの記憶部234、ヘッドマウントディスプレイ100などの表示装置へデータを出力する出力部236、ヘッドマウントディスプレイ100からデータを入力する入力部238、磁気ディスク、光ディスクまたは半導体メモリなどのリムーバブル記録媒体を駆動する記録媒体駆動部240が接続される。
CPU222は、記憶部234に記憶されているオペレーティングシステムを実行することにより画像生成装置200の全体を制御する。CPU222はまた、リムーバブル記録媒体から読み出されてメインメモリ226にロードされた、あるいは通信部232を介してダウンロードされた各種プログラムを実行する。GPU224は、ジオメトリエンジンの機能とレンダリングプロセッサの機能とを有し、CPU222からの描画命令に従って描画処理を行い、表示画像を図示しないフレームバッファに格納する。そしてフレームバッファに格納された表示画像をビデオ信号に変換して出力部236に出力する。メインメモリ226はRAM(Random Access Memory)により構成され、処理に必要なプログラムやデータを記憶する。
図9は、本実施の形態における画像生成装置200の機能ブロックを示している。なお図9で示した画像生成装置200の機能のうち少なくとも一部を、表示装置に実装してもよい。あるいは、画像生成装置200の機能のうち少なくとも一部を、ネットワークを介して画像生成装置200に接続されたサーバに実装してもよい。また画像生成装置200を、ゲーム機やパーソナルコンピュータなどの情報処理装置の一部としてもよい。
同図は画像生成装置200が有する機能のうち、主に表示画像を生成する機能に着目したブロック図を描いている。これらの機能ブロックは、ハードウェア的には、図8に示したCPU、GPU、各種メモリなどの構成で実現でき、ソフトウェア的には、記録媒体などからメモリにロードした、データ入力機能、データ保持機能、画像処理機能、通信機能などの諸機能を発揮するプログラムで実現される。したがって、これらの機能ブロックがハードウェアのみ、ソフトウェアのみ、またはそれらの組合せによっていろいろな形で実現できることは当業者には理解されるところであり、いずれかに限定されるものではない。
画像生成装置200は、ユーザの位置や姿勢を取得する位置・姿勢取得部250、ビュースクリーンを設定するビュースクリーン設定部252、視点の位置に基づき画像参照ベクトルマップを生成する原画像操作部254、原画像のデータを格納する原画像データ記憶部256、画像参照ベクトルマップなどの中間データを格納する参照データ記憶部262、画像参照ベクトルマップを用いてビュースクリーンに表示画像を描画する表示画像生成部268、および、生成された表示画像のデータを出力する出力部270を備える。
位置・姿勢取得部250は、上述のような手段によりユーザの頭部の位置や姿勢を取得する。ビュースクリーン設定部252は表示装置の画面に対応するビュースクリーンを設定する。表示装置を平板型ディスプレイとした場合、ビュースクリーンは固定されるが、ヘッドマウントディスプレイの場合は、ユーザの頭部の動きに対応するようにビュースクリーンを動かす必要がある。この場合、ビュースクリーン設定部252は、位置・姿勢取得部250からユーザの頭部の位置や姿勢に係る情報を逐次取得し、それに応じてビュースクリーンを設定する。ビュースクリーン上で描画される表示画像は、例えば図3で示した左目用画像60aおよび右目用画像60bであり、ビュースクリーンも左目用と右目用を設定する。
原画像操作部254は、位置・姿勢取得部250が取得したユーザの頭部の位置や姿勢に係る情報に基づき視点の位置を特定し、それに応じてオブジェクトの像を構成する画素の移動量および方向を計算する。そして移動後の各画素が、原画像のどの位置に対応するかを表す画像参照ベクトルを生成する。さらに当該ベクトルを画像平面の各画素に対応づけた画像参照ベクトルマップを、左右の目に対しそれぞれ生成する。
後述するように画像参照ベクトルを決定するには、視点の移動量および移動方向に加え、画像上で表されているオブジェクトの、仮想空間における距離Zpが必要になる。距離Zpは左右の原画像の視差Dpから上述のように求められる。原画像データ記憶部256には、左右の原画像データ258と、それぞれの画像の画素ごとに視差値を保持する左右の視差値画像データ260が格納される。なお視差値画像データ260の代わりに、左右の画像の画素ごとに距離Zpを保持する距離値画像データを準備してもよい。
なお原画像操作部254は、視点によっては左目用の画像参照ベクトルマップに右目用の原画像を参照する画素を設けたり、右目用の画像参照ベクトルマップに左目用の原画像を参照する画素を設けたりしてもよい。これは、左右の原画像のうち一方では死角になって像として表れていない箇所が、他方で表れている場合があるためである。視点の移動によってそのような死角部分を表示する必要が生じた場合、他方の画像からデータを取得することにより、そのような細部も高精度に再現することができる。
参照データ記憶部262は、原画像操作部254が生成した、左右の画像参照ベクトルマップ266を格納するほか、それを作成する段階で、画像参照ベクトルに書き込むべきデータを判定するためのZ値の情報を格納するZバッファ264を含む。表示画像生成部268は、ビュースクリーン設定部252が設定したビュースクリーン上に、各画素に対応する原画像の画素値を参照することによって表示画像を描画する。
すなわち画像参照ベクトルマップを透視変換によりビュースクリーン上にマッピングしたうえ、ビュースクリーン上の画素に対応するマップ上の位置で取得された画像参照ベクトルに基づき原画像のカラー値を取得することで、当該画素の画素値を決定する。これを左右の目のそれぞれに対して行うことで、左目用、右目用の表示画像を生成できる。出力部270は、表示画像生成部268が生成した左右の表示画像のデータを、表示装置に所定のレートで出力する。出力部270はさらに、メニュー画面用の音楽や各種コンテンツに含まれる音声などの音響データも出力してよい。
次に原画像操作部254が画像参照ベクトルを計算する手法について説明する。図10は、視点の移動量と、それに応じた原画像の画素の移動量との関係を説明するための図である。同図では図5で示した状態における視点88a、88bからX軸方向にx_offだけ移動した後の視点を、視点89a、89bとして示している。なおモデルを簡略化するため、原画像が仮想空間のビュースクリーン86上に配置されるように、つまり画像スクリーン76がビュースクリーン86に一致するとする。
このような配置はステレオ画像を適宜拡大・縮小することによって可能である。これにより視点から画像スクリーン76までの距離Scpと、視点からビュースクリーン86までの距離Scsは等しくなる。また以後の説明において、画像上での長さの単位は図示するような仮想空間での長さの単位に適宜換算されるものとする。
画像参照ベクトルは、視点88a、88bから原画像をみたときと、移動後の視点89a、89bから補正後の画像を見たときで、仮想空間にあるオブジェクト78が固定されて見えるときの画素の対応関係を表す情報である。例えば視点88bから見て右目用の原画像のX軸方向の位置ixRに見える像を、補正後の画像上の位置txRに移動させ、視点89bから見れば、オブジェクト78は固定されて見える。
このときの補正量dxは視点の移動量x_offと、三角形の相似により次のような関係にある。
dx : x_off = Zp : ( Scp + Zp)
したがって補正量dxは、
dx=Zp * x_off /(Scp + Zp)
により求めることができる。すなわち補正量dxは、画素が表すオブジェクトの距離Zpと視点の移動量x_offの関数である。
この補正量dxを原画像の画素ごとに計算する。ただし距離Zpの変化がない領域では、その領域全体で一つの距離Zpをもつとみなして、領域の単位で表示位置を補正してもよい。画像のY軸方向の補正量dyについてもY軸方向の視点の移動量をもとに計算することができる。このようにして各画素の補正量を示す変位ベクトル(dx,dy)が、各画素が表すオブジェクトの距離Zpから算出される。距離Zpは、前述のように各画素の視差値から算出されるため、結局のところ、各画素の変位ベクトル(dx,dy)は各画素の視差値から算出できる。
このため本実施の形態では、左右の原画像に対し、それらに像として表れるオブジェクトの視差を画素ごとに表した視差値画像のデータを準備する。すなわち左目用の原画像を基準として当該画像の画素ごとに視差値を表した左目用の視差値画像、右目用の原画像を基準として当該画像の画素ごとに視差値を表した右目用の視差値画像を準備する。視差値画像を左目用、右目用で準備する理由は次のとおりである。
図11は左右の原画像に表される同一のオブジェクトの像を重ねて示している。左目用の原画像90a、右目用の原画像90bの画素領域の境界を、それぞれ実線、破線の格子で示している。図示するように同じオブジェクトの像92を表す画素集合であっても、両画像の画素の境界が一致するとは限らない。このとき、例えば左目用の原画像90a中のある画素(例えば太線枠の画素94)に対応する領域は、右目用の原画像90bでは2つの画素にまたがっている。
この場合、左目用の原画像90aの画素94に対して得られる視差値は画素より小さいサブピクセルの単位となる。つまりおよそ同じ像を表す画素であっても、左右どちらの原画像を基準とするかで、表されるオブジェクト上の位置に微小な差が生じ、それがサブピクセル単位の視差値の差を生む。結果として画素ごとに視差値を表したデータは、左右の原画像で一致しないことが多い。換言すれば、画素単位で視差の値を保持する「視差値画像」を、左右の原画像のそれぞれに対して生成しておき、独立に補正することにより、サブピクセル単位での視差情報、ひいては奥行き情報を画像に反映させることができる。
図12は、原画像の各画素の変位ベクトルを示す図である。同図の(a)では、4つの画素a、b、c、dの変位ベクトル(dx、dy)が矢印で示されている。(b)は、変位ベクトルによって変位した4つの画素a、b、c、dの位置を示している。
原画像操作部254は、(b)の変位した画素の中心を結んだ三角形をラスタライズして、三角形内部の各画素について画像参照ベクトルを求める。(a)に示す原画像の三角形を構成する3画素の座標値(整数値)を(ix0,iy0)、(ix1,iy1)、(ix2,iy2)と書く。3画素の変位ベクトルを(dx0,dy0)、(dx1,dy1)、(dx2,dy2)とする。(b)に示す変位後の3画素の座標値(実数値)を(tx0,ty0)、(tx1,ty1)、(tx2,ty2)と書くと、変位後の3画素の座標値は、浮動小数点数であり、
txi=ixi+dxi
tyi=iyi+dyi
で求められる(ただし、i=0、1、2である)。
図13は、画像参照ベクトルの生成方法を説明するための図である。まず(a)に示すように、変位後の3画素(tx0,ty0)、(tx1,ty1)、(tx2,ty2)が構成する三角形の内部の一つの対象画素Tの座標値(整数値)を(itx,ity)とする。この対象画素Tの重心座標(α,β,γ)は下記の式で求められる。
また(b)に示すように、対象画素T(itx,ity)へ変位する始点Pの座標値(実数値)を(px,py)と書く。視点の移動により、始点Pは対象画素Tに対応づけられる。始点Pの座標値(px,py)は、対象画素T(itx,ity)の重心座標(α,β,γ)を用いて次式により算出される。
px = α*ix0 + β*ix1 + γ*ix2
py = α*iy0 + β*iy1 + γ*iy2
図14は、画像参照ベクトルを説明するための図である。図13の(b)で説明したように、変位後の3画素が構成する三角形の内部の対象画素T(itx,ity)の始点P(px,py)が算出される。視点移動によって始点Pが対象画素Tに対応づけられており、図14の(a)の矢印で示すように、対象画素Tの座標から始点Pの座標を逆向きに参照するベクトル、すなわち補正画像における各画素が原画像のどの位置に対応するかを表すベクトルが画像参照ベクトルである。
また(b)に示すように、画像参照ベクトルマップは、三角形の内部の対象画素毎に始点を指す画像参照ベクトル(矢印で示されている)を格納したマップである。以後、画像参照ベクトルマップを単に「マップ」と呼ぶ場合もある。三角形内部をラスタライズした対象画素T(itx,ity)には、3画素(ix0,iy0)、(ix1,iy1)、(ix2,iy2)の画素値をバイリニア補間することにより得られる始点Pの画素値が格納されるのではなく、対象画素Tから始点Pを参照するベクトルが格納されることに留意する。
通常の画素値(例えばRGBA値)の場合には、格納すべき画素値が存在しないことを表すため、画素値の各要素に0を格納することができる。一方、画像参照ベクトルの場合は、格納すべき値が存在しないことを、画像参照ベクトルの値を0とすることで表現することはできない。画像参照ベクトルが0であることには、原画像からの補正量がゼロであるという意味があり、対応する視差値あるいは距離値をもつ参照元の始点Pが存在しないことと区別できないからである。
そこで、例えば画像参照ベクトルのX成分の最下位ビットを、画像参照ベクトルの存在・非存在を示すフラグビットとして用いることにする。このフラグビットが0であれば、その画素の画像参照ベクトルは無効であるとして扱い、フラグビットが1である場合にのみ、画像参照ベクトルを有効なデータとして用いる。なお、このフラグビットを画像参照ベクトルの最下位ビットに埋め込まずに、別のメモリ領域に保存することで同じ処理を行うことも可能である。ただしその場合は、余分にメモリ領域が必要になることに加え、そのメモリ領域を読み書きするための余分なメモリバンド幅を消費するデメリットが生じる。
前述の画像参照ベクトルマップの生成処理は、少なくとも3つの画素が三角形形状に並んでいる場合を説明したが、実際の原画像ではアルファテストなどを前提としてアルファ値が0の無効な画素を含む場合がある。このような場合には、アルファ値が0でない有効な画素に対してのみ、画像参照ベクトルを生成する必要がある。あるいは、視差値画像の画素値の一部のビットを原画像の画素の有効/無効の表現に用いる、別のメモリ領域に有効/無効の情報を直接保持する等の方法も考えられる。以下、画像参照ベクトルマップの生成処理を場合分けして詳しく説明する。
図15は、1画素のみが有効な場合の、画像参照ベクトルの生成手法を説明する図である。有効な画素の周囲の画素はすべて無効である。この場合、以下のように有効な1画素のみを用いて画像参照ベクトルを生成する。図10で示したように、両視点がX軸方向にx_offだけ移動した場合、補正量(dx0,dy0)はオブジェクトの距離Zp0を用いて、
dx0 = Zp0 * x_off/(Scp +Zp0)
dy0 = 0
となる。
ここで(dx0,dy0)は浮動小数であり、(ix0,iy0)の画素の位置補正量が(dx0,dy0)であるということは、dx0、dy0の小数点以下を四捨五入した位置の画素がターゲットの画素になると考えられるので、画像参照ベクトルマップの((int)(ix0+dx0+0.5),(int)(iy0+dy0+0.5))の位置の画素の画像参照ベクトルとして(−dx0,−dy0)を書き込む。
図16は、2画素が有効な場合を示す図である。2画素が有効な場合は、(a)のように横2画素が有効な場合、(b)のように縦2画素が有効な場合、(c)のように左上と右下の横2画素が有効な場合、(d)のように右上と左下の横2画素が有効な場合の4つに分けて処理する。画素の座標を1ずつインクリメントするので、重複した場合を除くと以上の4つの場合が存在する。
図17および図18は、2画素が有効な場合に画像参照ベクトルを求める方法を説明するための図である。図17の(a)に示すように有効な2画素について、それぞれの視差値から各画素の変位した位置を計算する。図17の(b)は変位後の2画素の位置を示す。画像参照ベクトルを求めたい対象画素をT(itx,ity)とする。変位した2画素の位置を結ぶ線分に対象画素T(itx,ity)の中心から垂線を下ろし、垂線の足が当該線分を内分する比α:1−αを求める。
次に、図18の(a)に示すように、元の2画素の中心を結ぶ線分を内分比α:1−αで内分する点を始点P(px,py)として求める。そして図18の(b)に示すように、対象画素T(itx,ity)から始点P(px,py)を参照するベクトルを求め、対象画素T(itx,ity)の画像参照ベクトルとする。
図19は、3画素が有効な場合の、画像参照ベクトルの生成手法を説明する図である。を説明する図である。3画素が有効な場合は、(a)のように右下1画素が無効な場合、(b)のように右上1画素が無効な場合、(c)のように左下1画素が無効な場合、(d)のように左上1画素が無効な場合の4つに分けて処理する。それぞれの場合で前述のように有効な3画素が構成する三角形において重心座標を用いた補間により画像参照ベクトルを求めればよい。
図20は、4画素が有効な場合の、画像参照ベクトルの生成手法を説明する図である。(a)のように4画素がすべて有効である場合は、(b)のように右下1画素が無効でそれ以外の3画素が有効である場合と、(c)のように右上1画素が無効でそれ以外の3画素が有効である場合とに分けることができる。したがって(b)の有効3画素が構成する三角形と(c)の有効3画素が構成する三角形についてそれぞれラスタライズし、重心座標を用いた補間により画像参照ベクトルを求めればよい。
以上の画像参照ベクトルの生成処理を、ix、iyを1ずつインクリメントしながら行う。境界線上の画素のラスタライズは、計算誤差による穴あきを避けるため、各処理間で重複して処理を行い、画像参照ベクトルを求めると同時に、変位した座標の各画素中心でのZp値を同じ線形補間のパラメータにより求め、これをZバッファ264に保存してZ比較を行うことにより最も小さいZp値を持つ画像参照ベクトルを選択する。これにより境界線上での重複を一意的に排除できる。
次に、図21〜図24を参照して、ユーザが頭部を回転させた場合の画素の変位を求め、画像参照ベクトルを得る方法を説明する。ステレオ画像による立体映像を鑑賞する場合、左右の画像のオフセット方向が人間の目の水平方向に対して回転すると脳内の画像処理が破綻し、めまいなどが生じたり、立体に見えず二つの画像に見えたりするなどの問題が発生する。このようなスクリーン面内でのステレオ画像のZ軸周りの回転を補正する方法を示す。
図21は、仮想空間を観察するユーザの両目の位置の回転を説明する図である。ユーザが頭部を傾けると、ビュースクリーン86を通してオブジェクト78を観察するユーザの両目が中心視線562の周りに回転すると考える。すなわちここでの回転は、左右の視点を結ぶ横方向の直線と、画面の横軸を含む実際の水平面とのなす角度(傾き)の変化を指し、ユーザが首をかしげる際などに回転が生じることになる。
図22は、仮想空間に配置された原画像を中心視点から見た場合の画像を説明する図である。ビュースクリーン86の面内の回転を考え、回転軸は中心視線562であるとする。左右の目の中心である中心視点560Cから見たときに、適正な状態でのオブジェクト78の像545Cを「中心画像」と呼ぶ。
中心画像545Cは左右の目から見て同一の画像であるので(正確には、対象物の表面の鏡面反射が左右の視点で違うことから生じる輝度の差異や、サブピクセルレベルでの画素位置のずれに起因した輝度の差異がある)、これを基準画像と考え、これが中心視線562を中心に回転すると考える。中心視点560Cは左目の視点88aと右目の視点88bの中心にあるので、中心画像545Cは右目画像と左目画像の中心にある。右目画像と左目画像の対応点間の距離Ewp−DpをEwosc(eye width on screen)と書く。Ewoscは距離Zpの関数である。
図23は、左目用画像510aと右目用画像510bとを中心視点560Cで重ねた状態を説明する図である。符号517aは左目用スクリーンの中心軸、符号517bは右目用スクリーンの中心軸を示す。左目用画像510aには左目用スクリーンに表示される左目用オブジェクト545aがあり、右目用画像510bには右目用スクリーンに表示される右目用オブジェクト545bがあり、その間に中心画像545Cがある。
図24は、右目用画像510bにおける回転補正を説明する図である。中心視点560Cの周りに両目が角度θだけ回転すると、右目用画像510bにおいて、右目用オブジェクト545bは中心画像545Cを中心として角度θだけ回転した位置(符号545b’)に変位する。右目用画像510bにおいて各画素のX軸方向の変位量dx、Y軸方向の変位量dyを求める。
右目画像の所与の画素の座標値(整数値)を(irx,iry)とすると、当該所与の画素に対応する中心画像545Cの画素位置は(irx−Ewosc/2.0,iry)である。角度θだけ回転した場合の中心画像の画素位置からのX軸方向、Y軸方向の補正量dx、dyは以下のようになる。
dx = Ewosc / 2.0 * cos(θ)
dy = Ewosc / 2.0 * sin(θ)
これより、右目用画像の所与の画素のX軸方向の変位量dx、Y軸方向の変位量dyは、
dx = -Ewosc / 2.0 + Ewosc / 2.0* cos(θ)
dy = Ewosc / 2.0 * sin(θ)
である。これを用いて、変位後の画素から元の画素を参照するベクトル、すなわち画像参照ベクトルは、(−dx,−dy)で与えられる。
左目用画像についても同様に所与の画素のX軸方向の変位量dx、Y軸方向の変位量dyは、
dx = Ewosc / 2.0 - Ewosc / 2.0 * cos(θ)
dy = -Ewosc / 2.0 * sin(θ)
である。右目用画像の変位量とは正負が逆であることに留意する。左目用画像の変位後の画素から元の画素を参照するベクトル、すなわち画像参照ベクトルは、(−dx,−dy)で与えられる。
図25は、図7のS12における画素の対応関係の取得処理として、原画像操作部254が画像参照ベクトルマップを生成する処理手順をより詳細に示すフローチャートである。前段の処理として、原画像および視差値画像のデータが入力され、ユーザの視点の移動量および回転角が取得されているとする(S32)。原画像操作部254は、原画像の各画素の視差値、視点の移動量、および回転角から、各画素の変位ベクトル(dx,dy)を算出する(S34)。
そして原画像の各画素の変位(dx,dy)にもとづいて、変位後の画素を頂点とする三角形の内部の対象画素T(itx,ity)に対する始点Pの座標値(px,py)を求める(S36)。さらに対象画素T(itx,ity)から始点P(px,py)へのベクトル(px−itx,py−ity)を、対象画素T(itx,ity)の画像参照ベクトルとして計算する(S38)。すべての対象画素についてステップS36およびS38の画像参照ベクトルを求め、画素に対応づけて設定することにより、画像参照ベクトルマップが生成される(S40)。
図26は、図7のS14において、表示画像生成部268が原画像をビュースクリーンにマッピングする処理手順をより詳細に示すフローチャートである。表示画像生成部268はまず、ビュースクリーン上の点(tx,ty)にマッピングされるべきテクスチャ座標(tu,tv)を生成する(S42)。そして画像参照ベクトルマップをテクスチャとして、ステップS42で指定されたテクスチャ座標にもとづき画像参照ベクトルをフィルタリングする(S44)。すなわち画像参照ベクトルマップから画像参照ベクトルをサンプリングし、後述の拡張されたバイリニア補間によりフィルタリングすることにより、テクスチャ座標における画像参照ベクトルを求める。
そのようにして求めた画像参照ベクトルをテクスチャ座標(tu,tv)に加算してなる参照先のテクスチャ座標(u,v)にもとづいて、原画像の画素値をフィルタリングすることにより、ビュースクリーン上の各画素にマッピングされるべき原画像のカラー値を生成する(S46)。ビュースクリーン上のすべての画素について、ステップS42、S44およびS46の手順により、マッピングされるカラー値を生成することにより、原画像がビュースクリーンにマッピングされてなる表示画像が生成される(S48)。
このように本実施の形態では、原画像をビュースクリーンにテクスチャマッピングする際、原画像の位置に画像参照ベクトルマップが存在するとみなして、当該マップをテクスチャとして参照し、格納された画像参照ベクトルをフィルタリングする。さらに、原画像の画素のうち、フィルタリングされた画像参照ベクトルが指す参照先の画素の値を、周囲の画素値をバイリニア補間することによりフィルタリングして、ビュースクリーンにマッピングする。フィルタリングされた画像参照ベクトルによって元のステレオ画像を直接参照するため、画素のフィルタリングは1回のみとなる。
一方、画像参照ベクトルマップを生成する代わりに、視点の移動に応じて画素値を変位させた補正画像そのものを生成する場合、原画像から補正画像を生成する処理と、補正画像からビュースクリーンにテクスチャマッピングする処理と、により画素に対し2回のフィルタリングが行われるため、画質が劣化しやすくなる。画像参照ベクトルマップを利用してフィルタリングの回数を1回とすることにより画質の劣化を防ぐことができる。
図27は、表示画像、画像参照ベクトルマップ、および原画像の関係を説明するための図である。(b)に示す原画像600の位置に(a)に示す画像参照ベクトルマップ610が存在する。(a)に示すように、表示画像620を構成するビュースクリーンの画素格子は、原画像600の画素格子とはずれている。
(a)に示すように、表示画像620の画素の中心点Sにおいて画像参照ベクトルマップ610から画像参照ベクトルをサンプリングする。表示画像620において画素中心にあるサンプリング点Sは、画像参照ベクトルマップ610においてはテクスチャ座標(tu,tv)で指定される。サンプリング点Sにおける画像参照ベクトルは、画像参照ベクトルマップ610に格納された周囲の有効画素の画像参照ベクトルを後述の拡張されたバイリニア補間によってフィルタリングすることにより、(a)の矢印のように求められる。
次に、(b)に示すように、サンプリング点Sの画像参照ベクトルが指す参照先の画素Pの画素値を、原画像600から通常のバイリニア補間によってフィルタリングして求める。
図28は、画像参照ベクトルマップをサンプリングする方法を説明するための図である。画像参照ベクトルマップ610を原画像の位置にあるテクスチャとして(a)に示すS点をサンプリングし、S点の画像参照ベクトルを求める。S点の周囲の4画素A、B、C、Dのうち、3つの画素B、C、Dの画像参照ベクトルが存在するが、画素Aには画像参照ベクトルが存在しないとする。この場合、画像参照ベクトルが存在する3つの画素B、C、Dの画像参照ベクトルを線形補間することにより、S点の画像参照ベクトル(図中矢印で示す)を求める。このように画像参照ベクトルマップには無効な画素がある場合があるため、後述のように通常のバイリニア補間とは異なる処理が必要となる。
(a)で得られたS点の画像参照ベクトルが指す参照先は、(b)で示すように原画像のP点を参照している。原画像をサンプリングしてアルファブレンド、アルファテストなどを行い、P点をレンダリングしてP点のカラー値を求める。このサンプリングは、P点の周囲の4つの画素の画素値を通常のバイリニア補間で補間することにより行われる。このように本実施の形態では、(b)の原画像の位置に(a)の画像参照ベクトルマップが存在すると考えて、(a)の画像参照ベクトルマップに格納された画像参照ベクトルをフィルタリングし、フィルタリングされた画像参照ベクトルによって(b)の原画像を参照して画素をフィルタリングする。
画像参照ベクトルマップには画像参照ベクトルが存在しない無効な画素が存在する場合があるため、画像参照ベクトルマップを参照するテクスチャマッピングは以下のように場合分けして処理する必要がある。
図29は、画像参照ベクトルマップの指定されたテクスチャ座標の周囲の4画素とも有効な場合のフィルタリングを説明する図である。(a)に示すように4画素には有効な画像参照ベクトルV00、V10、V01、V11が格納されている。(b)に示すように、指定されたサンプリング位置のS点(tu,tv)が水平方向にはfx:(1−fx)で水平2画素を内分する位置に、垂直方向にはfy:(1−fy)で垂直2画素を内分する位置にある場合、4画素の画像参照ベクトルを次式によりバイリニア補間してS点の画像参照ベクトルFを求めればよい。
F=V01*(1-fx)*fy+V11*fx*fy+V00*(1-fx)*(1-fy)+V10*fx*(1-fx)
図30は、画像参照ベクトルマップの指定されたテクスチャ座標の周囲の4画素のうち、3画素が有効な場合のフィルタリングを説明する図である。(a)のように左上画素が無効な場合、残りの3画素の画像参照ベクトルから次式により無効な左上画素の画像参照ベクトルV00を求める。
V00 = (V10-V11)+(V01-V11)+V11
(b)のように右上画素が無効な場合、残りの3画素の画像参照ベクトルから次式により無効な右上画素の画像参照ベクトルV10を求める。
V10 = (V00-V01)+(V11-V01)+V01
(c)のように左下画素が無効な場合、残りの3画素の画像参照ベクトルから次式により無効な左下画素の画像参照ベクトルV01を求める。
V01 = (V00-V10)+(V11-V10)+V10
(d)のように右下画素が無効な場合、残りの3画素の画像参照ベクトルから次式により無効な右下画素の画像参照ベクトルV11を求める。
V11 = (V10-V00)+(V01-V00)+V00
このようにして無効な1画素の画像参照ベクトルを有効な3画素の画像参照ベクトルから生成し、4画素の画像参照ベクトルを用いてバイリニア補間すれば、サンプリング位置のS点の画像参照ベクトルFを精度良く求めることができる。この補間処理を行わない場合、例えば、ある画素に有効な画像参照ベクトルが無く、(inv_off_x, inv_off_y)が初期値の(0.0, 0.0)であることは、同じ(tu, tv)座標の画素をサンプリングするという意味になる。このため画像参照ベクトルのバイリニアフィルタリングにこのベクトル(0.0, 0.0)が用いられると、他の画素の変位ベクトルを元の画素の位置へ引っ張るため結果的に関係の無い途中の画素への参照ベクトルが生成され、関係のないカラー値が最終画像に現れる。本実施の形態では、無効な1画素の画像参照ベクトルを有効な3画素の画像参照ベクトルから生成することでこの問題を解決している。
有効な画素が2つ以下の場合は画像参照ベクトルマップのバイリニアサンプリングによる描画を行わない。この場合、例えば画像参照ベクトルマップのポイントサンプリングを行い、有効な画素のみについて原画像への参照を行い、画素のカラー値およびアルファ値のバイリニア補間を行うことで画像を描画すればよい。
無効な画素の画像参照ベクトルを補間で求める場合、当該画素の画像参照ベクトルが無効であるという情報は、画像参照ベクトルの補間の計算では反映されないことになる。しかしながら、そもそもこの無効性の情報は、入力された原画像データのアルファ値あるいは視差値の有効性の情報が画像参照ベクトルに反映されたものであるから、補間された画像参照ベクトルから元の画素データを参照する際に結果的に反映される。具体的には、例えば元の画素データのバイリニア補間を行う場合に、アルファ値に関してもバイリニア補間を行い、得られたアルファ値を用いてアルファテストあるいはアルファブレンドを行うことで、無効な画素のカラー値は表示画像に反映されなくなる。
ポイントサンプリングで画像参照ベクトルを求める場合、画像の内部に画像参照ベクトルが急激に変化する点が存在すると、視点を滑らかに移動させる時に画素のちらつきが発生することがある。また、画像参照ベクトルを通常のバイリニアサンプリングで求めると内部の点のちらつきは低減されるが、無効な点が参照されやすい画像の境界部分でちらつきが発生し易い。それに対して、上述のように画素の有効/無効情報を利用した拡張されたバイリニアサンプリングを行うことにより、画像内部においても境界部分においてもちらつきのない画像生成が可能になる。
[視差値のフィルタリング]
ここで、視差値のフィルタリングについて説明する。原画像を3Dモデルデータのレンダリングにより生成する場合は、それぞれの視差値を画素ごとに正確に求めることが可能であるが、自然画を撮影した原画像を解析して視差値を求める場合は、各画素の視差値が精度良く得られない場合も多い。
このような場合、視差値にフィルタリングを施すことで、破綻の少ないテクスチャマッピングを行うことが可能になる。本実施の形態では、原画像取得時の視点からの変化分に基づく画素の変位量を表示画像の描画に利用するため、実際の視点が原画像の取得時のものに近ければ、表示画像の変化を最小限に抑えることができる。すなわち各画素単位での視差値が正確でなくても、表示画像への影響を抑えられる。
視差値に関しては、その有効/無効を考慮したフィルタリングが必要である。例えば、下記のような重みのフィルタカーネルでフィルタリングを行う。
1 2 1
重み: 2 4 2
1 2 1
ここで、
pixelSum = Σ視差値×重み
weightSum = Σ重み
とし、
新しい視差値 = pixelSum / weightSum;
なる計算式でフィルタリングを行う。ただし、Σは有効な画素についての和である。
また、視差値にフィルタリングをかけることにより、画像参照ベクトルの計算の場合分けを減らすことが可能である。この場合、視差値計算の場合分けには、アルファ値ではなく、視差値の存在/非存在フラグを用いる。
上記のフィルタリング時に、9画素のうち1画素でも視差値が存在する場合に、その画素の視差値は有効であるとする。これにより、視差値が存在する領域が全体的に1画素ずつ拡大する。これにより、画像参照ベクトルのフィルタリングにおいて、4画素全てに画像参照ベクトルが存在する場合の計算、即ち通常のバイリニアフィルタリングを行うのみですむようになる。なお表示画像の描画は、原画像の画素のアルファ値により制御されるため、参照画像ベクトルの設定範囲が1画素分広くなっても表示画像への影響はない。また、画像参照ベクトルをポイントサンプリングする場合も、元の視差値にあらかじめフィルタをかけることにより、画像内部のちらつきの発生を抑制できる。
[視差値の近似]
画像参照ベクトルマップを視点移動に対する補正に用いるもう一つのメリットは、画素単位の精度をもたない視差値のデータから画像参照ベクトルマップを生成し、これを用いて原画像の補正が可能な点である。本実施の形態の視点に応じた補正処理では、原画像取得時の視点に近い視点で表示を行う場合、表示される画像が原画像に近くなる特徴がある。このため、視差値が原画像の距離情報を忠実に反映していなくても、多くの場合十分な品質の画像表示が可能である。
そこで、画素単位で視差値を準備し、画像参照ベクトルマップを画素単位で計算するのではなく、複数の画素からなるブロック単位、奥行き値が同程度である領域単位、オブジェクト単位などで視差値の近似値を準備することにより、画像参照ベクトルも、ブロック単位、領域単位、オブジェクト単位などで求めてもよい。このようにしても、画像参照ベクトルにより参照される原画像は画素の精度でサンプリングされるので、表示画像の画質は劣化しない。
視差値の近似値を用いる他のメリットは、原画像における像が類似しており、視点移動による歪みが近い場合、同じ画像参照ベクトルマップを異なる画像に適用することが可能な点である。また、画像参照ベクトルマップを元の画像より低解像度で計算し、フィルタで滑らかにした上で適用したり、動画などの連続したフレームで視点の変化が少ない場合に前のフレームのマップを用いたりする近似も可能である。
[原画像の相互参照]
次に、左右の画像参照ベクトルマップの一方において、他方の原画像を参照する場合の画像参照ベクトルの計算手法を説明する。上述のとおり左右の原画像には、取得時には死角になり像として表れていないが、視点の移動によって見えるようになる部分が存在し得る。原画像操作部254はそのような像を表現すべき画素に対し、他方の原画像を参照する画像参照ベクトルを生成することで、死角であった部分をより正確に描画できるようにする。このような技術を視差画像の相互参照と呼ぶ。
図31は、右目から死角領域にある、左目用原画像の画素を説明するための図である。同図では、3次元オブジェクト344と、それを表す左右の原画像340、342の平面を俯瞰した状態を模式的に示している。右目の各画素の位置をその視差値だけオフセットした位置(例えば矢印A)にある左目の画素が、右目用の原画像342における画素に対応する左目用の画像340における画素である。ここで左目用の原画像340における領域Bの画素は、対応する右目用の原画像342の画素が存在しないことから、原画像取得時の右目の死角領域を表す。したがって左目用の原画像340における領域Bの画素を、当該死角領域の描画に利用できる。
図32は、視点の移動量と、右目用の画像参照ベクトルマップにおいて左目用の原画像を参照する際の画素の移動量との関係を説明するための図である。なお図31の模式図では、右目用の原画像の画素位置と左目用の原画像の画素位置が視差値分だけ離れている図を示したが、実際の数式上は、原画像を仮想空間の視錘台に配置する際の左右の視点の差Ewpを考慮し、図32に示すような座標系で計算することになる。
図32に示すように、右目画素の位置ixRとそれに対応する左目画素の位置ixLは上述のEwosc=Ewp−Dpだけ離れている。ただし、Ewoscは右目画素を基準とした場合と左目画素を基準とした場合で、サブピクセル精度では値が異なることに留意する。Ewpの値は左右で等しいが、視差値は基準とする目により異なるからである。計算にあたっての考え方は図10で示したのと同様であるが、本来の始点であるixRに対応する、左目用の画像における位置ixLが始点となる点が異なる。すなわち左右の対応画素間のEwoscのずれを考慮する必要がある。
図10と同様、視点がx_offだけ移動した場合、右目用の原画像上の位置ixRのX軸方向の補正量dxは上述のとおり、
dx = Zp * x_off / (Scp + Zp)
である。ここで左目用の原画像における対応する位置ixLとixRとはEwoscだけ離れているため、左目用の原画像上の位置ixLを始点とした場合の、右目用の画像における補正後の位置txRは次のように求められる。
txR = ixL + Ewosc + dx
左目の視点の移動についても同様に計算できる。すなわち右目用の原画像上の位置ixRを始点とした場合の、左目用の画像における補正後の位置txLは次のように求められる。
txL = ixR - Ewosc + dx
視点移動によるY軸方向の位置の移動は、相互参照しない場合と同様である。
視点が角度θだけ回転した場合、右目用の原画像上の位置ixRのX軸方向、Y軸方向の補正量dx、dyは上述のとおり、
dx = Ewosc / 2.0 * cos(θ)
dy = Ewosc / 2.0 * sin(θ)
である。左目用の原画像上のX軸方向、Y軸方向の位置ixL、iyLを始点とした場合、中央画像の位置への移動量はEwosc/2であるため、右目用の画像における補正後のX軸方向、Y軸方向の位置txR、tyRは次のように求められる。
txR = ixL + Ewosc/2.0 + dx
tyR = iyL + dy
左目用の画像参照ベクトルマップにおいて右目用の原画像を参照する際も同様の計算となる。これらの計算により、相互参照しない場合と同様に、画像参照ベクトルマップの各画素に対し画像参照ベクトルを設定できる。
なお左右の視差値画像を利用して、左右一方の原画像において死角となり他方の原画像を参照できる画素についてあらかじめ特定しておいてもよい。視差値画像は、オブジェクト344のうち原画像で見えている部分についての視差値を保持している。例えば図31において右目用の原画像342の各画素は、破線矢印の先に示すようなオブジェクト344上の位置を表し、対応する視差値画像の各画素は、矢印Aのように、オブジェクト344上の各位置が示す左目用の原画像340でどの位置に表れるかを、画像平面上の差分で示している。
したがって、右目用の視差値画像が保持する視差の終点のいずれにも該当しない左目用の原画像の領域Bは、右視点からは死角であり左視点からは見えているオブジェクトの部分を表していることになる。この場合、右目の画像参照ベクトルを、左目用の原画像340における領域Bの画素を参照するように設定することが可能である。そこで画像平面に対し、領域Bの存在を示したデータをあらかじめ作成しておくことができる。
これを相互参照フラグと呼ぶ。左目用の原画像340における領域Bを表す相互参照フラグは次のように生成できる。すなわち同じ水平ライン上の画素列において、右目用の原画像342上の位置ixRに対応する、左目用の原画像340上の位置ixLは上述のとおり、
ixL = ixR - Ewosc
である。
ただしEwoscの算出に用いる視差Dpは、右目用の原画像の画素に対して与えられている、右目の視差値画像が保持する値である。ここでixRは画素の中心であり、ixLは画素の中心とは限らない。そこでixLを四捨五入して最近傍の画素中心を求め、それを中心とする画素を特定する。このようにして得られる画素は、図31における視差の終点となる画素であり、それ以外の画素は領域Bのように、右目用の表示画像のために参照できる画素である。
したがってそれらの画素が区別できるように1ビットの情報を与える。このようなデータを左右の原画像平面に対し取得することにより、左右の相互参照フラグを生成できる。例えば視差の終点となる画素に対し「1」のフラグを与えれば、フラグのない画素を参照先として別視点のマップにおける画像参照ベクトルを設定できる。
図33および図34は原画像の例を示す。この例では王冠が表示されている。図33は左目用の原画像であり、図34は右目用の原画像である。左目用の原画像において死角になっている矢印で示す部分は、右目用の原画像においては見えている。
図35は、左目用の表示画像生成処理において右目用の原画像を参照する相互参照フラグを右目画像において示した図である。すなわち図34の右目用の原画像において相互参照フラグ(iCL2R)が1である画素と0である画素を色分けして表示している。相互参照フラグが0の画素、すなわち左目用の原画像において視差の終点とされない右目用の原画像の画素が、王冠表面の凹凸の左側面(画面の右側)に線状に分布している。また、矢印で示す部分では太い帯状にも存在している。これらの画素は、左目用原画像において死角になっている。
図36は、右目用の表示画像生成処理において左目用の原画像を参照する相互参照フラグを左目画像において示した図である。すなわち図33の左目用の原画像において相互参照フラグ(iCR2L)が1である画素と0である画素を色分けして表示している。相互参照フラグが0の画素、すなわち右目用の原画像において視差の終点とされない左目用の原画像の画素が、王冠表面の凹凸の右側面(画面の左側)に線状に分布している。また、矢印で示す部分では太い帯状にも存在している。これらの画素は、右目用原画像において死角になっている。
図35で示した相互参照フラグが1である右目用の原画像の画素は、左目用の原画像の死角領域を補うために、左目用の表示画像の描画に利用できる。図36で示した相互参照フラグが1である左目用の原画像の画素は、右目用の原画像の死角領域を補うために、右目用の表示画像の描画に利用できる。
なお相互参照を行う画像参照ベクトルをマップに設定すべきか否かを判定する基準として、Z値に対する信用度フラグを導入してもよい。図37は、Zバッファに信用度フラグを設定する必要性を説明する図である。原画像において死角となっている箇所のZ値は正確には計算できないため、原画像において見えている箇所のZ値を用いた補間を行う必要がある。例えば図37の3次元オブジェクト344において、符号345で示す部分は右目の死角になっている。当該死角領域に対してはZ値が補間されるため、データ上、符号346のような形状として推定される。この場合、符号345で示されるオブジェクトの真の形状と、符号346で示される推定された形状とを比較すると、後者の方が視点に近い位置にある。
そのため、相互参照によりオブジェクトの真の形状を表す画素が得られても、補間により推定された同じ視点からの原画像の画素の方がZ比較により優先されてしまい、相互参照の効果を発揮できない。これを避けるために、Zバッファに信用度フラグのビットを設ける。例えば原画像の画素に対応する正確なZ値に対しては信用度フラグを設定し(たとえば値1を設定する)、補間されて得たZ値については信用度フラグを設定しない(たとえば初期値0のままにする)。これにより画像参照ベクトルマップにおいて、補間されたZ値をもつ画素を信用度フラグに基づき特定できる。そして当該画素に対して、相互参照により正確なZ値をもつ画素値を参照できる場合、信用度フラグが設定されていないことからZ比較を行わずに、相互参照の画像参照ベクトルを設定する。
信用度フラグの求め方の一例を説明する。有効な3点(ix,iy)、(ix,iy+1)、(ix+1,iy)が視点移動によりそれぞれ(tx0,ty0)、(tx1,ty1)、(tx2,ty2)に変位する場合、変位後の3点のx座標txi(i=0、1、2)の最大値をtx_max、最小値をtx_minとし、変位後の3点のy座標tyi(i=0、1、2)の最大値をty_max、最小値をty_minとする。そして変位後の3点が引き伸ばされた度合いから信用度フラグを以下のように設定する。
(tx_max - tx_min)> 1.5(ピクセル)または
(ty_max - ty_min) > 1.5(ピクセル)の場合、信用度フラグ=0
それ以外の場合、信用度フラグ=1
このように変位後の3点の引き延ばされた度合いが所定の閾値より大きい場合は信用度が低いが、引き延ばされた度合いが所定の閾値未満であれば、信用度が高いと判断し、対応する画素のZ値に信用度フラグを設定する。信用度の基準になる閾値を1.5ピクセルとしたのは一例であり、画質に応じて閾値を変更してもよい。
また、(ix,iy)、(ix,iy+1)の2点のみが有効であり、この2点が視点移動によりそれぞれ(tx0,ty0)、(tx1,ty1)に変位する場合、変位後の2点のx座標txi(i=0、1)の最大値をtx_max、最小値をtx_minとし、変位後の2点のy座標tyi(i=0、1)の最大値をty_max、最小値をty_minとして、変位後の2点が引き伸ばされた度合いから信用度フラグを以下のように設定する。
(tx_max - tx_min) > 1.5(ピクセル)または
(ty_max - ty_min) > 1.5(ピクセル)の場合、信用度フラグ= 0
それ以外の場合、信用度フラグ= 1
元画像の1点のみが有効な場合は、変位後の画素も1点であり引き伸ばされることはないので、信用度フラグ=1として扱う。
図38は、視点を右方向に移動させた場合の、左目用のマップに対する信用度フラグを示す図である。信用度フラグが1である画素と信用度フラグが0である画素を色分けして示す。視点移動により引き伸ばされて描画された画素の信用度フラグが0に設定されていることがわかる。左目用の原画像の死角領域について、右目用の原画像の画素を参照する際、信用度フラグが0の画素については、Z比較を行わずに、相互参照による画像参照ベクトルを当該画素に設定する。
次に相互参照を用いた画像参照ベクトルマップの生成処理を説明する。以下、右目用の画像参照ベクトルマップの生成手順を説明する。
(1)まず、右目用の画像参照ベクトルマップに、右目用の原画像のうち位置座標(ixR,iyR)の画素の視差値から計算した画像参照ベクトルを書き込む。
(2)画像参照ベクトルの書き込みの際、Zバッファ処理を行いながら、信用度フラグも同時に書き込む。このとき信用度フラグの内容に拘らずZ比較を行い、より視点に近いZ値を持つ画像参照ベクトルをマップ上の画素ごとに設定する。
(3)次に、左目用の原画像で位置座標(ixL,iyL)の画素のうち、相互参照フラグが「0」である画素について、右目用の画像に対する相互参照のための画像参照ベクトルを計算し、右目用の画像参照ベクトルマップの対応する画素に書き込む。
(4)このとき、既に書き込まれた画像参照ベクトルの信用度フラグが「1」の場合はZ比較を行うことにより、視点により近い場合にのみ書き込みを実施する。信用度フラグが「0」の場合は、Z比較を行わずに書き込みを行う。
左目用の画像参照ベクトルマップの生成手順も同様である。
相互参照のための画像参照ベクトルをマップに設定するケースをまとめると次のようになる。
(a)設定対象の画素に、画像参照ベクトルが設定されていない場合
(b)設定対象の画素に、マップと同一視点の原画像を参照先とする画像参照ベクトルが設定されているが、その信用度フラグが「0」の場合
(c)設定対象の画素に、マップと同一視点の原画像を参照先とする画像参照ベクトルが設定されており、その信用度フラグが「1」であるが、設定しようとしている画像参照ベクトルに対応するZ値が、すでに設定されている画像参照ベクトルに対応するZ値より視点に近いことを示す場合
(d)設定対象の画素に、すでに相互参照のための画像参照ベクトルが設定されているが、設定しようとしている画像参照ベクトルに対応するZ値が、すでに設定されている画像参照ベクトルに対応するZ値より視点に近いことを示す場合
ただし、すでに設定されている画像参照ベクトルがマップと同一視点の原画像を参照先とするか、相互参照のためのものかを判断するには、設定されている画像参照ベクトルを読み出す必要がある。この無駄なデータ読み出しを避けるために、相互参照のための画像参照ベクトルを設定する際は、同時に信用度フラグを「1」とする。これにより、Z値とその信用度フラグを参照するのみで、画像参照ベクトルの設定の是非を判定できる。
図39は、視点を右方向に移動させた場合の、左目用のマップに設定される相互参照を行う画像参照ベクトルを説明するための図である。左目用の原画像を参照先とする画像参照ベクトルが書き込まれた画素と、相互参照により右目用の原画像を参照先とする画像参照ベクトルが書き込まれた画素を色分けして示す。信用度フラグが0の画素に対して、相互参照による右目用の原画像を参照先とする画像参照ベクトルが設定されていることがわかる。
図40は、視点を下方向に移動させた場合の、左目用のマップに設定される相互参照を行う画像参照ベクトルを説明するための図である。上下方向の視点移動の場合でも、相互参照によって右目用の原画像を参照先とする画像参照ベクトルが多く設定されていることがわかる。
図41は、相互参照を導入した場合の画像参照ベクトルを説明する図である。同図に格子で示す、画像参照ベクトルマップの各画素には、画像参照ベクトルが格納されている。ただし下部に色分けの凡例が示されるように、マップと同一視点の原画像を参照するものと、相互参照するものとが混在している。そのため表示画像を描画する際は、画像参照ベクトルが右目用の原画像と左目用の原画像のどちらを参照するべきかを特定する必要がある。
そこでマップに設定される画像参照ベクトルに、参照先の画像を識別するフラグを設ける。例えば、画像参照ベクトルを32ビットの浮動小数点形式で保持する場合、一方の成分の最下位ビットには、画像参照ベクトルの有効/無効を示すフラグビットを設け、他方の成分の最下位ビットには、参照先の画像を識別するフラグビットを設ける。例えば同一視点の原画像を参照する場合は0を、相互参照の場合は1を設定する。
次に相互参照のための画像参照ベクトルのフィルタ処理を説明する。相互参照のない画像参照ベクトルマップを用いた描画処理では、常に一つの原画像を参照すればよい。したがって、画像参照ベクトルに対して既に述べたように拡張バイリニアフィルタリングを適用し、それにより得られた一つの画像参照ベクトルに基づき原画像の対応する位置座標を取得することにより、バイリニアフィルタ等を用いてカラー値を計算する。
一方、相互参照のための画像参照ベクトルを含む場合は、表示画像の1つの画素のカラー値を求めるのに用いる参照先の画素が、2つの画像に分かれている場合があるため、場合分けが必要となる。図42は、画像参照ベクトルのフィルタ処理の場合分けを説明するための図である。サンプリング点Sと、サンプリング点Sの周辺にある4画素A〜Dが示されている。サンプリング点Sは、図27(a)で説明した表示画像における画素の中心である。
図42の(a)は、周辺画素A〜Dに格納された画像参照ベクトルがいずれも、左目用の原画像を参照するものである場合、図42(b)は周辺画素A〜Dに格納された画像参照ベクトルがいずれも、右目用の原画像を参照するものである場合である。これらの場合は、相互参照がない場合の拡張バイリニアフィルタリングをそのまま適用できる。なお(a)、(b)では周辺画素A〜Dに全て画像参照ベクトルが設定されている場合を例示しているが、画像参照ベクトルが存在しない画素が含まれている場合も同様である。
図42の(c)は、画素Aに格納された画像参照ベクトルは右目用の原画像を参照し、画素B、C、Dに格納された画像参照ベクトルは左目用の原画像を参照する場合である。この場合は参照先の画像ごとに、相互参照がない場合と同様の拡張バイリニアフィルタリングを行い、左右それぞれの原画像から得られたカラー値を最終的にブレンドしてもよい。一方、左右双方の画像を参照するような領域は、もともと原画像の画質が低いと考えられるため、計算速度優先のフィルタリングを行っても十分であると考えられる。
まず比較のために、通常の拡張バイリニアフィルタリングでよい場合、すなわち左右いずれかの一つの原画像を参照すればよい場合の、表示画像のカラー値の決定手順を改めて説明する。図43は、相互参照がない場合の、表示画像のカラー値の決定処理を説明するための図である。図43の(a)においてマップ上のサンプリング点Sの周辺にある4画素A〜Dのうち、画素Aには画像参照ベクトルが存在せず、画素B、C、Dに画像参照ベクトルが存在する場合、3画素B、C、Dの画像参照ベクトルに対して拡張バイリニアフィルタリングを適用し、サンプリング点Sにおける画像参照ベクトル580を求める。
次に(b)に示すように、求めた画像参照ベクトル580を用いて参照先の原画像をサンプリングし、アルファブレンド、アルファテスト等を行うことにより、画像参照ベクトル580の参照先の点Pのカラー値を計算する。このサンプリングには、通常のバイリニアフィルタリングを用いることができる。
図44は、異なる原画像を参照先に含む場合の、表示画像のカラー値の決定処理を説明するための図である。図44の(a)に示すように、マップ上のサンプリング点Sの周辺4画素A〜Dのうち、画素Aには画像参照ベクトルが存在せず、画素B、C、Dに画像参照ベクトルが存在する場合、3画素B、C、Dの画像参照ベクトルを利用して原画像のサンプリング点を求める。ここで、画素Bの画像参照ベクトル582bおよび画素Cの画像参照ベクトル582cは、マップと同一視点の原画像を参照しているが、画素Dの画像参照ベクトル582dは他方の視点の原画像、すなわち相互参照先の原画像を参照しているとする。
(b)は、マップと同一視点の原画像における画素Bの画像参照ベクトル582bの参照先、当該原画像における画素Cの画像参照ベクトル582cの参照先、相互参照先の原画像における画素Dの画像参照ベクトル582dの参照先を示す。このような場合、相互参照を含まない場合のように3画素B、C、Dの画像参照ベクトルに対して拡張バイリニアフィルタリングを適用することは意味がない。そこで3画素B、C、Dのそれぞれについて画像参照ベクトルの参照先の画素をサンプリングし、バイリニア補間などによりカラー値を得る。画像参照ベクトルが存在しない画素Aに対してはカラー値を、アルファを含めてゼロにしておく。そして4画素A〜Dに対しそれぞれ得られたカラー値に、サンプリング点Sと周辺4画素との位置関係にもとづく比率でバイリニアフィルタを施すことで、最終的なカラー値を求める。
図45は、原画像操作部254が、画像参照ベクトルマップに相互参照のための画像参照ベクトルを設定する処理手順を示すフローチャートである。この処理は、図25で示した画像参照ベクトルマップを生成する処理に追加してなされる。まず対象のマップと同一視点の原画像に対応する視差値画像を用いて、相互参照先の原画像の対応する画素の座標を求め、求められた画素の座標にフラグを設定することにより、相互参照フラグ配列を生成する(S60)。ただしこの処理は省略してもよい。
次に相互参照先の原画像に対応する視差値画像および、視点の移動量と回転角から、当該画像における各画素の変位ベクトル(dx,dy)を算出する(S62)。そして変位ベクトル(dx,dy)にもとづいて、マップと同一視点の原画像における変位後の三角形の内部の対象画素T(itx,ity)に対する、相互参照先の原画像における始点Pの座標値(px,py)を求める(S64)。さらに対象画素T(itx,ity)から始点P(px,py)への画像参照ベクトル(px−itx,py−ity)を、相互参照のための画像参照ベクトルとして求める(S66)。
相互参照フラグ配列においてフラグが書き込まれなかった相互参照先の原画像の画素、すなわちマップと同一視点の原画像において死角に位置するすべての画素について、ステップS64およびS66の処理を行い、画像参照ベクトルマップの対応する画素に、相互参照のための画像参照ベクトルを上書きする(S68)。S68の処理は、信用度フラグおよびZ値に基づき、設定済みの画像参照ベクトルを上書きするかどうかを判定したうえで実施する。
図46は、相互参照を適用した場合に表示画像生成部268が原画像をビュースクリーンにマッピングする処理手順を示すフローチャートである。この処理は,図26で示した処理の代わりに実施する。表示画像生成部268はまず、ビュースクリーン上の点(tx,ty)にマッピングされるべきテクスチャ座標(tu,tv)を生成する(S70)。そして、当該テクスチャ座標にもとづき画像参照ベクトルマップ上のサンプリング点を求め、その周辺画素の画像参照ベクトルを取得する。
周辺画素の画像参照ベクトルがいずれも、マップと同一視点の原画像を参照するものである場合(S72のN)、相互参照をしないためステップS74に進む。周辺画素の画像参照ベクトルに、他方の視点の原画像を参照するものがある場合(S72のY)、相互参照が必要なためステップS78に進む。相互参照をしない場合、ステップS72でサンプリングした画像参照ベクトルを用いた拡張されたバイリニア補間により、テクスチャ座標における画像参照ベクトルを求める(S74)。そのようにして求めた画像参照ベクトルをテクスチャ座標(tu,tv)に加算してなる参照先のテクスチャ座標(u,v)にもとづいて、原画像の画素値をフィルタリングすることにより、ビュースクリーン上の各画素にマッピングされるべき原画像のカラー値を生成する(S76)。
相互参照する場合、ステップS72で画像参照ベクトルマップからサンプリングした各周辺画素の画像参照ベクトルを用いて、参照先の原画像の画素値をフィルタリングする(S78)。ここでの参照先には、マップと同一視点の原画像と、他方の視点の原画像がある。前者が参照先であれば、当該同一視点の原画像から画素値をフィルタリングし、後者が参照先であれば、当該他方の視点の原画像から画素値をフィルタリングする。
ステップS78でフィルタリングにより得られたカラー値を、さらにバイリニア補間することにより、最終的なカラー値を求める(S80)。ビュースクリーン上のすべての画素について、ステップS70〜S80の手順により、マッピングされるカラー値を生成することにより、原画像がビュースクリーンにマッピングされてなる表示画像が生成される(S82)。
以下、相互参照により描画された表示画像の例を説明する。図47は、比較のため、相互参照を行わなかった場合の左目画像の表示画像例である。これは、視点を右方向に移動させた場合の描画結果である。矢印で示す部分が左目から見た場合の死角になっており、死角領域を線形補間により描画したことにより、画質が劣化していることがわかる。図48は、相互参照を行った場合の左目画像の表示画面例である。図47と同様、視点を右方向に移動させた場合の描画結果である。矢印で示す死角領域において右目画像の画素を利用して補間することによって、画質の劣化が抑えられていることがわかる。
図49は、比較のため、相互参照を行わなかった場合の左目画像の別の表示画面例である。これは、視点を時計回りに回転させた場合の描画結果である。矢印で示す部分において、引き延ばされた三角形により、画素値が線状に補間されていることがわかる。図50は、相互参照を行った場合の左目画像の表示画面例である。図49と同様、視点を時計回りに回転させた場合の描画結果である。矢印で示す死角領域において右目画像の画素を利用して補間することによって、正しく描画されている。
図51は、図50の相互参照描画画像において、左目画素と右目画素を区別して示す図である。死角領域において、信用度0の左目画素が相互参照された右目画素によって上書きされていることがわかる。
以上述べた本実施の形態によれば、3次元のステレオ画像やステレオ動画像に対して、視点の移動や回転があってもユーザーの不快感を抑制するような画像の補正を高い品質で実現することができる。
ステレオカメラやステレオビデオなどで撮影された自然画像に対しては、本実施の形態は次のようなメリットをもつ。一般に自然画像では、左右の画像のステレオマッチングから正確な視差値(あるいは距離値)を抽出することが難しい。このため、視差値にはある程度の誤差を含むことになる。このため左右のステレオ画像と視差値から、計算で3次元のデータをいったん求め、これに対してパースペクティブの補間を行うことで、右目画像および左目画像を再生成して仮想空間に表示する手法では、3次元データの精度が維持しにくく、表示画像の品質が劣化しやすい。
これに対し本実施の形態によれば、原画像に対し想定されている視点と、実際の視点が一致する場合、原画像の品質での立体視が可能になる。また視点が動いた場合も、それに応じてなされる原画像に対する修正が最小限であるため、正確な視差値が存在しない自然画像であっても、高い品質での表示画像の立体視が可能となる。
実施の形態2
実施の形態1では、表示装置として主に平板型ディスプレイを想定した態様を説明した。本実施の形態では、表示装置としてヘッドマウントディスプレイを想定した場合について説明する。ただし表示装置をいずれかに限定するものではなく、実施の形態1にヘッドマウントディスプレイを導入したり、本実施の形態に平板型ディスプレイを導入したりすることも可能である。また実施の形態1の一部の構成を本実施の形態に適用したり、本実施の形態の一部の構成を実施の形態1に適用したりすることも可能である。以後、実施の形態1と異なる点に着目して説明する。
図52は、ヘッドマウントディスプレイの外観図である。ヘッドマウントディスプレイ100は、本体部110、前頭部接触部120、および側頭部接触部130を含む。ヘッドマウントディスプレイ100は、ユーザの頭部に装着してディスプレイに表示される静止画や動画などを鑑賞し、ヘッドホンから出力される音声や音楽などを聴くための表示装置である。ヘッドマウントディスプレイ100に内蔵または外付けされたモーションセンサにより、ヘッドマウントディスプレイ100を装着したユーザの頭部の回転角や傾きといった姿勢情報を計測することができる。ヘッドマウントディスプレイ100は、図1に示した画像表示システムにおける平板型ディスプレイ12の代わりとして画像生成装置200と接続することにより、左右の表示画像のデータを取得し、ユーザの左目および右目の前にそれぞれ表示する。
図53は、画像表示システムによって実現される表示の形態を説明するための図である。実施の形態1と同様、本実施の形態でも画像を表す平面を、さらに仮想空間に配置した状態を作り出す。すなわち観念的には(a)に示すように、画像を表示させた画像スクリーン50を仮想空間における場52上に配置させ、ユーザ54が、ビュースクリーン56を介してそれを鑑賞できるようにする。ここでビュースクリーン56は、ヘッドマウントディスプレイ100に表示される画像の視野に対応する。
ユーザ54が仮想空間を見ながら移動すると、仮想世界との相対位置の変化に応じて画像スクリーン50の見え方も変化する。例えば図53の(a)に示すように、ユーザ54が画像スクリーン50に対し右方にいる場合、画像生成装置200は矢印で示すような視線に対応する(b)のような画像を生成し、ヘッドマウントディスプレイ100に表示させる。なお仮想空間における場52は仮想空間の座標系を表象しているに過ぎず、形状などを限定する主旨ではない。また必ずしも表示させなくてよい。
図54は、図53の態様を実現するために画像生成装置200が生成する画像を模式的に示している。本実施の形態において画像スクリーン50に表示させる画像は、立体視用の一対の視差画像、すなわち左目用画像60aおよび右目用画像60bで構成される。図53で示すような画像を立体視させるためには、同じオブジェクトが左目用画像60aでは右寄りに、右目用画像60bでは左寄りに表れる。
また画像スクリーン50に対する視点の位置が左右の目で異なるため、それぞれの視点から透視変換を行う必要がある。例えば図53に示すようにユーザが画像スクリーン50に対し右方にいる場合、左目より右目の方が画像スクリーン50に近く、画像スクリーン50の平面に垂直な軸に対する角度が大きくなる。結果として画像スクリーン50の枠の形状および位置は左目用画像60a、右目用画像60bで異なり、それらを同一平面上に重ねて表すと、平面62に示すような位置関係となる。
このような左目用画像60a、右目用画像60bを生成し、ヘッドマウントディスプレイ100の画面を左右に分割してなる領域のうち左目に対する領域に前者を、右目に対する領域に後者を表示させることにより、ユーザには図53の(b)で示される状態で画像スクリーン50に表れるオブジェクトが立体に見えるようになる。なお実際には、ヘッドマウントディスプレイ100の画面とユーザの目の間にはレンズが設けられ、左右の目の視野全体に画像が表れるようにする。そのため左目用画像60a、右目用画像60bにはそれぞれ、レンズを介して見たときに本来の画像が視認されるようなレンズ歪み補正が施される。
本実施の形態で準備する原画像のデータおよび視差値(または距離値)のデータは、実施の形態1で説明したのと同様である。このような原画像を、特にヘッドマウントディスプレイ100のように比較的大きな視点の移動を許容して適正に立体視させるためには、与えられた2次元画像を一旦、3次元の仮想空間に逆射影したうえ、再度ビュースクリーンに射影することが考えられる。例えば左右どちらかの原画像を、画素中心を頂点とする微小三角形に分割し、それぞれの距離Zpに応じて仮想3次元空間に配置する。そして鑑賞者の視点に対応する左右のビュースクリーンに各微小三角形を射影し、内部をテクスチャマッピングにより描画する。
しかしながらこの場合、次に述べるような問題が生じる。すなわち原画像を微小三角形に分割して仮想3次元空間に配置する場合、左右どちらかの原画像を選択せざるを得ない。このため奥行き情報も選択された画像を基準とした情報のみとなる。その結果、図11を参照して説明したように視差値や距離値がサブピクセル精度の情報を有していても、表示画像にそのような高精細な情報を反映させることができない。また一般的に異なる視点から取得された画像間では光の鏡面反射の成分や屈折光の成分が異なることが普通であるが、オブジェクトを単独の点群あるいは微小三角形の集まりで表現すると、これらの情報が欠落してしまい結果的にオブジェクトの質感を損ねることになる。
さらに、分割した微少領域を3次元空間に逆射影する処理、3次元空間における微少領域をビュースクリーンに射影する処理、という2段階の処理により、最終的な表示画像の品質が劣化しやすい。鑑賞者の視点が図5に示すような適切な位置にあり、本来は画像の変換の必要がなくても、そのような処理が介在することにより無駄に画質が劣化することになる。また、例えば大量のメモリを準備し3次元の仮想空間に逆射影した情報を点群あるいは微小三角形の集合として保存しておいたとしても、再度ビュースクリーンに対する各点の透視変換が必要であり、処理の負荷が大きい。
このため原画像を動画としたりユーザの移動が早かったりした場合は特に、看過できないレイテンシを生む。そこで画像参照ベクトルを用いて原画像と表示画像を直接的に関連づけることで、画質の劣化やレイテンシを最小限に抑える。これにより、各点の4x4の透視変換マトリックスを用いた透視変換処理が簡略化され、少ない演算量で画素ごとの変位を計算することが可能になる。また、最終的にビュースクリーンに対する補正画像の透視変換が必要になるが、これは補正画像全体をカバーする一つの三角形に対し実行すればよいため、従来のグラフィックスハードウェアを用いて非常に高い効率で処理することが可能である。
本実施の形態において画像生成装置200が原画像から表示画像を生成するおよその処理手順は図7で示したのと同様でよい。なおS10においては、視点の位置とともに視線の方向を取得する。この際、ヘッドマウントディスプレイ100に内蔵したモーションセンサによりユーザの頭部の姿勢を取得できる。また図示しない撮像装置でユーザを撮影し、ヘッドマウントディスプレイ100の表面に設けた発光マーカーの像などに基づきユーザ頭部の位置や姿勢を取得できる。
あるいはヘッドマウントディスプレイ100側に、ユーザの視野に対応する画像を撮影する図示しない撮像装置を設け、SLAM(Simultaneous Localization and Mapping)などの技術により頭部の位置や姿勢を取得してもよい。このように頭部の位置や姿勢を取得できれば、ユーザの視点の位置および視線の方向はおよそ特定できる。またS12において画像参照ベクトルマップを生成する画像スクリーンは、設定によっては視点の移動に応じて原画像の平面からZ軸方向に平行移動させてもよい。さらにS14において表示画像が描画されるビュースクリーンは、視点の位置および視線の方向に対応するように設定する。
次に、S12で視点の移動に応じて画像スクリーンを平行移動させる場合の効果について説明する。図55は、図5のような仮想空間で画像スクリーンの位置を固定し、ユーザが画像側に移動した際の画像の見え方を模式的に示している。図5で示したようなカメラ70a、70bと画像スクリーン76の配置は、原画像を取得した際の想定上のものであり、画像を鑑賞するユーザには意識されない。
したがってユーザが画像スクリーンに近づいていくと、やがて図55の(a)に示すように、ユーザ302aが画像スクリーン300aより前に出てしまうことが考えられる。この場合透視変換が破綻し、オブジェクト304aを含む原画像はユーザ302aから見えなくなってしまう。また(b)に示すように、ユーザ302bが画像スクリーン300bより前に出なくとも、近づくほど透視変換による原画像の拡大率が大きくなり、表示画像におけるオブジェクトの解像度が低下する。このことは、ユーザの移動範囲が広いヘッドマウントディスプレイ100の場合は特に顕著である。
図56は、視点の位置に応じて画像スクリーンを移動させる手法を説明するための図である。一実施形態では、上述のような不都合を回避するため、図示するようにユーザ306がZ軸の逆方向にΔZだけ移動したら、画像スクリーン308もΔZだけ同じ方向に移動させる。すなわち視点のZ成分の移動量に対し、画像スクリーンを同じ量だけ同方向に平行移動させることにより、ユーザ306と画像スクリーン308との距離を一定に保つ。
同時に、オブジェクト310が仮想空間に固定されて見えるように、原画像の像を構成する画素を移動させる。これにより、画像スクリーン308が移動したことはユーザ306には認識されない。結果として見た目の状況に影響を与えることなく、図55で示したような状況を回避できる。なお上述はZ軸の逆方向への動きであったが、視点がZ軸方向へ移動したときも、画像スクリーンを同方向へ平行移動させてよい。
図57は、視線の方向を加味して原画像をビュースクリーン上に描画する様子を示している。この場合も図56で説明したのと同様、ユーザ312の移動量のZ成分と同じ距離だけ画像スクリーンを同方向に平行移動させる。ただし図示するように、移動後の視線がZ軸に対し角度θを有すると、左目の視点の移動量ΔZlと右目の視点の移動量ΔZrが異なる。
したがって移動後の画像スクリーンは、左目用の画像スクリーン316aと右目用の画像スクリーン316bで異なる位置になる。図示する例ではユーザが左前方を向いていることにより、左目用の画像スクリーン316aがユーザに近い位置にある。そして各画像スクリーン316a、316bに合わせて左右の原画像を変化させ、さらに移動後のユーザ312の視点の位置および視線の方向に対応するように設定したビュースクリーン318に射影する。
なお図56、57で示したような画像スクリーンの移動は、ユーザの視点が大きく移動する場合に必要な処理である。一方、表示の主目的がオブジェクトや動画像の鑑賞であり視点の移動が大きくないと考えられる場合には、画像スクリーンの移動を省略し、原画像と同一位置の画像スクリーンに画像参照ベクトルマップを生成してよい。ただし以下の説明では、より計算量の多い、画像スクリーンを平行移動させる形態を主に例示する。このようにしても、一般的な3次元の透視変換に比べ少ない演算量で各画素の変位量を計算可能である。
本実施の形態の画像生成装置200の内部回路構成および機能ブロックは、実施の形態1において図8および図9を参照して説明したのと同様でよい。ただしビュースクリーン設定部252は、位置・姿勢取得部250により取得された頭部の位置や姿勢に基づいてユーザの視点の位置や視線の方向を決定し、それに応じたビュースクリーンを設定する。これによりビュースクリーン上で描画される表示画像は、例えば図33で示した左目用画像60aおよび右目用画像60bのようになる。
また原画像操作部254は上述のように、視点の位置に応じて画像スクリーンを平行移動させたうえで画像参照ベクトルマップを生成してもよい。この場合、画像参照ベクトルは、移動後のスクリーンにおける各画素が、原画像のどの位置に対応するかを表す情報となる。なお視線がZ軸に対し角度を有する場合は、図11に示したように左右の目で移動後のスクリーンの位置が異なる。ただし以後の説明ではそれらを包括して1つのスクリーンで表すこととする。さらに原画像操作部254は、上述の相互参照のほか、視差値画像が保持する視差値を像の外側に拡張することにより、拡張分の画像参照ベクトルも準備してよい。詳細は後述する。
また本実施の形態では、原画像データ記憶部256に格納する原画像データ258を複数解像度のデータとし、透視変換による縮小率の度合いに応じて描画に用いる解像度を切り替えてもよい。原画像の解像度を切り替えてテクスチャマッピングを行うことにより、画像のちらつきを抑える手法は、ミップマッピングとして知られている。ただし本実施の形態では、画像を分割してなる微小領域の縮小率ではなく、スクリーン上の画素が元の原画像から遷移するまでに経た視点の移動量に基づきLOD(Level of Detail)を計算し適切な解像度を選択する。これにより、透視変換によって原画像の微少領域がどのように変形しても、それとは独立に画素に対する適切な解像度を求めることができる。また出力部270は、表示画像のデータをヘッドマウントディスプレイ100に出力する際、表示画像にレンズ歪み補正を施したうえで出力してもよい。
次に本実施の形態において、原画像操作部254が画像参照ベクトルを計算する手法について説明する。図58は、視点の移動量のうちZ軸方向およびX軸方向の移動量成分と、それに応じた原画像の画素の移動量との関係を説明するための図である。同図では図5で示した状態における視点88a、88bからZ軸方向に−z_off、X軸方向にx_offだけ移動した後の視点を、右目の視点332を代表させて示している。
この移動に対し、上述したように画像スクリーン76を、Z軸方向に−z_offだけ移動させ、その平面上での各画素に対し画像参照ベクトルを生成する。以後、移動後の画像スクリーンを「マップスクリーン」334と呼ぶ。画像参照ベクトルは、視点88bから原画像をみたときと、移動後の視点332からマップスクリーン334を見たときで、仮想空間にあるオブジェクト78が固定されて見えるときの画素の対応関係を表す情報である。例えば視点88bから見て右目用の原画像のX軸方向の位置ixRに見える像を、マップスクリーン334上の位置txRに移動させ、視点332から見れば、オブジェクト78は固定されて見える。
なお基点となる視点88a、88bを結んだ線分の中点を通るZ軸方向の線と画像スクリーン76との交点を、左目用、右目用に関わらず画像の原点Oとする。まず視点88bのZ軸方向の動きを取り出して考える。このとき元の視点88bと画像スクリーン76との関係を維持したまま、両者をz_offだけZ軸の負の方向に平行移動することにより、移動後の視点330とマップスクリーン334が得られる。一方、オブジェクト78は固定されるため、視点のZ軸方向の動きにより、それを見る視線は実質上、X軸方向に移動していることになる。このときの移動量をgxとする。
三角形の相似により
b : gx = Scp : z_off
である。したがって移動量gxは次のように求められる。
gx = b * z_off / Scp
一方、スクリーンをz_offだけ移動させたことによる、画像スクリーン76上の位置ixRに対応するマップスクリーン334上の位置ixR2は次のように求められる。
ixR - ixR2 : z_off = b : Scp
よって
ixR2 = ixR - b * z_off / Scp = ixR - gx
上述のgxに、さらに最終的な視点332へのX軸方向の移動分x_offを考慮すると、マップスクリーン334上の位置ixR2からの移動量dx2は次のように求められる。
dx2 : x_off + gx = Zp - z_off : Scp + Zp - z_off
よって
dx2 = (x_off + gx)*(Zp - z_off) / (Scp + Zp - z_off)
z_offおよびx_offの視点の移動による、画像スクリーン76上の位置ixRに対応するマップスクリーン334上の位置txRを上述のdx2を用いて表すと、次にようになる。
txR = ixR2 + dx2 = ixR - gx + dx2
すなわちtxRとixRとの差は、原画像におけるオブジェクトの像の位置、原画像に与えられているオブジェクトの視差値(または画像スクリーンまでの距離)、および視点の移動量に依存する。
左目の視点の移動についても同様に計算でき、次のようになる。
gx = a * z_off / Scp
ixL2 = ixL +gx
dx2 = (x_off - gx)*(Zp -z_off) / (Scp + Zp - z_off)
txL = ixL2 + dx2 = ixL + gx + dx2
ここでixL、ixL2、txLは、画像スクリーン76上での左目用の原画像における水平方向の位置、画像スクリーンをz_offだけ移動させたときの対応する位置、左の視点がz_off、x_offだけ移動してもオブジェクト78を変化させないためのマップスクリーン334上の位置である。
図59は、視点の移動量のうちZ軸方向およびY軸方向の移動量成分と、それに応じた原画像の画素の移動量との関係を説明するための図である。図58と座標軸の向きが異なり、図の横軸をY軸としている。つまり仮想空間を横から見た状態であるため、両目の視点88は1つに重なっている。計算手法は基本的に図58で説明したのと同様である。すなわち画像スクリーン76における原画像のY軸方向の位置iyに見える像を、オブジェクト78が固定されて見えるように、マップスクリーン334上の位置tyに移動させる。
同図ではty近傍の図を別途、拡大して示している。まず視点88がZ軸方向に−z_offだけ動いたことによる、視線のY軸方向の移動量gyは次のように求められる。
gy = - iy * z_off / Scp
ここで負の符号がつくのは、図示する例ではiyが原点Oより下の負の領域にあるためである。一方、スクリーンをz_offだけ移動させたことによる、画像スクリーン76上の位置iyに対応するマップスクリーン334上の位置iy2は次のように求められる。
iy2 = iy - iy * z_off / Scp = iy + gy
この演算は除算を含むが、Scpは定数のため全体の処理に対して一回だけ割り算を実行しておけばよい。
上述のgyに、さらに最終的な視点332へのY軸方向の移動分y_offを考慮すると、マップスクリーン334上の位置iy2からの移動量dy2は次のようになる。
dy2 = (y_off + gy)*(Zp - z_off) / (Scp + Zp - z_off)
z_offおよびy_offの視点の移動による、画像スクリーン76上の位置iyに対応するマップスクリーン334上の位置tyを上述のdy2を用いて表すと、次にようになる。
ty = iy2 + dy2 = iy + gy +dy2
この計算は、左右どちらの画像でも同じである。なおdy2の演算における(Scp+Zp−z_off)による除算は、一般的な透視変換処理のパースペクティブ除算に相当するものであることを指摘しておく。
このようにして、視点の移動量の各成分(x_off,y_off,z_off)に応じた、画像参照ベクトルマップ上の位置(tx,ty)と原画像上の位置(ix,iy)との対応関係を少ない演算量で導出できる。なお左右の画像におけるX軸方向の位置txRおよびtxLをtx、ixRおよびixLをixと総称している。
ここで、マップスクリーンを原画像の画像スクリーン76から移動させないケースについても例示する。図60は、図58と同様の視点の移動に対し、画像スクリーン76を移動させない場合の画素の移動量を説明するための図である。すなわち視点は、Z軸方向に−z_off、X軸方向にx_offだけ移動する。このとき例えば視点88bから見て右目用の原画像のX軸方向の位置ixRに見える像を、同じ画像スクリーン76上の位置txRに移動させ、視点332から見れば、オブジェクト78は固定されて見える。
視点のZ軸方向の動きによる画素の移動量gxは図58と同様、次のようになる。
gx = b * z_off / Scp
さらに最終的な視点332へのX軸方向の移動分x_offを考慮すると、画像スクリーン76上の位置ixRからの移動量dxは次のように求められる。
dx : x_off + gx = Zp : Scp + Zp - z_off
よって
dx = (x_off + gx)* Zp / (Scp + Zp - z_off)
z_offおよびx_offの視点の移動による、画像スクリーン76上の位置ixRの、移動後の位置txRを上述のdxを用いて表すと、次にようになる。
txR = ixR + dx
左目の視点の移動、Z軸方向およびY軸方向の移動についても、画像スクリーンを移動させる上述の計算手法を変形させることにより容易に計算できる。
画像参照ベクトルを決定するにはさらに、両者の画像の画素区分を考慮する必要がある。図61は、原画像および画像参照ベクトルマップにおける画素の区分と位置の対応関係を模式的に示している。同図に示す格子は、(a)が原画像における画素区分、(b)が画像参照ベクトルマップの画素区分を表す。このうち各画素の中心の位置座標を(0,0)、(1,0)、(2,0)、・・といった整数値で表すとする。(a)に示すように、原画像における(ix,iy)をこのような整数値とした場合、上述で算出される(tx,ty)は多くの場合、小数点以下の値を持つ。すなわち(tx,ty)は画像参照ベクトルマップの画素の中心からはずれることが多い。
そこで(b)に示すように、そのようにして得られた終点の位置(tx,ty)を四捨五入することにより整数値(tx’,ty’)とし、その位置を始点とした逆向きのベクトルを画像参照ベクトルVとする。すなわち(tx’,ty’)を画素中心とする画素に対応づける画像参照ベクトルV(inv_x,inv_y)は次のように表される。
tx' = (int)(tx + 0.5)
ty' = (int)(ty + 0.5)
inv_x = (float)ix - tx
inv_y = (float)iy - ty
このようにすると、画像参照ベクトルVの終点(ix’,iy’)の多くは、原画像の画素の中心から外れることになる。そのようにしても、表示画像描画時にサンプリングされるマップ上の位置に基づく画像参照ベクトルの補間、画像参照ベクトルが示す原画像上の位置に基づくカラー値の補間、といった処理を経ることにより、サブピクセル精度での高画質な画像を表示できる。画像参照ベクトルを参照した描画に係る処理については後に述べる。なお(a)の矢印のように(ix,iy)を始点とし(tx,ty)を終点とするベクトルを「変位ベクトル」と呼ぶ。
次に、本実施の形態において視差画像の相互参照を適用する場合の計算手法について説明する。図62は、視点の移動量のうちZ軸方向およびX軸方向の移動量成分と、右目用の画像参照ベクトルマップにおいて左目用の原画像を参照する際の画素の移動量との関係を説明するための図である。計算にあたっての考え方は図58で示したのと同様であるが、本来の始点であるixRに対応する、左目用の画像における位置ixLが始点となる点が異なる。
すなわち図58と同様、右目の視点の移動に着目すると、z_offおよびx_offの視点の移動による画像スクリーン76上の位置ixRに対応するマップスクリーン334上の位置txRは上述のとおり、
txR = ixR2 + dx2 = ixR - gx + dx2
である。右目用の原画像における位置ixRと、それに対応する左目用の原画像の位置ixLとは次の関係にある。
ixR = ixL + Ewosc
ここでEwoscは、視点88a、88bの間隔Ewpと、原画像における視差Dp=a+bから次にように与えられる。
Ewosc = Ewp - Dp
結果としてtxRは、左目用の原画像上の位置ixLを始点とすると、次のように求められる。
txR = ixL + Ewosc - gx +dx2
なおEwoscの算出に用いる視差Dpは、左目用の原画像の画素に対して与えられている、左目の視差値画像が保持する値である。左目の視点の移動についても同様に計算できる。すなわち画像スクリーン76上の位置ixLに対応するマップスクリーン334上の位置txLは
txL = ixL2 + dx2 = ixL + gx + dx2
であるから、右目用の原画像上の位置ixRを始点とすると、次のようになる。
txL = ixR - Ewosc + gx + dx2
ただしEwoscの算出に用いる視差Dpは、右目用の原画像の画素に対して与えられている、右目の視差値画像が保持する値である。視点移動によるY軸方向の位置の移動は、相互参照しない場合と同様に、下記の通りとなる。
ty = iy2 + dy2 = iy + gy + dy2
以上の計算により、相互参照しない場合と同様に、画像参照ベクトルマップの各画素に対し画像参照ベクトルを設定できる。なお本実施の形態においても、視差値画像に基づき相互参照フラグを実施の形態1と同様に設定してよい。上記は左右の原画像における相互参照の手法であるが、原画像を取得した際の左右のカメラのさらに外側を視点とする原画像を別途取得しておくことにより、元の左右の原画像の相互参照では補えなかった画素をさらに補うこともできる。ここで、外側の視点から取得した原画像を参照先とする手法を拡張参照と呼ぶ。
図63は、拡張参照における画像参照ベクトルの計算手法を説明するための図である。この例では、元の左右の原画像を取得した際に想定された視点88a、88bのうち、右の視点88bのさらに右側に、間隔Ewpをあけてカメラ350を設定し、第3の原画像を取得しておく。そして視点88bにおいて死角となり右目用原画像で表されていなかった部分について、視点の移動により描画する必要が生じたら、当該第3の原画像を参照するように画像参照ベクトルを設定する。計算にあたっての考え方は図62で示した相互参照の場合と同様であるが、左目用原画像におけるixLを始点とする代わりに、第3の原画像上の対応する位置ixREを始点とする。
すなわち図62と同様、右目の視点の移動に着目すると、z_offおよびx_offの視点の移動による画像スクリーン76上の位置ixRに対応するマップスクリーン334上の位置txRは上述のとおり、
txR = ixR2 + dx2 = ixR - gx + dx2
である。右目用の原画像における位置ixRと、それに対応する第3の原画像の位置ixREとは次の関係にある。
ixR = ixRE - Ewosc
ここでEwoscは、視点の間隔Ewpと、第3の原画像に対応して生成されている視差値画像における、位置ixREの画素に対応する視差Dpから次にように与えられる。
Ewosc = Ewp - Dp
結果としてtxRは、第3の原画像上の位置ixREを始点とすると、次のように求められる。
txR = ixRE - Ewosc - gx + dx2
左の視点88aのさらに左側に設置したカメラにより第4の原画像を取得しておき、左目用の表示画像の描画時に参照する場合も同様に計算できる。すなわち画像スクリーン76上の位置ixLに対応するマップスクリーン334上の位置txLは
txL = ixL2 + dx2 = ixL + gx + dx2
であるから、第4の原画像上の位置ixLEを始点とすると、次のようになる。
txL = ixLE + Ewosc + gx + dx2
視点移動によるY軸方向の位置の移動は、相互参照しない場合と同様に、下記の通りとなる。
ty = iy2 + dy2 = iy + gy + dy2
以上の計算により、画像参照ベクトルマップの各画素に対し画像参照ベクトルを設定できる。
これまで述べた計算により画像参照ベクトルを取得したら、当該データを画像参照ベクトルマップに書き込む。この際、画像参照ベクトルを計算する時に得られたZ値を用いてZバッファ処理を行い、より視点に近いZ値を持つ画像参照ベクトルをマップに書き込んで保存するようにする。この処理により、マップの一つの画素に対して一つの画像参照ベクトルがのみが記憶される。
なお、異なる視点画像から得られる点群あるいは微小三角形をビュースクリーンに描画する手法では、光の鏡面反射成分や透過成分の視点による違い等による画素間の輝度の不連続性を隠すためのアルファブレンド描画が行われていたが、これにより画像の解像感が低下したり処理の負荷が大きくなったりする問題が発生する。本実施の形態によれば、後述するように画素間のアルファブレンドを各画像間の境界の画素のみに限定することで、元の画像の解像感を保ったまま高速に処理を行うことが可能になる。
また、これまで述べたように画像参照ベクトルは、まず原画像の各画素を始点として、視点の移動によって定まるマップスクリーン上の対応する位置を終点とする変位ベクトルを求め、その逆ベクトルを画像参照ベクトルマップの画素中心に合わせて微小移動させることによって得られる。そのような手順によれば、原画像では隣接する画素を始点とした変位ベクトルの終点が離間し、間に画像参照ベクトルが設定されない画素(以後「穴」と呼ぶことがある)が生じることが考えられる。これは視点の移動によって原画像の一部が画素レベルで引き延ばされることなどに起因する。そのため原画像操作部254は、そのような穴を検知し適切な画像参照ベクトルを補う。
このような穴が発生するのを防ぐために、画像を微小三角形で表し、三角形ごとにラスタライズ処理を行うことが考えられる。しかしながら微小三角形のラスタライズは現在のグラフィックスハードウェアにおいても処理の負荷が大きく、全体のボトルネックになることが多い。そこで本実施の形態では、微小三角形のラスタライズ処理を省略し、少ない演算量で穴の補間を実現する。
同様の理由によりZバッファについても補間する。ここでZバッファは、画像参照ベクトルマップの生成過程で必要となる。例えば原画像の複数の画素が、画像参照ベクトルマップの同一画素内の位置に対応している場合、Zテストにより視点に近い対応関係を採用することで、当該画素に適切な画像参照ベクトルが設定される。Z値は原画像に対応する視差値画像から、原画像の画素ごとに求められる。なお上述のとおりZ値は、画像参照ベクトルを求める際の変位ベクトルの算出にも利用される。
図64は、図7のS12において原画像操作部254が画像参照ベクトルマップを生成する処理手順を示すフローチャートである。まずZバッファおよび画像参照ベクトルマップのバッファを初期化する(S120)。次に自己画像を参照先とする画像参照ベクトルを設定する(S122)。ここで自己画像とは、右目用のマップについては右目用原画像、左目用のマップについては左目用原画像を指す。次に相互参照および拡張参照により自己画像以外の原画像を参照先とする画像参照ベクトルを設定する(S124)。
S122、S124の処理においてZバッファへの書き込みや、場合に応じたZ値の補間を並列して行う。これらの処理においては、画像参照ベクトルの補間は行わない。次に、画像参照ベクトルの穴を補間する(S126)。同図に示す処理を、左目用、右目用でそれぞれ行うことにより画像参照ベクトルマップが両目に対し完成する。なお視差値画像においてデータが保持されていない画素はオブジェクトが存在しないことになるため、そのような画素を指す画像参照ベクトルも存在しない。結果として画像参照ベクトルマップには、オブジェクトの像の外側などに、画像参照ベクトルマップが存在しない領域があってよい。
図65は、図64のS122において、自己画像を参照先とする画像参照ベクトルを設定する処理手順を示すフローチャートである。まず原画像において1つの基準画素を定める(S132)。そして当該基準画素と、それに隣接する複数の参照画素の中心位置について変位ベクトルを計算する(S134)。隣接する画素について計算された変位ベクトルは、後に当該画素が基準画素となった際に利用するため一時的に記憶しておいてもよい。次に、画像参照ベクトルマップの画素配列で構成されるZバッファのうち、基準画素を始点とする変位ベクトルの終点を含む画素のデータを確認し、Z値および画像参照ベクトルを書き込み可能か確認する(S136)。
当該画素に以前にZ値が書き込まれていなかった場合、あるいは書き込まれていても書き込もうとしているデータの方が視点に近いことがZ値により確認できた場合、書き込み可能と判定する(S136のY)。そして基準画素のZ値をZバッファに書き込むとともに、変位ベクトルから求めた画像参照ベクトルをマップの対応画素に書き込む(S138)。同一画素に以前に書き込みがなされていればそれを上書きする。なおZバッファには、参照先が自己画像であることを示す画像の識別情報も書き込むことにより、相互参照や拡張参照のデータより優先されるようにする。
次にZバッファのうち、基準画素の変位ベクトルの終点を含む画素に隣接する画素が穴となるかどうかを確認し、穴となる場合はZ値を補う(S140のY、S142)。このとき、当該Z値が補われたものであることを示すフラグも同時に書き込む。Z値の補間手法は後に述べる。S136で、以前に書き込まれていたZ値との比較によりデータの書き込みが不可と判定された場合、書き込みや穴の確認は行わない(S136のN)。S140で隣接する画素に穴がなければ当然、Z値の補間は行わない(S140のN)。原画像の全画素が基準画素となるまで(S144のN)、例えばラスタ順に基準画素を設定していき(S132)、S134〜S142の処理を繰り返す。全画素が基準画素となったら処理を終了する(S144のY)。
図66は、図64のS124において、相互参照および拡張参照時の画像参照ベクトルを設定する処理手順を示すフローチャートである。この処理は図65で示した自己画像を参照先とする場合と基本的には同様であるが、変位ベクトルの計算や書き込みが限定的である点と、Z値の補間を行わない点に主な差がある。これは、相互参照および拡張参照が、自己画像で描画できない画素を補填するための補助的な処理であり、高速化のために簡略化しても多くの場合、問題が顕在化しないためである。したがって処理時間に余裕があれば、自己画像の描画と同様にZ値の補間処理を行ってもよい。まず原画像において1つの基準画素を定める(S152)。ここでの原画像は、右目用の画像参照ベクトルマップに対しては左目用の原画像や右目のさらに右の視点から取得した画像である。左目用の画像参照ベクトルマップに対しては右目用の原画像や左目のさらに左の視点から取得した画像である。
続いて、相互参照フラグを生成している場合は、当該基準画素が参照先となり得るか否かをフラグにより確認する(S154)。参照先となり得ない場合は当該基準画素を参照先とするような画像参照ベクトルに係る処理を行わない(S154のN)。参照先となり得る場合は(S154のY)、基準画素と、それに隣接する複数の参照画素の中心位置について変位ベクトルを計算する(S156)。そしてZバッファのうち、基準画素を始点とする変位ベクトルの終点を含む画素のデータを確認し、Z値および画像参照ベクトルを書き込み可能か確認する(S158)。
この場合、先に書き込まれているZ値が自己画像のものであるときは書き込みを不可とする。また書き込まれているZ値が補間により設定されたものである場合は書き込みを可能とする。これにより、自己画像の正当な参照が可能な場合はそれを優先させ、補間によりZ値のみが書き込まれている場合は相互参照、拡張参照を優先させる。書き込みが可能な場合は(S158のY)、基準画素のZ値をZバッファに書き込むとともに、変位ベクトルから求めた画像参照ベクトルをマップの対応画素に書き込む(S160)。
この際、参照される原画像が自己画像でなくどの画像であるかがわかるように、Zバッファおよび画像参照ベクトルマップに画像の識別情報も書き込む。S158で書き込みが不可と判定されたら書き込みは行わない(S158のN)。原画像の全画素が基準画素となるまで(S162のN)、例えばラスタ順に基準画素を設定していき(S152)、S154〜S160の処理を繰り返す。全画素が基準画素となったら処理を終了する(S162のY)。
次にZ値の補間処理について説明する。なおZ値および画像参照ベクトルの補間処理は、穴の大きさが高々1画素であることを前提としている。本実施の形態では、原画像と画像参照ベクトルマップの平面が平行であり、また両者の解像度が同程度であることを想定しているため、上記のような前提をしても差し支えない。Z値の補間においてはまず、図65のS140で示すように補間すべき穴を特定する。定性的には、原画像において隣接する画素が、画像参照ベクトルマップ上で引き延ばされて間隔が広がり、マップの画素を単位としたときに1画素分の隙間が生じた状態を検出する。
図67は、原画像の画素中心とそれに対応する画像参照ベクトルマップ上の位置との関係例を模式的に示している。同図に示す格子は、(a)が原画像における画素区分、(b)が画像参照ベクトルマップの画素区分を表す。(a)に示す網掛けされた4つの画素の中心を始点として変位ベクトルを求めると、例えば実線矢印のようになる。この矢印の先を含む画素に、矢印と逆向きの画像参照ベクトルが設定される。
この例では、破線矢印で対応関係を示したように、(b)に示す網掛けされた4つの画素が変位ベクトルの終点を含むため、補間の必要なく画像参照ベクトルを設定できる。このような状況において、濃い網掛けで示した画素を基準画素360として設定する。さらに基準画素360の右、下、右下の画素を参照画素362a、362b、362cとする。そしてそれらの画素中心を始点とする変位ベクトルが指す、画像参照ベクトルマップ上の位置を特定する。
そのうち基準画素360および右と下に隣接する参照画素362a、362bに対応する3点の位置を含む最小の画素行列の領域364を決定する。この領域364のうち、基準画素360および参照画素362a、362b、362cに対応する位置を含まず、かつ基準画素360に隣接する画素を、Z値を補間すべき穴として決定する。図67の場合、太枠で囲まれた画素が抽出される。なおこのような画素は別の基準画素によって正確な値が書き込まれたり、Zテストにより補間値を書き込めなかったりする可能性もあるため、厳密には補間すべき画素の候補である。
次に図65のS142で示すように、決定した画素にZ値を補う。最も単純には隣接する画素のZ値の平均値などで補間することが考えられるが、平均化することにより本来は背後にある物が見えて表現されてしまうことが起こり得る。オブジェクトの輪郭部分などZ値に急な変化が生じている箇所ではそのような危険性が高くなる。したがってZ値が得られている周囲の画素からのZ値の変化の大きさに応じて、補うZ値を調整する。定性的には、周囲の画素からの差が大きいほど視点からの距離が大きくなるようにZ値を調整する。
図67を例にとると、基準画素360と、その右、下、右下に位置する参照画素362a、362b、362cにおけるZ値が、視差値画像に基づき変位ベクトルの算出時に計算されている。ここで基準画素360のZ値をZsc0、参照画素362a、362b、362cのZ値をそれぞれZsc1、Zsc2、Zsc3とする。
画像参照ベクトルマップのうち、基準画素360に対応する位置を含む画素366には、基準画素360に対し得られたZsc0がZ値として与えられる。当該画素366に隣接し、Z値を補間すべき画素とされた太線枠の画素には、Zsc0を上述のように調整したZ値を与える。調整後のZ値であるZsafeは、例えば次のように計算する。
Zsafe = Zsc0 + | Zsc1 - Zsc0 | + | Zsc2 - Zsc0 | + | Zsc3 - Zsc0 |
あるいは
Zsafe = Zsc0 + max(| Zsc1-Zsc0 |+| Zsc3-Zsc0 |, | Zsc2-Zsc0 |+| Zsc3-Zsc0 |)
なおZ値は視点からの距離に応じて値が増えるように座標軸をとっている。このような計算により、例えば基準画素のZ値(Zsc0)に比べ周辺の画素のZ値が極めて大きい場合にも、穴埋めに用いるZ値を当該周辺の画素におよそ合わせることができ、背後の物が不自然に前に見えたりすることがなくなる。ZバッファへのZ値の書き込みは、実際には上述のZテストを経てなされる。ZsafeをZsc0から大きくなる方向に調整しておくことにより、計算誤差などにより誤った画素を書き込み先としてしまっても、当該画素に本来与えられるZ値を上書きするのを防ぐこともできる。
図64を参照して説明したように、自己画像を参照先とする画像参照ベクトルの設定段階でZバッファの穴を埋めたうえで、相互参照や拡張参照をする画像参照ベクトルを設定する。図68は、Z値の補間対象となった画素と、相互参照または拡張参照を行う画素との関係を説明するための図である。同図は(a)(b)とも、画像参照ベクトルマップの画素配列を表し、(a)は図67の(b)に示した図と対応する。すなわち網掛けされた画素には視差値から計算された本来のZ値が書き込まれ、太線枠の画素には補間されたZ値が書き込まれている。
ただしそれらの画素にはまだ、画像参照ベクトルは設定されていない。この状態から図66の処理を開始すると、補間によりZ値が与えられた画素に対し相互参照あるいは拡張参照をする画像参照ベクトルが設定される可能性がある。図68の(b)における太線枠の画素のうち網掛けされた画素370a、370bは、そのようにしてデータが書き込まれた画素である。以上の処理により、相互参照、拡張参照の場合も含め可能な限り画像参照ベクトルを決定したうえで、残った画素372a、372bについて画像参照ベクトルの補間を行う。
補う画像参照ベクトルは基本的に、周囲の画素の画像参照ベクトルに近い値とする。図69は画像参照ベクトルの補間手法を説明するための図である。同図に示す画素配列において、太線枠で囲まれた画素に画像参照ベクトルの穴があるとする。この場合、最も単純には、周囲の画素に設定されている画像参照ベクトルの平均値により補間することが考えられる。ただし補間に用いる画像参照ベクトルは、視点の移動に基づく変位ベクトルから得られたものとし、補間によって得られたベクトルをさらに補間に用いることは避ける。
例えばターゲットとする太線枠の画素の上下左右の画素(画素D、C、D、A、B)に、矢印で示すように画像参照ベクトルが与えられていれば、それら4つの画像参照ベクトルの平均ベクトルをターゲットの画像参照ベクトルとする。あるいはターゲットの画素に対する位置に応じて重みを変化させて平均化してもよい。例えば周囲の8画素のうち上下左右の画素(画素D、C、D、A、B)に2倍の重みをつけて、A〜Hの8画素の画像参照ベクトルを加重平均する。
あるいは画像参照ベクトルの方向性に応じて補間に用いる画素や重みを決定してもよい。例えば図示する例では、周囲の画素の画像参照ベクトルが全て水平に近くなっている。このことから当該部分が原画像から水平方向に引き延ばされたものであり、穴はそれによって生じたことが推定される。したがってこの場合、ターゲットの周囲の画素のうち、左右の画素A、Bを用いて線形補間したり、それらの画素に、より大きい重みをつけて平均化したりすることにより、状況に応じた精度の高い補間を実現できる。
例えばターゲットの画素の上下左右の4画素の画像参照ベクトルの平均ベクトルを求め、それと画像の水平方向(X軸方向)とのなす角度θが−30°<θ<30°または150°<θ<210°のとき、左右の画素A、Bの画像参照ベクトルを平均してターゲットの画像参照ベクトルとする。角度θが60°<θ<120°または240°<θ<300°のとき、上下の画素D、Cの画像参照ベクトルを平均してターゲットの画像参照ベクトルとする。角度θがそれ以外のときは上下左右の画素の画像参照ベクトルを平均してターゲットの画像参照ベクトルとする。
なお上述のような角度のしきい値や、それによって補間に用いる画素を選択するか重みを変化させるか、といった態様の組み合わせは様々に考えられる。ユーザの頭部は上下運動より水平運動であることが多く、結果として画素の変位も水平方向が多いと考えられる。したがって上述のように角度の判定を行わず、常に左右の画素の画像参照ベクトルを補間に用いるようにして、精度を維持しつつ処理を高速化してもよい。
本実施の形態ではこのように、視点の移動による画像の局所的な伸張が生じても、ベクトルを補間対象とすることにより、方向性に基づいた計算式の選択が可能である。また実際のカラー値に対する操作は、最終的に表示画像を描画する段階に限られるため、この補間処理が表示画像の品質に与える悪影響を抑えられる。例えば画像参照ベクトルを導入せず、直接カラー画像を補間する場合、このような方向性に基づく調整は行えない。
例えば一方向に引き延ばされた結果生じた穴であっても、カラー画像にはその情報がないため、引き延ばされた方向に関わらず同様の補間計算となる。その結果、余計な色が混じり、表示画像の品質にも悪影響を与え得る。画像参照ベクトルは視点の動きによる画素の移動を表しているという特性上、図69に示すように画素単位で大きな変化が生じるものではない。結果として、たとえ方向性に関わらずターゲットの周囲の画素を補間に利用しても大きな誤差にはなりにくく、混色による画質の劣化も防止できる。
なお上述した補間手法は、変位ベクトル計算から導き出されたいわば正当な画像参照ベクトルが周囲の画素に与えられていることを前提としていた。一方、2画素以上が連続して穴となっている場合は、その周囲で補間でない画像参照ベクトルを探索し、当該ベクトルをそのまま補間に用いてもよい。例えば図69において、ターゲットの周囲の8つの画素に探索の優先順位を規則づけておく。一例として画素A、B、C、D、E、F、G、Hといった順序が考えられる。そしてその順で探索し、最初に検出された補間でない画像参照ベクトルをターゲットのベクトルとして採用する。いずれの補間手法にしても、画像参照ベクトルの生成段階ではカラー値が確定してないため、最終的にはサブピクセルの位置精度でカラー値を決定することができる。
次に画像参照ベクトルマップを用いて最終的な表示画像を生成する手法について説明する。図70は、図7のS14において、表示画像生成部268が画像参照ベクトルマップを用いて表示画像を生成する手順を示すフローチャートである。まず表示画像生成部268は、ビュースクリーン設定部252からその時点での視点の位置や視線の方向に応じたビュースクリーンの位置や姿勢を取得し、それに画像参照ベクトルマップをマッピングする(S172)。そのうえで描画すべき対象画素を設定する(S174)。
そして対象画素に対応する画像参照ベクトルマップのサンプリング点を特定し、その位置における画像参照ベクトルを取得する(S176)。基本的にはサンプリング点を含む所定数の画素、例えば2行2列の4画素に対し設定されている画像参照ベクトルに補間フィルタをかけることによって求める。次に原画像をミップマップとしている場合、参照先のミップマップレベルを決定づけるLODを算出する(S178)。このとき、画像参照ベクトルマップをビュースクリーンにマッピングした際に得られるLODに加え、原画像から画像参照ベクトルマップへの変換時になされた拡縮を加味する。
そして、原画像のうちS176で取得した画像参照ベクトルの示す位置のカラー値を取得し対象画素を描画する(S180)。ミップマップの場合はS178で算出したLODに対応するレベルの原画像からカラー値を取得する。表示画像の全画素が描画されるまで(S182のN)、S174〜S180の処理を繰り返す。全画素が描画されたら処理を終了する(S182のY)。同図に示す処理を、左右それぞれ行うことにより、左目用、右目用の表示画像を生成できる。
図71は表示画像、画像参照ベクトルマップ、原画像の関係を説明するための図である。(a)の点線で示した画素配列は表示画像380、網掛けされた画素配列は画像参照ベクトルマップ382の、それぞれ一部であり、位置の対応を示すように重ねて示している。なお画像参照ベクトルマップ382は透視変換により形状が歪んでいることがあり得るが、わかりやすさのために同図では各画素を正方形で表している。(b)の画素配列は原画像386の一部である。
表示画像380において、太線枠で示した画素を描画対象画素とすると、その中心の位置に対応する、画像参照ベクトルマップ382上の画素388内の位置をサンプリング点384とする。当該サンプリング点384における白抜き矢印で示した画像参照ベクトルは、例えばサンプリング点384を含む画素388と、それに隣接しサンプリング点384に近い3画素で構成される、濃い網掛けで示した2行2列の4画素の画像参照ベクトルに基づき決定する。基本的には、これら4つの画素の画像参照ベクトルをバイリニア補間することにより決定できる。
ただし4つの画像参照ベクトルが同じ原画像を参照先としていない場合、4画素のZ値が大きく異なりオブジェクトの段差を跨いでいることが疑われるとき、その他、補間に適さない画像参照ベクトルが混じっている場合は例外として補間は行わない。そのようにしてサンプリング点384の画像参照ベクトルが求められたら、原画像386のうち当該画像参照ベクトルが指す位置をカラー値のサンプリング点390とする。そしてカラー値のサンプリング点390を含む2行2列の4画素を補間することにより、表示画像の描画対象画素のカラー値を決定する。なおこのときの補間は実際には、縮小率に応じた2つのレベルのミップマップを用いて補間するトライリニアフィルタリングにより行う。
図72は、画像参照ベクトルのバイリニア補間について説明するための図である。同図は画像参照ベクトルマップのうちサンプリング点400を含む画素配列を示している。そのうち太線枠で示された4画素が、サンプリング点400における画像参照ベクトルを求めるために用いられる。画像参照ベクトルはマップの画素中心における、参照すべき原画像上の位置を示すベクトルである。ただし元々は図61に示すように、原画像の画素中心を始点として求めた変位ベクトルを、終点の座標(tx,ty)が画像参照ベクトルマップの画素中心(tx’,ty’)になるように平行移動させて方向を逆にしたものである。
したがってその逆の処理により、マップの各画素が保持する画像参照ベクトルから元の変位ベクトルが容易に求められる。すなわち画像参照ベクトルの終点が原画像の画素中心となるように平行移動させ方向を逆にすればよい。そこで本実施の一つの形態では、サンプリング点400の周囲の4画素が保持する画像参照ベクトルから元の変位ベクトル(例えば変位ベクトル404)を求め、その終点の位置(例えば位置406a、406b)とサンプリング点400との位置関係に基づき、バイリニア補間の係数を決定する。なおここで述べた関係が成り立つのは、画像参照ベクトルが元の変位ベクトルから直接求められた場合であり、例えば穴の補間処理により生成された画像参照ベクトルの場合、その補間方法によっては元の変位ベクトルが正しく求められないことに留意する。
つまり変位ベクトル404などが、視点の移動に応じた画素の移動量を上述のように計算した結果として得られている場合、それを逆方向とした逆変位ベクトルを補間に用いる。同図右下には当該逆変位ベクトルをv0、v1、v2、v3として示している。また係数を決定する際は、同図右側に白丸で示した変位ベクトルの終点を近似する長方形408を用いることで計算を単純化する。具体的には4画素のうち横方向に並ぶ画素および縦方向に並ぶ画素同士で、変位ベクトルの終点を結ぶ線分の中点をそれぞれ求める。図ではそれらを黒丸で示している。そして当該中点を通り画像の横方向および縦方向に辺を有する長方形408を定義する。
長方形408の2方向の辺を、サンプリング点400の対応する座標成分が内分する比率を、バイリニア補間の係数とする。図示する例では、横方向の辺がα:1−αに内分され、縦方向の辺がβ:1−βに内分されている。これを用いて、求める画像参照ベクトルVtgtは、4画素のうち左下、左上、右下、右上の画素の逆変位ベクトルをそれぞれv0,v1,v2,v3とすると次のように求められる。
Vtgt = v0 *(1-α)*β + v1*α*β + v2 *(1- α)*(1-β) + v3 *α* (1-β)
なお4画素に設定されている画像参照ベクトルに、相互参照などにより異なる原画像を参照先とするベクトルが混じっている場合は、例外処理として画像参照ベクトルの補間は行わない。その代わりに、それらの画像参照ベクトルが参照先とする原画像からカラー値を取得し、カラー値に対し補間処理を施す。このときも図示した長方形408の内分比率α、β等を用いてサンプリング点400からの距離に応じた補間を行う。原画像をミップマップとする場合はトライリニアフィルタにより縮小率も加味した補間とする。4画素のZ値に差がある場合など、画像参照ベクトルの補間が適切でない他のケースでも同様とする。
上述のとおりオブジェクトが存在しない領域では、画像参照ベクトルも存在しないことになる。このような画素が4画素に混じっている場合も、残りの画素に設定されている画像参照ベクトルを用いて直接カラー値を取得し補間してよい。このとき画像参照ベクトルが存在しない画素についてはカラー値を0として計算する。このように画像参照ベクトルが存在しないことを、画像参照ベクトルの成分が0であることと区別するため、画像参照ベクトルのデータには、存在がないことを示すフラグ格納領域を設ける。
なお図72で示したバイリニア補間は、サンプリング点400の周囲の画像参照ベクトルから一旦、元の変位ベクトル求め、その4個の終点とサンプリング点400との位置関係に基づきサンプリング点400の画像参照ベクトルを求めた。これにより画像参照ベクトルと変位ベクトルの関係を利用した高精度な補間を実現できる。一方、変位ベクトルの終点を求めずに、サンプリング点400と周囲の画素の中心との位置関係に基づく一般的なバイリニア補間を採用してもよい。例えば当該周囲の画素でZ値に大きな差がない場合、あるいは上述したように画像参照ベクトルの穴の補間処理により得られた、元の変位ベクトルを正確に復元できない画像参照ベクトルを補間対象に含む場合には、一般的なバイリニア補間を行うことで、処理時間を短縮したり、復元処理の誤差により生じる精度の低下を防いだりすることができる。
図73は、原画像をミップマップテクスチャとする場合の表示画像との関係を説明するための図である。ヘッドマウントディスプレイ100を利用する場合、ユーザの移動に伴いビュースクリーンが移動するため、画像参照ベクトルマップの画像平面には任意の透視変換がかけられることになる。結果として原画像からの縮小率も場所によって変化する。図示する例では、画像平面(マップスクリーン)422がマッピングされた表示画像420において、領域424aと領域424bで縮小率が大きく異なる。
原画像を一解像度で準備した場合、縮小率が大きい424bでは表示画像にエイリアシングが生じ、視点の移動によって激しいちらつきにつながる。そのため解像度を段階的に変化させたミップマップテクスチャとして原画像のデータを準備する。例えば領縮小率が小さい領域424aにはミップマップレベルの低い原画像データを用い、縮小率の大きい424bにはミップマップレベルの高い原画像データを用いてトライリニアフィルタにより画素値を決定する。
このとき、どのレベルのミップマップを用いるかを決定づけるLODを計算する必要がある。本実施の形態では実質上、画像スクリーンからマップスクリーンへの変換と、マップスクリーンからビュースクリーンへの変換という2段階の変換がなされているため、LODの計算にも双方を考慮する必要がある。すなわちLODを、1段階目での縮小率の大きさを表すLOD1と、2段階目での縮小率の大きさを表すLOD2の和として算出する。
図74は、画像スクリーンからマップスクリーンへの変換時のLOD1を計算する手法を説明するための図である。この変換では視点の3次元空間での移動方向および移動量によって縮小率が変化する。しかしながらX軸、Y軸方向の移動に対しては、縮小率の変化が画像平面での位置によって様々であるため、この変化をミップマップの選択に用いると却って不自然に見えることが考えられる。従って視点のZ軸方向の移動のみを考慮し、それによって生じる、画像の全体的な縮小率をLOD1に反映させる。
まずオブジェクトがある、画像スクリーン76からの距離がZpの位置に仮定した画素440の間隔を1とする。なお同図では説明のため、画素440を表す矩形の大きさを誇張して表している。原画像上での当該画素の像の幅OrgDは、三角形の相似により次のように求められる。
OrgD : Scp = 1 : Scp + Zp
よって
OrgD = Scp / (Scp + Zp)
次に、視点がZ軸方向に−z_offだけ移動した場合、マップスクリーン334上での当該画素の像の幅NewDは、三角形の相似により次のように求められる。
NewD : Scp = 1 : Scp + Zp - z_off
よって
NewD = Scp / (Scp + Zp - z_off)
すなわちこの変換処理によるLOD1は次のように求められる。
LOD1 = ln2 (OrgD / NewD)
= ln2 ((Scp + Zp - z_off)/ (Scp + Zp))
ここでZpは、画像参照ベクトルマップを生成する際に生成されたZバッファから取得する。2段階目の変換に基づくLOD2は、一般的なテクスチャマッピングと同様に求める。すなわちビュースクリーンに画像参照ベクトルマップをマッピングする際に、透視変換により求められる縮小率をLODとして算出する。この計算には、テクスチャマッピングを含むレンダリングを行う一般的なハードウェアの機能を利用できる。
以上により各段階でのLODを取得したら、その和LOD1+LOD2を最終的なLODとして参照先の原画像のミップマップレベルを決定し、トライリニアフィルタ処理により画素のカラー値を取得する。なお画像参照ベクトルマップ自体をミップマップデータとしてもよい。ただし画像参照ベクトルの画素間の差は小さいため、上述のとおりサンプリング点の周囲の4画素のベクトルをバイリニア補間する手法で十分な機能を果たす。
図75は、本実施の形態の手法を用いずに、オブジェクトの像を微小三角形に分割した単位で直接マッピングする場合の、ミップマッピングにおける問題を説明するための図である。この例では、正方形で表した2行2列の4つの画素(例えば画素444)に、それより小さい多数の微小三角形(例えば三角形446)がマッピングされている。一般的な手法によれば、マッピングする段階で微小三角形の単位でLODが計算される一方、ミップマップレベルの選択に反映されるLODは画素単位である。
図示する例では網掛けした三角形群448を境にして段差が生じているようなオブジェクトの表面形状により、当該三角形群448は見かけ上、幅が狭くなっている。このため三角形群448に属する三角形のLODは、他の三角形のLODより高くなる。画素に対するミップマップレベルの選択に用いるLODを、画素の中心にある三角形のLODとした場合、三角形群448が中心にかかっている画素450のみ、他の画素より高いLODが採用され、縮小率の大きいテクスチャが選択されることになる。
このように偶発的なLODのばらつきにより、マッピングするテクスチャの解像度が様々になると、ちらつき抑制などミップマッピングの効果が発揮されないことが考えられる。本実施の形態では、視点に応じてあらかじめ画素の変位を計算しておき、それを表す概念上の画像である画像参照ベクトルマップ全体をマッピングするため、微小三角形ごとのマッピングは必要ない。したがって上述のような偶発的なLODのぶれが発生しない。また、画素中心の画像参照ベクトルは、周辺の画素の画像参照ベクトルを加味して決定されるため、精度の高いテクスチャマッピングが可能となる。
また画像自体をテクスチャマッピングする手法では、微小三角形の内部領域をラスタライズしてテクスチャ座標を取得していく必要がある。図示するように1つの三角形に含まれる画素数が低下すると、ハードウェアの実行効率は大幅に低下する。また、一つの微小三角形を構成する頂点のZ値が大きく異なると、描画する三角形の画素数が増大し、結果的に画像全体のマッピングに長い時間を要することがある。本実施の形態では上述のとおり、画像全体をマッピングするため処理の負荷が格段に小さく、また視点位置の変化に伴う負荷の変動も少ない。結果として、より軽い負荷で高品質な画像描画が可能となる。これは、視点移動の表示画面への反映を常に低レイテンシで行わなければならないVR機器にとってたいへん有効な性質である。
次に、本実施の形態の原画像操作部254が視差データを拡張することにより、オブジェクトの像の周縁を精度よく描画する手法について説明する。図76は視点の移動によって像をサブピクセルレベルで移動させるときの画像の変化を模式的に示している。(a)は原画像の画素配列を示しており、薄い網掛けの画素がオブジェクトの像、それを囲む濃い網掛けの画素がα値が0の、像がない領域を表している。本実施の形態では、サブピクセルの精度でサンプリング点を決定し、カラー値を決定する。しかしオブジェクトの像の外側は、視差値画像にデータが存在しないため、それを指す画像参照ベクトルも存在しない。
仮に当該原画像の画素中心が画像参照ベクトルマップの画素中心と一致していた場合、画像参照ベクトルが実質的に表す画像も(a)のようになる。ここで矢印460に示すようにサブピクセルレベルで画素を移動させる必要が生じた場合、(b)に矢印で示すように、各画素の画像参照ベクトルに逆方向の成分が加算され、原画像上でのサンプリング点462a〜462cが画素中心からずれる。
その結果、原画像における隣接する画素との補間により決定されたカラー値により、画像参照ベクトルが実質的に表す画像は、(b)に示すようにサブピクセルの変位を反映したものとなる。ただし原画像でオブジェクトの像が存在しない領域(例えば領域464)には、上述のとおりそれを指す画像参照ベクトルが存在しないため、サブピクセルの変位を反映させることができない。結果として対応する領域466は元のままとなる。
そこでバッファ上などで視差値画像における像の周縁を1画素程度外側に拡張しておくことで、拡張分を指す画像参照ベクトルが生成されるようにする。図77は視差値画像の拡張前後の画像参照ベクトルマップを模式的に示している。(a)は視差値画像を拡張しないときの画像参照ベクトルマップの画素配列であり、網掛けされた領域は、対応する原画像の画素にオブジェクトの像が表れているため画像参照ベクトルマップが格納されている画素である。白抜きの領域は像の外側に対応するため、画像参照ベクトルマップが存在しない画素である。
(b)は視差値画像を拡張したときの画像参照ベクトルマップの画素配列であり、グレーで表された画素は、拡張された視差のデータを用いて生成された画像参照ベクトルを格納する。このように画像参照ベクトルを生成しても、原画像において示された先の画素のα値が0であれば画像上は変化しないため、像自体が不自然に拡張されることはない。拡張処理には(b)の上に示したカーネル468などを用いて拡張フィルタリングを行う。
図78は、視差値画像を拡張した場合の、サブピクセルレベルでの移動に伴う画像の変化を模式的に示している。(a)は図76の(a)に対応するが、像の周囲の画素は、視差データの拡張により画像参照ベクトルが設定されていることをグレーで示している。このようにすると、(b)で示すように、周囲の画素にもサブピクセルレベルの変位を反映させることができる。その結果、図76の(b)では変化のなかった領域466の画素も、隣接する画素との補間により決定されたカラー値が表れることになる。このような処理により、視点の移動に伴いオブジェクトの輪郭もより滑らかに移動して見えるようになる。
図79は、画像参照ベクトルマップおよびZバッファが画素単位で保持するデータの構造を例示している。(a)の画像参照ベクトルマップのデータは、X値フィールド480a、Y値フィールド480b、画像IDフィールド480c、および存在フラグフィールド480dで構成される。X値フィールド480aおよびY値フィールド480bには、画像参照ベクトルのX成分およびY成分を格納する。画像IDフィールド480cには、参照先が自己画像か、相互参照時の他方の原画像か、拡張参照時の外側の視点からの原画像かを区別するための、画像の識別情報を格納する。
存在フラグフィールド480dには、画像参照ベクトルが存在するか否かを示すフラグを格納する。このフラグにより、画像参照ベクトルが存在しその成分が(0,0)であることと、当該位置にオブジェクトが存在せず画像参照ベクトルとして設定すべきものがないこととを区別する。(b)のZバッファのデータは、Z値フィールド482a、画像IDフィールド482b、被補間フラグフィールド482c、補間可否フラグフィールド482dで構成される。
Zバッファは、画像参照ベクトルマップ生成時にあっては、Zテストなどを経て最新に書き込まれたデータが格納され、表示画像の描画時にあっては、画像参照ベクトルマップが保持しているベクトルに対応する情報が格納される。Z値フィールド482aには、その画素が表すオブジェクトのZ値を格納する。画像IDフィールド482bには、上述同様、画像の識別情報を格納する。相互参照や拡張参照のデータより自己画像参照のデータを優先して格納するために用いられる。
被補間フラグフィールド482cには、Z値フィールド482aに格納されているZ値が、穴埋めにより後から補われたデータであることを示すフラグを格納する。このフラグによって、相互参照や拡張参照を行う画像参照ベクトルを設定できることが示される。補間可否フラグフィールド482dには、表示画像の描画時に、周囲の画像参照ベクトルとバイリニア補間できるか否かを示すフラグを格納する。例えばマップ上で隣接する画素とのZ値が大きい場合、補間を不可とするフラグを格納する。これにより、段差が大きく補間に適さない画像参照ベクトルを混合し、当該段差が不鮮明に表現されるのを防止できる。
次に、画像参照ベクトルマップを利用して視点補正を高精度に行う手法について説明する。この態様を実現する場合、図9で示した原画像操作部254を、出力部270におけるレンズ歪み補正機能の前段に組み入れる。ヘッドマウントディスプレイ100では上述のとおり、視野を拡大するために左右の目の前にレンズを設け、それを介して画面を見るように構成されていることが多い。そのため画面に表示する段階では、レンズによる歪みをキャンセルするように、描画した本来の表示画像に非線形な歪み補正処理が施される。
図80は、レンズ歪み補正処理を含む画像の変遷を模式的に示している。中間フレームバッファ490およびレンズ歪み補正用フレームバッファ492は双方、左目用フレームバッファおよび右目用フレームバッファを含む。まず中間フレームバッファ490には、その時点の視点に応じた表示画像が、表示画像生成部268によって書き込まれる。出力部270は、中間フレームバッファに書き込まれた表示画像のデータをサンプリングし、適切な位置に再配置させてレンズ歪み補正用フレームバッファ492に書き込む。これを順次ディスプレイに出力することで、レンズを介して正常に見える画像を表示できる。
一方、ヘッドマウントディスプレイ100では、ユーザの視点に応じた画像をリアルタイムに表示することが求められる。ところが視点に応じてビュースクリーンを設定するタイミングと、レンズ歪み補正を行うタイミングでは数m秒程度のずれがあるため、その間で視点の位置や方向が動いてしまっていることが考えられる。この場合、そのままレンズ補正を施し出力すると、実際の視点の動きより遅延した画像が表示され、ユーザに違和感を与えることがあり得る。
そのため中間フレームバッファに書き込まれた画像を、一定方向に微小量シフトさせたうえで歪み補正を行うことで、疑似的に視点の動きに追随させることが考えられる。しかしながらこの手法では、視点の移動(XYZ軸方向の移動)を正確に反映できない。上述したように異なるZ値を持つ画素は、視点の移動に伴う変化量が異なるため、画像平面のシフトでは正確に計算することができない。例えばユーザが頭部を回転させる場合も視線の方向が転回するだけでなく、一方の目に対し他方の目は相対的に移動していることになる。
換言すれば画像平面のシフトで再現できる視点の動きは極めて近似的かつ限定的である。そこで画像参照ベクトルマップを利用して、視点の移動を加味して変化させた画像にレンズ歪み補正を行えるようにする。図81は、画像参照ベクトルマップを利用して、一旦描画された画像にその後の視点移動を反映させる手法を説明するための図である。図80で説明したのと同様、中間フレームバッファ490には、ある時刻tでの視点に応じた表示画像が書き込まれる。この表示画像は、視差値あるいはZ値が判明していれば、画像参照ベクトルマップを利用したものでも、そうでなくてもよい。
一方、画像参照ベクトルマップ500として、表示画像を描画した時刻より遅れた時刻t+Δtでの視点に応じたものを生成する。当該視点は、実際の計測結果に基づくものでもよいし、それ以前の視点の動きから予測したものでもよい。そしてレンズ歪み補正用フレームバッファ492には、中間フレームバッファ490に書き込まれた表示画像を原画像として、Δt分の視点の動きを反映させた画像参照ベクトルが示す位置からカラー値をサンプリングしたうえ、歪み補正を施したデータを書き込む。
このようにすることで、一旦、描画された画像を正確にタイムシフトさせた状態で表示でき、視点の動きに追随するリアルタイムな画像表現を実現できる。なお中間フレームバッファ490に書き込むべき表示画像の描画にも画像参照ベクトルマップを利用した場合、画像参照ベクトルマップ500の生成に用いるZ値は、前段のマップを作成する過程で生成したZバッファを利用できる。
以上述べた本実施の形態によれば、左右の視差画像を用いて立体視を実現するシステムにおいて、あらかじめ生成された原画像を、視点の動きや方向に応じて変化させて表示画像とする。このとき視点の移動に応じて、仮想空間でのオブジェクトの位置を固定した状態で各画素の変位量を計算し、正確な補正量を求める。場合によっては、視点のZ軸方向の動きに応じて、原画像の平面を同方向に平行移動させてもよい。このような構成によりユーザが大きく移動しても歪みのない自然な3次元の形状をユーザに提示することができる。
このような視点の移動を反映した透視変換には、原画像そのものを用いずに、原画像における位置との差分を示す画像参照ベクトルマップを用いる。これにより、原画像に対する変換操作は、最終的に表示画像の画素値を決定するときのみとなるため、原画像からの画質の劣化を抑えられる。さらにビュースクリーンへのマッピングに必要な頂点データは画像参照ベクトルマップの4頂点のみのため、レンダリングの負荷を格段に抑えることができる。
またラスタライズを省略して画像参照ベクトルマップ上で補間を行うため、それによっても処理の負荷が小さく、精度を維持しつつ高速に視点変換処理を実現できる。また原画像をミップマップデータとすることで、視点の動きに応じた画面のちらつきを抑えることができる。この際、ミップマップレベルを決定するLODを、視点のZ軸方向の動きによる縮小と、画像参照ベクトルマップの透視変換による縮小によって決定するため、微小三角形単位でマッピングする一般的な処理と比較しLODの精度が高く、ミップマッピングの効果を発揮しやすい。
さらに一方の目の表示画像に、部分的に他方の目の原画像を利用したり、別の視点からの原画像を利用したりすることが容易にできる。これにより原画像作成時に死角になっていた部分を精度よく再現でき、ユーザの動きを制限することなく破綻の少ない立体画像を提示できる。また本来オブジェクトの像ではない周縁部分にも画像参照ベクトルを準備しておくことにより、サブピクセルレベルの画素の変位を、像の輪郭部分にも正確に反映させることができる。
以上、本発明を実施の形態をもとに説明した。上記実施の形態は例示であり、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。