球面ディスプレイの歪み補正について

凸面鏡を用いた拡散投影系における球面ディスプレイでは,その光学的な歪み補正は不可欠なものです.ここでは,その歪み補正をソフトウエア的におこなうための手順について述べます.

手順

  1. 光線追跡
  2. 逆計算
  3. 補正テーブルの微調整
  4. 補正の実行




ここに掲載しているのは筑波大学岩田研究室にいたときのメモです.詳しくは"凸面鏡を用いた球面没入型ディスプレイ:EnspheredVision",日本バーチャルリアリティ学会論文誌Vol.4,No.3,pp.479-486にもあります.



光線追跡

まず計算機による光線追跡によって,プロジェクタのどの画素が,スクリーンのどの位置に結像するかを算出します.凸面鏡によってプロジェクタの映像が拡散すると,通常の投影とはフォーカス面が異なるほか,映像に歪みが生じます.これを計算するための特殊なプログラムとして,筆者は図1に示すような,バーチャルプロジェクタと呼ばれるプログラムを開発しました.この図は2台のプロジェクタ(右上)を用い球面ディスプレイに投影した場合のものを示しています.本来の結像位置は,左下の黄色とピンクの光点で,中央部の黄色の部分は平面鏡,緑色の光点は凸面鏡をあらわしており,水色の光点はスクリーン上の結像点です.


図1:バーチャルプロジェクタ


バーチャルプロジェクタによれば,プロジェクタの画素が球面のどの位置に相当するかを把握することが可能です.この表示プログラムでは,計算,表示の都合上,プロジェクタ画素を32pixelおきに間引きしていますが,実際はSXGA相当の画素で計算します.



逆計算

上記の計算では,プロジェクタ画素(W,H)→球面上の極座標(スクリーンの半径,r1,r2)という対応関係が得られます.この対応関係を(球面)補正テーブルと呼んでいます.ソフトウエア的な歪み補正をするためには,この補正テーブルが不可欠です.その具体的方法は後述します.

この状態の補正テーブルは,基準がプロジェクタ画素(W,H)となっており,極座標であるr1やr2(r1,r2:経度や緯度をあらわす角度)が不揃いのため,扱いに不便なことがあります.この理由は後述する補正テーブルの微調整のためです.プロジェクタ画素→球面上極座標ではなく,極座標→プロジェクタ画素という逆の対応関係を導出しておき,緯線や経線がプロジェクタ画面上のどの位置にくるかを把握しておきます(図2).


図2:逆計算


この逆計算には,やや力技ではありますが,バーチャルプロジェクタによって全画素に対して光線追跡をおこない,所定の極座標(r1,r2)に対するスクリーン上の投影点の最近傍点を求めることによっておこないます.つまり例えば赤道上の点がプロジェクタ画素上のどこに相当するかをしらべるため,あらかじめ全点光線追跡しておいて,もっとも近い点を探すといったことをします.

この力任せ方式では近傍を探すという近似をおこなっているため,誤差が生じる要因ともなります.しかし,全画素に対しておこなっているため,スクリーン上での誤差は1ピクセル以内となり,映像の見えに対する影響は無視できます.


こうした計算によって得られた結果を示します.

37 12
0.000000 -60.000000 640.000000 409.000000
0.000000 -50.000000 640.000000 376.000000
0.000000 -40.000000 640.000000 342.000000
0.000000 -30.000000 640.000000 309.000000
0.000000 -20.000000 640.000000 277.000000
0.000000 -10.000000 640.000000 245.000000
0.000000 0.000000 640.000000 213.000000
0.000000 10.000000 640.000000 182.000000
0.000000 20.000000 640.000000 151.000000
0.000000 30.000000 640.000000 121.000000
0.000000 40.000000 640.000000 91.000000
0.000000 50.000000 640.000000 61.000000
10.000000 -60.000000 656.000000 411.000000
10.000000 -50.000000 661.000000 378.000000
10.000000 -40.000000 666.000000 345.000000
10.000000 -30.000000 671.000000 312.000000
10.000000 -20.000000 676.000000 280.000000
10.000000 -10.000000 681.000000 248.000000
...


