アドプロ 2012.07.27

質感の表現

物体毎に反射率やテクスチャを設定し,これらのバランスを緻密に調整すれば, レンダリング結果の現実感をいくらでも高めることが可能である.

しかし,この仕上げの調整作業は試行錯誤的になりがちなので, それをより効率的に実行するための方法を考えよう.


レイトレーシングの概要

POV-Ray のレンダリングでは, レイトレーシング(ray tracing;光線追跡) という計算手法が利用されており, 三次元空間内での光の経路・強度についての物理的な計算結果にもとづいて, 現実感のある画像を生成している.

光の経路:

  1. 照明光源から出発.
  2. 物体表面で反射(or 屈折・透過).
  3. 反射光は,さらに,別の物体で反射し,また,別の物体でも反射し,...

  4. カメラに到達.

現実の物体では,材質によって視覚的に独特な質感が得られるが, これは光の反射の仕方や程度のちがいによるものである. レイトレーシング法では, 次のように単純化された複数の理想的な光モデルの組み合せによって, 物体の多様な質感を擬似的に表現する:

なお,環境光は, 直接照明光が当たっていない陰や影の部分にも一定の明るさをもたらす. 環境光の強度がゼロの場合,陰影部は完全な暗闇であり, 不自然な画像となってしまう. (ただし,宇宙空間の画像のような特別な場合には, 環境光はゼロでもよい.)


反射率の調整による質感表現

POV-Ray では,それぞれの物体のさまざまな反射のパラメータを フィニッシュ(finish;仕上げ)として指定する:

object {
	...

	finish {
		ambient 環境反射率
		diffuse 拡散反射率
		reflection 鏡面反射率
		specular  ハイライト反射率
		roughness ハイライトサイズ
		...
	}
	...
}

詳しくは, マニュアル の「フィニッシュ」の項目を参照.

フィニッシュの他に,インテリアを指定すれば, 透明な物体による屈折・透過も表現できる.

反射率などのパラメータは,典型的には,0.0〜1.0 の数値であるが, 「どの程度の値を使えば,どのような画像になるのか?」は, 実際にレンダリングしてみなければわからない. しかし,数値変更とレンダリングを 手動で何度も繰り返すのは非効率である. このような場合には,テスト用のシーンファイルを作成し, 異なる数値をもつ多数の物体を一度にレンダリングしてしまおう. そして,その中から適切な数値を選べば良い.

大抵の場合,ひとつのファイルの書き直しで何度も試行錯誤するより, 別ファイルを一度だけ作る方が楽. ファイル内容の大部分はコピーで済むのだし. 「急がば回れ.

フィニッシュのテストの例: (finish.pov

// 物体の定義
#declare Pawn = object {
	...
}
...

// 物体を整列配置
#declare M = 5;		// z 方向(奥行き方向)の個数
#declare N = 5;		// x 方向(左右方向)の個数

#declare I = 0;
#while ( I <= M )		// 縦方向の整列用ループ
	#declare J = 0;
	#while ( J <= N )	// 横方向の整列用ループ
		#declare A = J/N/2;     // 環境反射率を 0.0〜0.5 で変化
		#declare R = I/M/2;     // 鏡面反射率を 0.0〜0.5 で変化
		#declare D = 1.0-A-R;   // 拡散反射率を 0.5〜1.0 で変化
	// とりあえず R+A+D = 1.0 となるように設定したが,そうでなくても良い.
	// 物体は R+A+D > 1.0 なら明るく,< 1.0 なら暗くなる.

		object { Pawn
			pigment { color LightGray }
			finish {
				ambient A
				diffuse D
				reflection R
			}
			translate <I-M/2, 0, J-N/2>
		}
	#declare J = J + 1;
	#end
#declare I = I + 1;
#end

この例では,環境反射率・拡散反射率・鏡面反射率のさまざまな組み合わせによる 見え方のちがいを調べている. 右方のものほど鏡面反射率が大きく,周囲の映り込みが強くなっている. また,後方のものほど環境反射率が大きく,陰影が薄くなっている.

