Experiment |
7. 立体視の原理VRシステムを構築する上で基本となる立体視の原理と方法について学習します。
立体視のシステムにおいて対象を正しい大きさと奥行きで知覚するためには、使用するシステムのパラメータに従って、正しい立体視映像の生成を行わなくてはなりません。ここではプロジェクタを用いた立体視映像の生成方法について学びます。
7.1 立体視の原理
人間が立体感を感じる生理的な要因としては、以下の項目があります。
・両眼視差:両眼を使って対象を見ることで起こる、左右の目における網膜像の差異。
・輻輳 :対象物を注視するときに起こる両眼の視線が注視点となす角度。
・運動視差:観察者と対象物の相対的な運動によって生じる網膜像の変化。
・焦点調節:水晶体の調節による対象物に対するピント合わせ。
現状のVRのディスプレイ装置では、映像の投影面が固定されているため、一般に焦点調節の制御は行えず、両眼視差、輻輳、運動視差の効果によって立体視映像の生成を行います。
まず両眼視差の効果を用いるには、左右の視点に応じた映像をそれぞれ生成します。これらの映像を人間の両眼に対して正しい位置に提示することで、輻輳の効果を利用することができます。また3次元位置計測センサを用い、利用者の頭部位置の動きに応じた映像を生成することで運動視差の効果を利用することができます。
図7.1:立体視の原理
7.2 プロジェクタによる立体視システム
両眼視差の効果を利用するためには、左右の視点位置から見た映像を分離して提示することが必要です。プロジェクタを用いて両眼視差の映像を提示する方法としては、時分割立体視による方法と偏光立体視による方法があります。
時分割立体視では1台のプロジェクタから左右の視点映像を「右-左-右-左」の順に時間分割で投影し、利用者は映像の切換えと同期した液晶シャッタメガネを使用して見ます。一方、偏光立体視では左右の視点映像を2台のプロジェクタから偏光フィルタを通して同時に投影し、利用者は偏光メガネを使用してこれを見ます。これらの方法により、利用者は右目用の映像を右目で、左目用の映像を左目でそれぞれ分離して見ることが可能になり、両眼視差情報を用いた立体視を実現することができます。
下図は両方式の原理を図示したものです。時分割立体視では主に1台のCRT方式のプロジェクタが使われ、偏光立体視では2台のDLPプロジェクタを用いたシステムが使われます。本実験で使用するCS Galleryではスタック式の2台ずつのDLPプロジェクタを用いた偏光方式による立体視を行っています。
図7.2:プロジェクタによる立体視システムの原理また、偏光方式による立体視は更に、直線偏光と円偏光の区別があります。
直線偏光は、特定の方向だけに振動する光で直線偏光フィルタを通すことで得られます。直線偏光フィルタを90度変えて使用することで縦方向の偏光と横方向の偏光を分けて使用することができます。直線偏光の場合は、プロジェクタに取り付けた偏光フィルタと偏光メガネのフィルタの向きがを合っていなくてはならないため、首を傾けて見ると偏光はくずれてしまいます。
円偏光は、振動の方向が位相とともに回転する光で、これは1/4波長ずれた直線偏光を合わせることで得られます。円偏光では振動の方向の変化によって、右回りの偏光と左回りの偏光に分けて使用します。この円偏光の場合は、プロジェクタのフィルタと偏光メガネのフィルタの回転の方向が合っていれば、首を傾けても偏光の回転方向は変わらないため、直線偏光のように偏光がくずれることがなく映像を分離して見ることができます。
図7.3:直線偏光と円偏光
一般に、正面、側面のスクリーン映像だけを使う場合は、映像に対して首がまっすぐに向くため直線偏光方式を使用すますが、床面や天井のスクリーン映像を使う場合は映像に対して利用者の首の方向がいろいろと変化するため、円偏光方式を使用します。本実験で使用するCS Galleryは床面スクリーンを使用するため円偏光方式を使用しています。
7.3 視体積の設定方法立体視映像の提示において、対象物に関する正確な大きさと奥行きを知覚するためには、提示映像が正しい輻輳角、正しい大きさで再現されることが必要です。例えば、透視投影変換で設定した視野角が、使用するディスプレイ装置と一致していない場合、正しい大きさや距離感は得られず、知覚される世界は歪んだ空間になってしまいます。そのため、立体視映像の生成においては使用するディスプレイ装置の特徴を考慮して、正しい視体積の設定を行わなくてはなりません。
一般に立体視映像の生成方法において、HMDを使用する場合とIPTを使用する場合では、視体積の設定方法が異なります。HMDでは映像を投影するスクリーン面は常に利用者の顔の前に直面して置かれるため、左右対称の視体積を用いる対称透視変換が用いられます。OpenGLの関数では、gluPerspective() がこれにあたります。
これに対し、プロジェクタを用いるIPTでは、映像を投影するスクリーンが空間に固定されているため、利用者の頭部の動きに応じて視点とスクリーンの位置関係が変化します。そのため、左右非対称な視体積を用いる必要があり、非対称透視変換を行うことになります。OpenGLの関数では、glFrustum() がこれにあたります。下の図は、HMDとIPTを用いた場合の視体積の違いを示したものです。
図7.4:HMDとIPTの視体積の違い
glFrustum()を用いる場合、実際のスクリーンの位置と大きさに従って視体積が決まります。視点とスクリーンの位置関係、スクリーンの大きさが与えられると、glFrustum() の各パラメータの値は下図のように計算することができます。また、glFrustum() を使用する場合、gluLookAt() で指定する視線方向はスクリーンに対して直角の方向になります。
図7.5:glFrustumのパラメータ設定
※演習:
ここでは、sample1のプログラムで使用されていたgluPerspective() を glFrustum() に変更し、非対称透視変換を使用したプログラムに書き換えてみましょう。この際、スクリーン位置、視点位置等の値は映像が適切な大きさで表示されるように設定して下さい。