地形を作る〜ハイトフィールド


下のようなグレースケールの画像を読み込むことによって,地形のようなオブジェクトを作ることができます。それには「height_field { } 」を使います。

上の画像はPhotoshopで作ったPNG画像です。「gray_map.png」とファイル名をつけて,POV-Rayフォルダ内のincludeフォルダに保存し,この画像を読み込んでいくつか指定を追加した後でレンダリングすると,次のような画像ができあがります。利用したい画像はincludeフォルダに保存します。

シーンファイルは次のようになっています。

#include "colors.inc"

camera {
	location <0, 5, -3>
	look_at <0, 0, 0.1>
	angle 50
	right     x*image_width/image_height
}

light_source {
 	<100, 100, -100>
	color rgb 1.2
	shadowless
}

object {
	height_field {
		png
		"gray_map.png"
	}
	texture {
		pigment { color White }
	}
	scale <4, 1, 3>
	translate <-2, 0, -1.5>
}

上のソースの赤字の部分がハイトフィールドを指定している部分です。height_field { } 内の1行目は,読み込む画像のファイルタイプ(png),2行目ではファイル名を指定しています。画像ファイルのタイプとしては,PNGのほか,TGAなどいくつかのフォーマットのものが読み込み可能です。

元の画像の白いところが高く,黒いところが低くなります。


ハイトフィールドを使う場合,オブジェクトの拡大・縮小や移動をして,形を調整することが多いです。分かりやすくするために,下のような画像を使って,座標と一緒にレンダリングしてみます。ぼけた円の中心部分は白(rgb <1, 1, 1>),画像のふちのほうは黒(rgb <0, 0, 0>)になっています。

レンダリング結果は次のような画像になります。

元画像は4:3の比率になっていますが,レンダリング結果はx-zの平面に1×1の範囲に収められてしまっていることが分かります。また高さ方向(Y軸方向)をみると,白(rgb <1, 1, 1>)が1,黒(rgb <0, 0, 0>)が0のところになっています。このように,拡大・縮小の指定をしない場合は,1辺が1の立方体の中におさまるように地形が出来上がります。元の画像と同じ比率にしたいときは,scaleを使って比率を変更してやります。


また,「water_level」というオプションをつけると,指定した高さ以下の部分を切り取ることができます。例えば,次のように書きます。

object {
	height_field {
		png
		"gray_map02.png"
		water_level 0.001
	}
	texture {
		pigment { color White }
	}
}

water_levelのあとに0〜1の数値を入れてやると,その数値以下の部分が切り取られます。上のソースでは0.001と入力していますので,元の画像の黒の部分(高さが0)は切り取られています。


戻る