最初の2つのパラメータは経度方向の分割点数,緯度方向分割点数です.続いて表示されるパラメータは経度方向,緯度方向,プロジェクタ画素W,プロジェクタ画素Hとなります.経度分割点数は37点で,0度より360度の10度おき,緯度分割点数は12点で,-60度(南緯60度)より50度(北緯50度)の10度おきになります.このファイルの第3,第4パラメータをグラフ化したものを図3に示します.円の外周が北緯50度,内周が南緯60度の点の集合となります.


図3:逆計算によって得られた補正テーブル




補正テーブルの微調整

このようにして得られた補正テーブルはあくまで理論値です.実際に投影系を製作すると,プロジェクタや鏡の設置状態によって思わぬ誤差が生じ,微小にずれて投影される可能性があります.例えば図3のような映像は理論的にはスクリーン上の経線,緯線上にちょうど表示されるはずですが,誤差のためどうしてもずれてしまいます.こうしたずれは予測不可能のため,実際の装置にて微調整をする必要が生じます.

この微調整には,スクリーン上の経線,緯線にしるしをつけておき,図3の点の集合をプロジェクタで投影しながら,微小移動させて合わせる操作をおこないます.


上記のプログラムを用いた微調整の様子は図4の通りです.これは立体視用の2系統の映像を補正している様子で,赤と青地の点が左右眼に対応しています.

図4:微調整の様子


手動によって微調整をして得られた補正テーブルは,その分割数に限度があります.先ほどの補正テーブルの例では37x12で合計444点も微調整が必要です.大変な労力を要しますが,場合によってはさらに詳細な補正テーブルを必要とすることもあります.このような労力を避けるため,補正テーブルに補間をおこない,より細かい補正テーブルを作成するツールもあります.ただし,このツールでは1次の線形補間をおこなっているため,スクリーン上で正しく補間されている保証はありません.このツールはあくまで詳細な補正テーブルに需要(後述する視体積分割のため)があったため作成したものです.

(なお,現在カメラによる自動補正テーブル作成環境を構築中で,補正テーブル微調整における労力の問題は解決しつつあります)




補正の実行

補正テーブルの微調整終了後,あとは補正プログラムを実行すればよいだけです.ソフトウエア的に歪み補正をおこなうには,現時点ではテクスチャによる映像のマッピングが最も単純かつ描画速度のはやい方法だといえます.この基本原理はここに書いてありますが,要点をしぼって説明します.

テクスチャマッピングによる歪み補正をおこなう手順は,

  1. テクスチャの元画像となる画像描画
  2. テクスチャ取りこみ(S,T点)
  3. テクスチャ貼りつけ(W,H点)

1の画像描画には,球面ディスプレイの画角に応じたビューポート(視体積)の算出が必要となります.また2のテクスチャ取りこみ点(S,T点)は補正テーブルより算出しなければなりません.3のW,H点は補正テーブルに含まれています.ビューポートの算出,取りこみ点の計算についてそれぞれ見ていきます.


ビューポートの算出

全方向映像を描画するには,全方向分にビューポートを3つ以上並べる必要があります.ここでいうビューポートとは映像の視野を示す四角錐で,底面の長方形のサイズをあらわす4つのパラメータ(view_left, view_right, view_top, view_bottom)と四角錐の高さパラメータ(view_near),映像の遠方側クリップ面の位置をあらわすパラメータ(view_far)があります.ここで関係するのは前5つのパラメータです.ビューポートの算出は以下の通りです.

ビューポートの大きさが決まれば,そのビューポートで球面上の緯線経線がどの位置に見えるかを計算します.この緯線経線の位置がテクスチャ取りこみ点となります.




補正テーブルを読みこみ,上記の要領にしたがって球面補正プログラムを作成することができます.下記にそのサンプルプログラムを示します.ただしこのプログラムはNvidia社のGeForceシリーズでしか動作を確認しておりません.またコンパイルにはNvidiaのOpenGL SDKが必要です.


使用環境

ここで紹介したプログラムはMicrosoft Windows98 Second Edition, Windows NT4.0, Windows 2000での動作を確認しています.動作にはglutのランタイムライブラリが必要です.コンパイルにはMicrosoft Visual C++ 6.0を使用しています.ただし統合環境向けではなく,makefileしかありません.

また補正実行のプログラムコンパイルにはnVidia社のOpenGL SDKが別途必要です.