Fu-Ken's Room

POV-Ray でイロイロやってみよう!

第八回 地形を作ってみよう(前編)

景観CGといえば Terragen がフリーで操作も簡単、仕上がりも美しいのですが、地形しか作成できません。
開発中の次期バージョンでは樹木を作成することもできるようになるらしいのですが、現在は Terragen だけではどうしようもありません。
それならば、Terragen で作成した地形を POV-Ray に持っていってレンダリングしてみようじゃないかと考えてみたわけです。

1. Terragen で地形作成

まずは Terragen で地形を作成します。
「Generate Terrain...」で地形を作成した後、今回は「Modify Terrain...」で標高の最低を「0」、最高を「50」に調整します。
(from [ 0 ] to [ 50 ] とした後、「Bound Vertical」をクリックします)
これはあとでPOV-Rayにデータを持っていくときにスケールを合わせやすくするためなので、自分の作成した地形に合わせて調整しましょう。
なお、数値の単位は特に単位を書いていない場合は「Terrain units」です。
水面を追加し(WaterLevel [ 2 ])、Surface Map はサンプルを微調整したものを使います。
太陽の位置、カメラなどをセットして、それらの数値は自分でメモしておきます。

Landscape

RenderingControl

上のようなイメージの地形を作成しました。
ちなみにこれを Terragen でレンダリングするとこうなります。

テストレンダリング

2. POV-Ray へ持っていくために

まず、地形データを POV-Ray のハイトフィールドで使用できる形にします。
地形データを「semiL1.ter」という名前で保存します。
この地形データをmirさんの作成したツールでBMPに変換します。

コンバータ

24bit BMP として保存すると、「semiL1#.bmp」というグレースケールのファイルが作成されます。
BMPでは使い難いので、自分の使っているツールでPNGに変換します。(私は IrfanView を使っています)
できた地形データ用の画像ファイル「semiL1.png」はこちら。

地形データ

Terragen で作成した Surface Map を POV-Ray の方でテクスチャとして使用するために、Terragen で真上からレンダリングした画像を作成します。
この真上からレンダリングする方法については、H.Satoh さんの作成された「TerVrml」というツールに添付されている解説を参考にしています。

Camera Position x:128 y:128 z:4100
Target Position x:128 y:128 z:0
Camera Orientation head:0 pitch:-90 bank:0
Image Size Width:512 Height:512
Zoom 32
大気の設定はDensityを0にする

あと、私は太陽の位置も真上からにしています。(Sun Altitude [ 90 ])
水面については POV-Ray で作成するので、水面の高さを 0以下にしてレンダリングされないように設定します。
この設定で、960x960 のサイズでレンダリングしてテクスチャ用の画像を得ます。(これもPNGに変換します。)

地表マップ
ファイル名 : semiC1.png

これで Terragen で準備するものは終わりです。

3. ハイトフィールド

まずは POV-Ray のソースです。

#version 3.5;

camera {
location < 135, 2.49, 59 >
look_at < 137, 11.612, 130 >
angle 70
}

sky_sphere {
pigment {
gradient y
color_map {
[ 0.0 rgb < 0.7, 0.8, 1.0 > ]
[ 0.7 rgb < 0.1, 0.2, 0.8 > ]
}
}
}

light_source {
< 0, 0, 0 >
color rgb < 1, 1, 1 >
translate < 100000, 0, 0 >
rotate y*90 rotate x*30
}

#declare Terra = object {
height_field {
png "semiL1.png"
smooth
texture {
pigment {
image_map { png "semiC1.png" map_type 0 interpolate 2 once }
rotate x*90
}
finish { ambient 0.60 }
}
}
scale < 257, 50, 257>
}

object { Terra }

plane { y,2
texture {
pigment { color rgb <0.1,0.2,0.8> }
finish { reflection 0.5 }
}
}

順番に説明していきましょう。
まずカメラの設定です。
Terragen で設定したカメラのポジションを入力します。
angle は Terragen のカメラ設定では 1.414 となっているので、70度としています。
この換算は、H.Satoh さんの作成された「ViewAngle」というツールで視野角を換算しています。

背景は sky_sphere で縦にグラデーションをかけています。

太陽については、原点に置いたライトをX軸方向に 100000 移動し、Y軸回りで90度、X軸回りで30度回転しています。
X軸方向を東とすると、Y軸回り90度で真南に、X軸回り30度で地表からの角度を30度としたわけです。

次は地形データの定義です。
height_field { 〜 } の中に地形の元となる画像データを指定します。
X-Z方向に1x1の大きさの面で、Y軸方向に凹凸ができます。(X:0-1,Y:0-1,Z:0-1 の範囲)
その凹凸は最低位置が[ 0 ]、最高位置が[ 1 ]となります。
smooth というキーワードを追加すると、地表の曲面が滑らかになります。
texture の中で地表の画像を貼っていますが、テクスチャはX-Y平面に対して1x1の大きさ(X:0-1,Y:0-1 の範囲)で貼られてしまいますので、X軸回りに90度回転させています。
こうして出来た地形は1x1x1の大きさなので、Terragen での大きさの比率に拡大します。
Terrain Units で 257x257 の大きさ(X:0-255,Z:0-255)で、高さは0-50の範囲としましたから、scale < 257, 52, 257> とすることで大きさが一致することになります。

水面の高さは Water Level [ 2 ] としましたので、Y=2 の無限平面を作ります。
とりあえずテクスチャの鏡面反射を高めにして水面っぽくしていますが、仕上げの時にはもっと試行錯誤して水面っぽくしましょう。

これをレンダリングするとこのようになります。

Terragen の画像も並べてみましょう。

POV-Ray のシーンファイルと必要な画像ファイルを圧縮したものはこちらです。
ダウンロードして参考にしてみてください。

◆サンプル(632kb)

4. スケール

ところでこの地形の大きさは Terrain Units に合わせられています。
もしこれをメートルサイズにする場合、カメラや地形を30倍することになります。
具体的には以下の部分です。

camera {
location < 135, 2.49, 59 >
look_at < 137, 11.612, 130 >
angle 70
scale 30
}

object { Terra scale 30 }

plane { y,2*30
texture {
pigment { color rgb <0.1,0.2,0.8> }
finish { reflection 0.5 }
}
}

です。

5. 次は

とりあえず Terragen の地形を POV-Ray に持っていくことができました。
あとは POV-Ray で空や水面を仕上げ、地表の質感を仕上げていく作業になります。
その次は樹木を植えたり自作オブジェクトを配置することで作品として完成です。
次回はその辺りのポイントを解説してみようと思います。

◆ NEXT ◆

◆ PREVIOUS ◆

◆ BACK TO SEMINAR ◆