ここでは『おまじない』的な使い方ができるような例をあげています。
多くは太字や斜体になっている部分を追加すれば簡単に使えると思います。
camera { ...(略) right < 画像の幅 / 画像の高さ, 0.0, 0.0 > up < 0.0, 1.0, 0.0 > }
camera の括弧内のどこかに right と up を追加し、 right のベクトルのx成分に出力したい画像の縦横比を設定します。なお、デフォルトは1.33、つまり縦横比 4:3 になっています。
縦横比は幅を高さで割り算した値を使えば良いのですが、計算式を直接書いてもOKです。
それからこれを書いた後に POV-Ray の画像の保存設定を目的のサイズに変更するのを忘れずに。
// 不透明色 color rgb < 赤成分, 緑成分, 青成分 > // 透明色 color rgbt < 赤成分, 緑成分, 青成分, filter成分 > // 透過色 color rgbf < 赤成分, 緑成分, 青成分, transmit成分 > // 透過透明色 color rgbft < 赤成分, 緑成分, 青成分, filter成分, transmit成分 >
はじめに断っておきますが、ここでの透明色、透過色という言い方は勝手にそう呼んでいるだけです。『t』と『f』が別の意味をもっていると言うことをはっきりしたかったのでこう呼ぶことにしました。ちなみに他所ではどちらも『透過』だったりするようです。
これは正確にはカラーベクトルと呼ばれる指定方法です。全ての数値は0.0から1.0の実数を使います。 rgb の部分については説明は不要でしょう。
『t』と『f』については透過率の指定で、0.0では光を全く通さず、1.0で完全に光が素通りするようになります。
そして『t』と『f』の違いですが、『t』は単純にその物体が薄く描画され、1.0にすれば完全に見えなくなります。また、これを指定した物体の影は不透明のものと同じ色で、薄くなるだけです。
一方『f』は、ガラスやセロファンのようにその色を通して背後にあるものが描かれます。従って1.0にしても物体が見えなくなる訳ではありません。そして『f』を指定した物体の影には前半の rgb で指定した色がつきます。
なお、両方を指定する『rgbft』の形で物体や通過する光につく色の濃さを調整するの一般的だと思います。
//単色の場合 pigment{ 色定義 } //パターン関数の場合 pigment{ パターンの関数名 color_map{ [ 数値1 色定義1 ] [ 数値2 色定義2 ] ...... // 数値の値が0.0〜1.0までの間にいくつでも [ 数値N 色定義N ] } scale < x成分, y成分, z成分 > //必要な場合 translate < x成分, y成分, z成分 > //必要な場合 rotate < x成分, y成分, z成分 > //必要な場合 } //一部のパターン関数の場合 pigment{ checker または brick または hexagon 色定義1, 色定義2( hexagonのみ ,色定義3 ) scale < x成分, y成分, z成分 > //必要な場合 translate < x成分, y成分, z成分 > //必要な場合 rotate < x成分, y成分, z成分 > //必要な場合 }
色定義の方法は上の色の定義の項を見て下さい。
単色の場合は六角大王Superからイメージテクスチャを使わずに出力するとこうなります。
ここでの本命はその後のパターン関数の場合です。
パターン関数とは、どこかの座標
そして、パターン関数で得られた値からどの色を選ぶかという定義がcolor_mapの中身です。
[ 数値 色定義 ]の形で書かれていて、数値の値は上記の0.0〜1.0に対応しており、それぞれの間は滑らかなグラデーションになっています。
なお、数値は最初が小さくて、後に行くほど大きくなるように指定する必要があります。
ちなみに、最初が[ 0.3 色指定A ]で最後が[ 0.7 色指定B ]などという指定をした場合は、0.3以下がAの色になり、0.7以上はBの色となります。
また、途中でグラデーションにならないようにパキッと色を変えたいという場合には同じ数値を指定して次の色を指定すればOKです。
sky_sphere{ pigment{ ..... } .....(以下 pigment を好きなだけ) }
sky_sphereは原点中心の直径1の球に pigment を適用した後に無限大の大きさに拡大したものと思って下さい。
background の次の行あたりがわかりやすくて良いと思いますが、シーンファイルのどこかに sky_sphereのブロックを書きます。
sky_sphereの中には pigment を好きなだけ書くことができます。参考:pigment
pigment を複数書いた場合は先に書いたものが内側になります。
ただし、内側の pigment に透明な部分が無いと意味が無いので注意。
//どこか適当な場所。background や sky_sphere の後あたりが個人的にはお勧め。 plane{ < 法線x成分, 法線y成分, 法線z成分 > , 原点からの距離 //実際にはベクトルは x, y, z というそれぞれの軸の成分を表す識別子を使うと良いでしょう。 texture{ //pigment や finish, normal はご自由に } }
無限平面の指定です。法線で指定したベクトルに垂直で原点からの距離だけ法線の方向にずらした平面をつくります。
こう書くとなにやら難しい感じですが、実際にはベクトルに y、距離に0.0を指定する場合が一番多いと思います。
//具体例:単色の平面 plane{ y, 0.0 texture{ pigment{ color rgb <0.9, 0.9, 0.8 > } finish{ diffuse 0.9 ambient 0.3 } }//textureの終わり }//planeの終わり
...(略、texture の中) finish{ ...(略) specular 数値 roughness 数値 // または phong 数値 phong_size 数値 //両方に使えるオプション metallic 数値 ...(略) }
六角大王Superでは光沢の値を上げるとオブジェクトの表面に白い光の反射、いわゆる「ハイライト」ができます。
しかしPOV-Rayに出力すると光沢の値は「鏡面反射」になってしまうので隣のオブジェクトが写り込むだけでハイライトはできません。
そこで「ハイライト」をつくるキーワードが上記の2種類です。
一応両方書いてもちゃんとレンダリングされますが、あまり意味が無いのでどちらかにしましょう。
specular には0.0から1.0の実数を指定します。0.0でハイライト無しで、1.0で光源の色と同色でハイライトが入ります。
そして、specular は roughness を使って大きさを制御します。
roughness には0.0から1.0の実数を指定し、値が大きいほどハイライトが大きくなります。
なおデフォルトの値が0.05ということからわかるように、0.1以下くらいの小さな値で十分です。
次に、phong です。
phong には0.0から1.0の実数を指定します。同様に0.0でハイライト無しで、1.0で光源の色と同色でハイライトが入ります。
phong は phong_sizeを使って大きさを制御します。
phong_size には0.0から250.0の実数を指定し、値が大きいほどハイライトが小さくなります。
『値を大きくすると小さくなる』ですので注意です。
ちなみに specular と phong の違いは計算法の違いで、specular のほうがより正確に表現できるらしいです。
最後に双方に使えるオプションとして metallic があります。
metallic には何も指定しないか0.0から1.0の実数を指定します。
値が大きいほどオブジェクトの表面の色が加えられて金属っぽいハイライトになります。
// ※注意:画像テクスチャを貼って出力したものであること texture{ uv_mapping pigment{ ...(略) } normal{ bump_map{ ファイル形式 "ファイル名" map_type 数値 bump_size 数値 } } finish{ ...(略) } }
グレイスケールの画像の濃淡を見かけ上の凹凸として貼付けるのがこの bump_map です。例えばメカもののパネルラインなどに使うとポリゴンを節約できて便利です。
使用例:同じテクスチャを貼った同じモデルで、右が bump_map を使っています。
使い方は、まず texture の中に normal ブロックを書きます。
normal とは『法線』のことで、ある面に垂直なベクトルのことです。これを誤魔化すことであたかも凹凸があるかのように見せるのです。
そして normal ブロックの中に bump_map ブロックを書きます。
実は bump_map 以外にも関数テクスチャを使う slope_map などがあるのですが、ここでは画像テクスチャと同じところに貼られて制御しやすいので bump_map のみを説明します。
そして bump_map ブロックの中には画像テクスチャと同じ書き方で、ファイル形式(例:tga, png, gif など)とダブルクォーテーションで囲ったファイル名を書きます。
それに続いて、map_type と bump_size を指定します。
map_typeは texture の中に uv_mapping がついている場合はどうでも良いのかなと思いますが一応 pigment と同じ 0(平面マッピング)でも指定しておきましょう。
bump_size は見かけ上の凹凸の高さを指定します。大きくなるほど凹凸が大きいものとして計算します。
ただ、所詮見かけ上の凹凸なのであまり大きくしても奇妙な感じになりますので、0.1〜5.0くらいが良いらしいです。
//問題が無ければここは無視してOK //ファイルの最初に書きましょう global_settings{ max_trace_level 数値(デフォルトは5) } //interior は必ず最後に書かなければいけないらしい mesh2{ vertex_vectors{ ... } normal_vectors{ ... } uv_vectors{ ... } texture_list{ ... } face_indices{ ... } interior{ ior 数値 caustics 数値 } } //複数の mesh を1つにまとめて適用する union{ mesh2{//六角大王が出力した1つ目のmesh2 ... } ... mesh2{//六角大王が出力したN個目のmesh2 ... } interior{//最後に書く ior 数値 caustics 数値 } }//union の閉じ括弧
レイトレースと言えば反射と屈折。という訳で屈折です。
とはいえどうも mesh2 は interior を追加する事をあまり考えていない構造になっているようで、ここにあげるのは「一応これでできるよ」というようなものです。バージョンが変わると違う方法がスタンダードになったりするかもしれません。
まずは mesh2 の最後に interior を追加します。最後に追加しないとエラーになります。ご注意を。
iorは屈折率(index of refraction)の数値です。多くは1.0以上の数値になります。ちなみに1.0では屈折はおこりません。
実際には水が約1.3、ガラスで1.5くらいだそうですが、見た目のフィーリングでやるのが吉です。
caustics は集光の制御になります。いわゆる虫眼鏡で光を集めたときの真ん中の明るい部分の表現です。
0.0 では集光が起こらず、値が大きくなるほど光の集まって明るくなっている部分が小さくなります。
ちなみに屈折率とは無関係のようです。
あと物体を通して見た向こう側が虹色にぼやけて見える dispersion などのオプションもありますが、ここでは割愛します。
最後に、interior を適用したものをレンダリングするとオブジェクトの一部が奇妙に黒くなったりします。
これは POV-Ray が合わせ鏡のような場合に備えて屈折や反射の回数に制限を設けていて、ポリゴンの重なり具合によって制限に達してしまうからのようです。
これを変更するのが global_settings のmax_trace_level です。
デフォルトが 5 なので適当に増やしてみるときちんとレンダリングされるはずです。