キューブマップからドームマスターへの変換法

Prev - Index - Next

Pov-Rayを使って連番画像を変換する場合

3Dソフトなどで、カメラ設定が魚眼レンズをサポートしていれば、当然直接ドームマスターを作ることができます。 当然、その3Dソフトでキューブマップを3D空間内の仮想の立方体の各面に直接描画することができれば、それを魚眼レンズで撮影することでドームマスターに変換をすることができることになります。 ここでは、フリーソフトである Pov-Ray を使ってキューブマップ素材をドームマスターに変換する方法を記述します。

■ 魚眼レンズを原点に設定する。

座標軸のとりかたとして、個人的にz方向は上の方が直感的に理解しやすいので、そのような座標系にしています。z軸を奥行き方向とするやり方のほうが一般的かもしれません。

camera {
    fisheye               //魚眼レンズ
    location <0, 0, 0>    //原点に設置
    look_at <0, 1, 0>     //y軸方向を向く(y軸を方向を前方とする)
    sky <0, 0, 1>         //z軸方向を上とする
    angle 180             //視野角180度
    right x               //アスペクト比1:1(出力画像が正方形の場合)
}

■ レンズの周りにキューブ状に板を置く

イメージとしては、以下の図のように板を置いて画像を貼り付けて、中心のカメラから魚眼で写せばドームマスターになります。



なので、ここでは<-1, -1, -1>から<+1, +1, +1>までの大きさ2のキューブを6枚のポリゴンから作ってみます。カメラは+y方向を向いているものとして、正面のポリゴンを置いてみます。

//CTR
polygon {
    //正面にポリゴンを置く。4角形だけど一周してスタート地点に戻るので5頂点
    5 <-1, 1, -1> <-1, 1, +1> <+1, 1, +1> <+1, 1, -1> <-1, 1, -1>
    //テクスチャ設定
    texture{
        //色の設定
        pigment {
	    //画像読み込み
            image_map {
                png "TownTestCameraCTR0001.png"
                map_type 0
            }
            //デフォルトの向きは x-y 平面状の <0, 0>から<1,1>なので
	    //回転や反転させて欲しい向きとサイズにする
            rotate <0, 180, 0>
            rotate <90, 0, 0>
            scale 2.
	    translate <-1, 0, -1>
        }
	//3DCGソフトなので出来上がりが光源に影響される。
	//光源の設定に関係ない環境光に反応するようにする。
        finish { ambient 1 }        
    }
}

画像テクスチャーの向きを正しい向きにするのが大変ですが(こっちの軸を中心に90度回して、それから…)、残りの5枚のポリゴンも同様に作ります。ちょっと長いのでソースはこちら⇒

これで、縦横比を1にしてレンダリングを実行すれば、魚眼投影の画が作れます。少しうれしいことには、カメラの向きを変えれば、簡単に向きを変えたドームマスターを作ることもできます。



[TIPS]貼り付けるテクスチャがpngだったりすると、イメージ自体にガンマ値設定があって明るさが変わってしまう可能性があります。そういうpngイメージだと、

global_settings { assumed_gamma 1.8 }

などの設定をしないといけないかもしれません。(ちなみにディスプレイ表示用のガンマ値設定はwindowsは1.8でmacは2.2とかで、そのへんが関係しているらしい。)

■ 連番画像の変換

このままだと一枚画の変換なので、連番画像を変換しないといけません。
0から59までの連番を変換しようとすれば、ini ファイルは例えば以下のような形になります

Width=512                      //幅512ピクセル
Height=512                     //高さ512ピクセル

Output_File_Type=N             //出力はP'N'G形式
Output_File_Name="povout.png"  //出力ファイル名

Antialias=1                    //アンチエイリアス入れる

Initial_Frame=0                //最初のフレーム
Final_Frame=59                 //最後のフレーム

// ただし毎回レンダリングする度に全フレームを実行されると困るので、
// 本当に実行するフレームの範囲を指定する
Subset_Start_Frame=0           //最初のフレーム
Subset_End_Frame=0             //最後のフレーム

これを設定ファイルとして使うと、連続して処理が行われ、povout00.png, povout01.png, ..., povout59.png と連番画像が作られます。

しかし、このままでは同じ画像を使った同じ画が60枚作られるだけなので、ソースのほうも変更をします。このような連続処理の間は、clockという名前の内部変数が0から1まで変化していくので、それを使って読み込むファイル名を変えます
読み込む連番ファイルが例えば、

TOWN_CTR_L/Town_CTR_L_00000.png
...
TOWN_CTR_L/Town_CTR_L_00059.png

のような命名規則だったとすると、まず

// 0 から 59 まで変化する連番の文字列を作る
// 2番目の因数 -5 は 00059 のように5桁の文字列の意味
// 最後の因数は小数点以下の桁数で、今回は必要ないので 0 
#declare Number = str(clock*59, -5, 0)

のように頭で数字部分の設定をしてやります。
デフォルト設定では、clockは0から59/60まで変化するのではなく0から1まで変化するので、60倍ではなくて59倍しているところに注意してください。
こうして作った文字列 Number を使ってテクスチャ名を与えてやります。

image_map {
    png concat("TOWN_CTR_L/Town_CTR_L_", Number, ".png")
    map_type 0
}

concat (....) は、文字列を繋げる命令です。
このようにすれば、毎フレームごとに違ったイメージを読んで来るので、連番画像を順々に処理してやることになります。

最後に Pov-Rayで処理した連番画像を繋げて作ったドームマスター映像を置いておきます。

povout.mpg (382KB)


Prev - Index - Next
inserted by FC2 system