EPnetFaN 2002年第11回座学編

Last modified: Mon Jul 22 23:34:52 JST 2002

POV-Ray 入門 #3

[前へ| 次へ]

リアルな地形にボールを浮かべよう

いきなり実践っぽいことをやります。#2 までで説明したことでは当然出来ません^^; とにかくソースを見てください。

sample2.pov

 1: /******************************************************************************
 2:                                 INCLUDE FILE SECTION
 3: ******************************************************************************/
 4: //
 5: // Pov-Ray common include file
 6: //
 7: #include "colors.inc"
 8: #include "shapes.inc"
 9: #include "textures.inc"
10: #include "glass.inc"
11: //
12: // My include file
13: //
14: #include "include/terrain.inc"
15: #include "include/traj_pnt501000.obj"
16:
17: /******************************************************************************
18:                        CAMERA AND LIGHT SOURCE SECTION
19: ******************************************************************************/
20: // Locations of camera
21: camera {
22:     location <-0.6,1.6,-2.0>
23:     look_at <0,0,0>
24:     angle 60
25: }
26:
27: // Light sources
28: light_source{ <-10, 15, -10> color White }
29: light_source{ <-10, 15, -5>  color Yellow*0.5 }
30: light_source{ <-5,0,-5>      color White*0.2 }
31:
32:
33: /******************************************************************************
34:                                 BACKGROUND SECTION
35: ******************************************************************************/
36: //background {color DarkSlateGray}
37: background {color White}
38:
39:
40: /******************************************************************************
41:                                      MAIN
42: ******************************************************************************/
43:
44: // Map Boundary
45: #include "include/domain.inc"
46:
47: // Terrain
48: #include "include/drawter.inc"
49:
50: // Flying ball
51: object{ T501001 }
52: object{ T501051 }
53: object{ T501101 }
54: object{ T501151 }
55: object{ T501201 }
      

解説

1〜16行目 インクルードファイルの指定をしています。「INCLUDE FILE SECTION」 での "My include file"より上の行は POV-Ray 提供のものです。
17〜32行目 カメラの位置と光源を定義しています。光源は複数個おくことが できます。色のあとの *0.5 や *0.2 は光の明るさを倍率で指定します。 カメラの項において angle とあるのは視野の範囲を角度で指定します。 簡単に言えば広角で撮るか望遠でとるかを指定するということです。
37行目 #2 での例は背景が真っ暗でしたが色を指定することもできます。
40〜55行目 物体の定義等をしています。この例のように途中に #include がきても構いません。

include/terrain.inc

球はなんとなく出来そうだと思うのですが、地形はどうやったらできるのでしょうか? POV-Ray にはやはりオブジェクトで「ハイトフィールド」というものが ありますのでこれを利用します。以下のソースをご覧下さい。

 1:#declare TERRAIN = object{
 2:    height_field{
 3:	tga "terrain.tga"
 4:	water_level 0.01
 5:	smooth
 6:    }
 7:     texture{
 8: 	pigment{
 9: 	    gradient y
10: 	    color_map{
11: 		[0.000 color rgbt <0.00 0.00 0.80 0.0>]
12: 		[0.001 color rgbt <0.11 1.00 0.11 0.0>]
13:		[0.067 color rgbt <0.64 0.99 0.64 0.0>]
14:		[0.167 color rgbt <0.96 0.89 0.54 0.0>]
15:		[0.333 color rgbt <0.87 0.68 0.24 0.0>]
16:		[0.667 color rgbt <0.53 0.40 0.09 0.0>]
17:		[1.000 color rgbt <0.60 0.55 0.66 0.0>]
18: 	    }
19: 	}
20:     }
21:
22:     translate <-0.5,0,-0.5>
23:     scale <2,0.4,2>
24: }
      

ハイトフィールドでは TGA 形式のファイルを読み込みます。ここでは terrain.tga というファイルを読み込んでいます。この画像は下のような 図です。この図の黒いところは低いところに対応し白いところは高いところに 対応するものとして POV-Ray は計算をしてくれます。それを利用して 地形に対応して白黒を変化させた画像を TGA 形式で保存すれば任意の 地形が簡単に作れます。

North America

texture の部分に pigment という部分があると思います。 texture はどのような物質かということを定義する場所なのですが、 その中で pigment は色担当だと思ってください。pigment の領域で カラーマップを指定しています。そして translate で移動、scale で 大きさを調整しています。

このようにちょっと複雑になってきたら新たな名前で定義することが #define を使うと出来ます。上の例では地形表示の命令群を TERRAIN という名前で定義しています。

include/drawter.inc

このファイルで実際に地形を書かせます。すでに地形はオブジェクト TERRAIN として定義されている(はずな)ので object{ TERRAIN } とすることにより 表示します。その他の指定は今は忘れてください。

 1: /* terrain.inc を読んでいる必要があります。 */
 2:
 3: difference{
 4:     difference{
 5: 	object { TERRAIN scale <1,0.5,1> }
 6: 	object { 
 7: 	    Plane_YZ
 8: 	    pigment{
 9: 		color Brown
10: 	    }
11: 	    inverse
12: 	    translate 0.9999*x
13: 	}
14: 	object {
15: 	    Plane_YZ
16: 	    pigment{
17: 		color Brown
18: 	    }
19: 	    translate -0.9999*x
20: 	}
21: 	object {
22: 	    Plane_XY
23: 	    pigment{
24: 		color Brown
25: 	    }
26: 	    translate -0.9999*z
27: 	}
28: 	object{
29: 	    Plane_XY
30: 	    pigment{
31: 		color Brown
32: 	    }
33: 	    translate 0.9999*z
34: 	    inverse
35: 	}
36:     }
37:     object{ Plane_XZ translate -0.0001*y}
38: }
      

include/domain.inc (ここでは省略)

このファイルでは外枠と海を描かせています。

include/traj_pnt501000.obj(抜粋)

浮かべるための球が定義されています。

 1: #declare T501001 = object{
 2:     Sphere
 3:     texture{ pigment{ color Yellow } }
 4:     translate <0.0924369747899159/0.02,0.352806666666667/0.02,-0.0458715596330275/0.02>
 5:     scale 0.02
 6: }
 7: #declare T501002 = object{
 8:     Sphere
 9:     texture{ pigment{ color Yellow } }
10:     translate <0.0936134453781512/0.02,0.355606666666667/0.02,-0.049908256880734/0.02>
11:     scale 0.02
12: }
(以下省略)
      

ここはいままでの説明以上のことはしていません。ただひたすら定義して います。そしてこのたくさん定義した球の中から5つ選んだのが sample2.pov での51〜55行目です。

実行結果

sample2

sample2.pov を実行させた結果が上の図となります。これだけのことで 発表に使えそうな図を作ることができます。

[前へ| 次へ]

kato@ep.sci.hokudai.ac.jp