POV-Rayで3Dオブジェクトからレリーフを作る。


レリーフを3Dのオブジェクトとして作るのは、なかなか難しいと思います。 2Dでは、フォトレタッチソフトでレリーフのような効果を出すものもありますが、 実際のレリーフとはほど遠いものです。 モデリングソフトでも、かなり平たい構造なので難しいでしょう。 一番良く思いつくのは、Height Fieldを使う方法だと思いますが、 いまのところ、山のようなランダムなものを作るソフトはありますが、 レリーフのようなものを作れるソフトは見当たりません。(知らないだけかも) たとえそのようなソフトがあったとしても、Cameoのような形状を 作るのは、かなり難しいでしょう。
と思っていたところ、面白いものを見つけました。 ここにある論文によると、3Dオブジェクトから奇麗なレリーフが 作れるらしいのです。 次元を落としているわけなので、当たり前だと思うかも知れませんが。 その論文によると、
ある点のレリーフの高さ=定数×1/本当のオブジェクトまでの距離
にするといいのだそうです。距離を無限大にすると、上の値は0ですから 無限に向こうにある点は高さ0ということになります。 上のページには、レリーフ生成ソフトもダウンロードできるのですが、 IRIX用なので、僕は使うことができませんでした。 しかし、ソフトを使わなくてもPOVだけでどうにかなるのでは?? と考えて実験してみることにしました。


その方法としては、

  1. 対象のオブジェクトに、高さが、上の式のとおりに、視線に平行な方向に 変化するようにgradientを使ってテクスチャを設定する。
  2. それをQuality=0でレンダリング。ハイトフィールド用の画像を作る。
  3. できた画像をハイトフィールドとしてレンダリングすれば出来上がり。

始めのテクスチャの設定が少し難しいところです。視線に平行にするのは いちいち手で計算すると面倒なので、Perlでスクリプトを書きました。 ここ にあります。このスクリプトの使いかたは、
perl relief.pl camera look_at top bottom file
です。cameraは、カメラの場所です。座標を、20,10,-3のように指定します。 間に空白は開けられません。 look_atは、カメラが狙うポイントです。カメラと同じように指定します。 topと、bottomは視線の直線上で、カメラからどれくらい離れたところを 一番高いところ、低いところに設定するかを決めます。 これは、後のファイルによって違う意味になります。 fileは、オブジェクトのファイル名です。これは指定しないこともできます。
指定した場合、このスクリプトはそのファイルの中の すべての座標("<xx, yy, zz>")を抜き出して、その点を、視線の方向の直線上に垂直に 投影した時にどこに来るかを計算します。 (詳しく言うと、内積を計算しているわけです。) topの値は、これで見つかった一番近い値になります。ユーザー指定のtopの値は、 始めのtopの値からどれくらいずらしたいかを指定することになります。 bottomも同様です。 あまり考えて作っていないプログラムなので、<xx, yy, zz>の形のものはすべて 座標だと思ってしまいます。カラーなどは指定しないようにして下さい。 また、オブジェクトがCSGで出来ているものなど、使われている座標が 実際のオブジェクトの座標に対応していない場合は、この方法は役に立たないので ファイル指定なしでやって下さい。
指定しなかった場合topとbottomの値は、 指定した通りの値になります。
どちらにしても、最終的なtopとbottomの値は、top<bottomとなっていないと だめです。また、top>0でもないといけません。 これを実行すると、テクスチャが出力されるので、 これを指定してQuality=0でレンダリングして下さい。 HF_Gray_16 Targaファイルで吐くともっと綺麗にできます。その場合、grobal_settings{hf_gray_16}を加え、Targa24ビットで出力するように、+FTオプションをつけます。すると、こんなものが出来ます。

あとは、これを再びPOVでハイトフィールドとしてレンダリングするだけです。 こんな感じになります。

横から見るとこんな感じ。

高さを調整したりすれば、奇麗なCameoなんかも作れると思います。 今度何かのオブジェクトで試してみる予定。 Quality=0でレンダリングしたものをハイトフィールドに使うところがミソです。 他の方法で、もっと面白いものが出来るかも知れません。 いろいろ試してみると面白いと思います。