POV-Ray ガラスの球を浮かべてみる

ベタです。POV-Ray楽しいので、復習も兼ねて、紹介と忘備録がてら。

インストール

ソフトはGUICUIもあるようです。macでblewはCUIしかないみたい。以下のコマンドでサクッとインストール完了。

> brew install povray

GUIは、やったのもう20年も前なので忘れた。

環境

GUIの場合はシーン記述用のエディタっぽいスペースがあるはず。ワタシCUIナノデワカラナイ。
CUIの場合は、以下コマンドでレンダリングできます。

> povray scene.pov

「scene.pov」はPOV-Rayレンダリング用のシーンを記述したファイルです。

とはいえ最近は、VSCodeでシーンファイルを記述し、POV-Ray用拡張機能でボタン一発レンダリングしています。結果の表示までやってくれてラクチンです。すごいねVSCode。なんでもできちゃうね。
拡張機能入れるとVSCodeの右上にPOV-Rayアイコンのボタンが現れます。これがレンダリングボタンです。CUI入れましたが、実質GUIみたいなものです。はっきり言ってオススメです。

とりあえず球を作ってみる

POV-Rayでは、テキスト形式で記述されたシーンファイルを元にレンダリングします。なにはともあれまずは簡単なシーンファイルをレンダリングしてみます。

#include "textures.inc"
#include "Woods.inc"

camera {
    perspective
    location <5,2,1>
    right <-1.33,0,0> // 座標系を左手から右手へ
    sky <0,0,1>       // 座標系を左手から右手へ
    look_at <0,0,0>
}

light_source { 
    <10,10,10> 
    color rgb <1,1,1>
}

object { 
    sphere {<0 , 0 , 0> , 1} 
    material { M_Glass }
}
 
object{
    plane{
        z, 0
        texture {T_Wood12}
        translate <0, 0, -2>
    }
}

上記のファイルを拡張子.povで保存してレンダリング。同階層にPNGファイルが作成されます。

f:id:m-zaki:20201103014005p:plain

木の面の上にガラスが浮きました。

座標系

シーンファイル内においては場所の指定はXYZ座標系で行います。注意すべきは、POV-Rayは何もしなければ「左手系」(高さ方向がYになります)ということです。CGの世界では昔は「左手系」が主流だったそうです。ただ今はどこも「右手系」(高さ方向がZ)ですよね。ワタシも今まで生きてきて九割九分「右手系」でした。

f:id:m-zaki:20201029013404p:plain

左手系から右手系への変換はcamera内に以下記述します。

camera{ 
        ...
        right < -1.33, 0, 0 >
        sky < 0, 0, 1 > 
        ...
} 

カメラをグイッと傾けるイメージなんですね。詳しい解説は後日書くことにして、まずはオマジナイと思っておこう。

includeファイルを読んでみる

上のシーンファイルですが、M_GlassというテクスチャとT_Wood12という木の質感を使っています。それぞれ"textures.inc", "Woods.inc"内で定義されています。例えばM_Glassについては、textures.inc内では以下のように書かれています。

#declare Glass_Finish=
finish {
    specular 1
    roughness 0.001
    ambient 0
    diffuse 0
    reflection 0.1
 #if (version<3.1)
    ior 1.5
 #end
}

#declare Glass_Interior = interior {ior 1.5}

#declare Glass = 
texture {
    pigment { rgbf<1.0, 1.0, 1.0, 0.7> }
    finish  { Glass_Finish }
}
#declare M_Glass = material {texture {Glass} interior {Glass_Interior}}

これを最初のシーンファイルに展開すると以下のようになります。

//#include "textures.inc"
#include "Woods.inc"

camera {
    perspective
    location <5,2,1>
    right <-1.33,0,0> // 座標系を右手から左手へ
    sky <0,0,1>       // 座標系を右手から左手へ
    look_at <0,0,0>
}

light_source { 
    <10,10,10> 
    color rgb <1,1,1>
}

object { 
    sphere {<0 , 0 , 0> , 1} 
    material {
        texture {
            pigment { rgbf<1.0, 1.0, 1.0, 0.7> }
            finish {
                specular 1
                roughness 0.001
                ambient 0
                diffuse 0
                reflection 0.1
            //#if (version<3.1)
            //  ior 1.5
            //#end
            }

        } 
        interior {ior 1.5}
    }
}
 
object{
    plane{
        z, 0
        texture {T_Wood12}
        translate <0, 0, -2>
    }
}

textures.incはコメントアウトしていますが、レンダリングできます。当たり前ですが、もともとあるincludeファイルは活用すべきですね。
同じようなこともT_Woodでもできますが、さらに煩雑になるので割愛。

includeファイルの中を読んでいくのも面白いと思います。上の例も、なんとなくですがガラスというものをどう言う風に定義しているか、分かりますもんね。辞書ひいて意味調べながら、数値を弄ってどう変わるか、とかやり出したら結構時間盗られました。バックアップとった上でincludeファイルを直接編集するのも面白いかも。

次何作ろうかな

やりだしたらかなり時間盗られますね。こういうのって、最初の例までやって満足して終わるパターンが往々にしてあるのですが、POV-Rayは結構楽しいのでもう少し続けたいところ。ブログにも(誰も求めてないけどワタシだけが求めてる)メモを残しながらいければは思います。