mieki256's diary



2021/08/30(月) [n年前の日記]

#1 [povray] POV-Rayで任意のオブジェクトをレンダリング対象から外す

POV-Ray 3.7 でレンダリングする際、背景だけをレンダリング対象から外して、背景部分を透明にできないものかとググって調べていたのだけど。

オブジェクトに no_image という命令を付け加えるだけで、そのオブジェクトはレンダリングしないように指定することができる、と知った。

_POV-Ray: Documentation: 2.4.9.7 No_Image, No_Reflection
_11.4-5 物体のイメージスイッチ(no_image) - POV-Ray:11

例えば、以下のようなレンダリング結果が得られる .pov があったとして…。

_40_no_image.pov

40_no_image_not_no_image.png

床に相当する plane の最後に、no_image を指定してみる。
plane {
  <0, 1, 0>, 0 
  texture {
    pigment {
      checker color rgb 0.5, color rgb 0.2
    }
    // normal { bumps 0.75 scale 0.025}
    finish { phong 0.1 reflection 0.8 }
  }
  translate <0, -1, 0>
  no_image
}

すると、こうなる。

40_no_image_no_image.png

床相当の plane はレンダリングされず、その部分は透明になった。しかし、球の下半分には、床相当の plane がちゃんと映り込んでいる。

ということで、「このオブジェクトだけレンダリング対象から外したい」と思った時は、no_image が使えますよ、ということで。

しかし、「これで背景をレンダリング対象から外せるのでは?」と期待したものの、そう上手くはいかなくて。

.pov の中に自分で記述した object { - } 等には no_image を追加できるけど、例えば、星空を生成してくれる GALAXY.INC のようなソレに対して no_image を指定する方法が分からなくて。

また、背景球を指定できる sky_sphere に対して no_image を使おうとしたらエラーになった。どうやら、sky_sphere は特殊な扱いなので、no_image はサポートしてないっぽい。

大きな球に画像を貼り付けて背景代わりにする。 :

背景をレンダリング対象から外せないのかなとググっていたら、「シーンを包む巨大な球に背景画像を貼り付けて背景扱いにすることができるよ」という話を見かけた。

_POV-Ray: Newsgroups: povray.general: HDR Sky_sphere

言われてみれば、大昔に Shade を使って3DCGをやってた頃にも、雑誌でそういう作例を見かけた記憶があるな…。車をぐるりと取り囲む球面を作って、そこに背景っぽいテクスチャを貼ってたっけ…。POV-Ray でも、あのやり方は使えるのだな…。

となると、背景画像として使える画像をゲットしないといけない。今回は、星空を生成できる GALAXY.INC の結果画像のみをゲットする .pov を書いて、その出力画像を背景画像として使ってみよう。

_bg.pov
//#declare galaxy_seed = 541;
#declare galaxy_seed = 32;

#include "GALAXY.INC"

camera {
  // panoramic
  spherical
  location <0, 0, -5>
  look_at <0, 0, 0>
  // angle 360
  right x*image_width/image_height
}

camera に、spherical を指定しているあたりがポイント。この指定で、球に貼り付ける分には都合が良いテクスチャ画像が得られる。らしい。

こんな見た目の画像が得られた。

bg_4096x2048_thumb.jpg

実際の画像は以下。4096x2048ドットのpngなので、10MB近くあるので注意。プログラムと乱数で生成された画像だから、Public Domain 扱いでいいんじゃないかな…。

_bg_4096x2048.png (4096x2048, 24bit, 9.67MB)

camera に指定できる種類については、以下のページが参考になった。ありがたや。

_POV-Ray:5
_Types of Cameras in POV-Ray

最初は panoramic を指定してパノラマ画像を得ていたのだけど、その後、「球に貼り付けることが前提の画像が欲しいなら、そのものズバリ spherical のほうが良い」と知って、そちらに変更した次第。

余談。camera に、panoramic と angle 360 を指定した際は、左端と右端が全然繋がってない出力画像が得られた。angle に指定した値がおかしいのだろうか…? それとも、panoramic では左右が繋がった画像が原理的に得られないのだろうか…?

さておき。得られた画像を、大きな球に貼り付けて確認してみる。以下では、scale を使ってめっちゃ大きい球にしている。

_bg_sphere.pov
camera {
  location <0, 0, -2.6>
  look_at <0, 0, 0>
  angle 45
  right x*image_width/image_height
}

light_source { <100, 100, -100> color rgb 2.0 }

// background sphere
object {
  sphere {
    <0, 0, 0> 1
    texture {
      pigment {
        image_map {
          png "bg_4096x2048.png"
          map_type 1
        }
      }
      finish {
        phong 0
        reflection 0.0
      }
    }
    rotate <0, 0, 0>
    scale 1000
  }
}

bg_sphere.png

GALAXY.INC で生成・表示した背景と比べると、無駄に拡大表示されちゃった感じで見た目が荒くなってるけど、あくまで、オブジェクトに反射させるための背景として使うだけだから、これでもイケそうな気がするなと…。

UFOモドキの背景に使ってみる。 :

_昨日_一昨日 の作業に使った、UFOモドキの .pov の背景に使ってみる。

_ufo_sample2.pov

背景相当の巨大球をそのまま表示してみた場合は以下。

ufo_sample2_normal.png

結構それっぽい感じに見えている気がする。まあ、環境マッピングみたいなもんだから、それらしく見えるのは当たり前か…。

巨大球に no_image を追加して、レンダリング対象から外してみる。

ufo_sample2_no_image.png

背景部分が透明になった感じの結果画像が得られた。それでいて、オブジェクトにはちゃんと映り込みが反映されている。

一応、アニメGIFやスプライトシートも作ってみた。1フレーム80x80ドットの大きさ。20フレーム。

ufo_anime.gif

spritesheet.png

_spritesheet.png

ということで、POV-Ray でわざわざ時間をかけて2回レンダリングして、ImageMagick でアルファチャンネルの移植処理なんてしなくても、.pov の書き方を少し工夫するだけで背景部分が透明になった感じの画像を得ることができると分かった。

「お〜い!磯野〜! blender使おうぜ!」

だから誰だよ。まあ、たしかに、blender ならこんなことで悩まずに済むし、この手の頓智(?)も要らないだろうなあ…。

以上です。

過去ログ表示

Prev - 2021/08 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project