標準的な反射率の数値を finish { Glossy } のように, お手軽に指定することもできる. ここ参照.

テクスチャマッピングによる質感表現

単色の代わりに,テクスチャ(texture;肌理(きめ))を指定すれば, 物体に模様をつけることもできる:


#include "テクスチャ定義ファイル名"
...

object {
	...
	pigment { color 色名 }	// 削除(色の代わりにテクスチャを使う)

	texture { テクスチャ名 }
	...
}

POV-Ray では,さまざまな材質(石,木,ガラス,等)のテクスチャが用意されている. (新規に作ることもできる.) 主なテクスチャ定義ファイル:

詳しくは, マニュアル の「定義済みテクスチャ」等の項目を参照.

なお,マニュアルには誤植がある. 木を使う場合のインクルードファイルは, Woods.inc ではなく woods.inc.

「どのテクスチャを使うのがベストなのか?」これも迷い所であるが, 試行錯誤にだけ頼るのではなく,配列を利用して効率的に解決しよう.

テクスチャのテストの例: (texmap.pov

#include "stones.inc"   // 石のテクスチャの取り込み
...

// 石のテクスチャの配列
#declare Tex = array[30] {
	T_Grnt0, T_Grnt1, T_Grnt2, T_Grnt3, T_Grnt4,
	T_Grnt5, T_Grnt6, T_Grnt7, T_Grnt8, T_Grnt9,
	T_Grnt10, T_Grnt11, T_Grnt12, T_Grnt13, T_Grnt14,
	T_Grnt15, T_Grnt16, T_Grnt17, T_Grnt18, T_Grnt19,
	T_Grnt20, T_Grnt21, T_Grnt22, T_Grnt23, T_Grnt24,
	T_Grnt25, T_Grnt26, T_Grnt27, T_Grnt28, T_Grnt29
}
...

// 物体を整列配置
#declare I = 0;
#while ( I < 30 )
	#declare X = mod(I, 6);
	#declare Z = int(I/6);

	object { Pawn
		texture { Tex[I] }
		finish { reflection 0.0 ambient 0.4 diffuse 0.6 }
		translate <X-2.5, 0, Z-2>
	}
#declare I = I + 1;
#end
...

前列左から Tex[0]Tex[1],...がマップされている.

なお,例の通り,テクスチャとフィニッシュを同時に指定できる. 同じテクスチャであってもフィニッシュを変えれば,質感も変わる. (例えば,「ワックスがけされた木」と「朽ち果てた木」みたいに.)

木目などのパターンテクスチャを使う場合, 物体とテクスチャの寸法のバランスにも気を配ろう. 例えば,木目パターンの大きさによっては, 木造住宅のつもりがミニチュアハウスに見えたりするので...

テクスチャに対しても,オブジェクトと同様に, スケーリングなどの変換を適用できる. texture { ... scale ... } とか.


練習問題

さまざまなテクスチャとフィニッシュの組み合わせを試して, 質感の変化を観察してみよう. また,プラスチック,金属,石,木,等の材質に相応しい フィニッシュの数値を探し出してみよう.

人間の視覚は形状よりも色彩に敏感なので, モデリングが手抜きでも,カラーリングで誤魔化せちゃったりする. だが,それは素人相手の場合だけだ.

自由制作では,モデリングに力を入れよう.

また,自由制作に備えて,これまでに学んだテクニックについて,復習しておこう.

作品としての完成度を高めるためには, マニュアル を参照し,「カメラ」,「光源」,「大気効果」,等についても試しておくとよい.

ただし,これらについては,調整作業の効率化は難しい. 例えば,当たり前だが,カメラは1台ずつしか設置できない. つまり,試行錯誤するしかないかもしれないが, できるだけ,事前の脳内シミュレーションを欠かさず, 作業の手数を削減しよう.


(c) 2012, yanagawa@kushiro-ct.ac.jp