読者です 読者をやめる 読者になる 読者になる

空のメソッド(Blender Advent Calendar 2014)

Blender Advent Calender 2014 12/11 の記事です。

かんたんななにか(仮) 改め かんたんな空のメソッド です。

最近はHDRの天球画像なども割と簡単に手に入りますが、たまには内蔵のSkyを使って空を作ってみることもあると思います。 適当にSkyテクスチャを設定して、ノイズとカラーランプで雲っぽいものを重ねて大体こんな感じでしょうか。

f:id:c5h12:20141210052309p:plain

f:id:c5h12:20141210052332j:plain

はいできました。それでは明日は…といいたいところですがそんな雲で満足ですか!

というわけで突然ですが入力のベクトルをベクトルのzで割り算します。Blenderは上がzなので高さで割るということです。

f:id:c5h12:20141210052359p:plain

f:id:c5h12:20141210052411j:plain

そうです雲はこうやって地平線まで広がってないといけません。 でもちょっと平ら過ぎて微妙な気もします。

さらに唐突になにやら数式を引っ張っりだしてきます。

f:id:c5h12:20141210052429p:plain

f:id:c5h12:20141211002424j:plain

地平線に向かって下がってくるような感じになりました。 ちょっとはましになったでしょうか。

ちなみに最後の計算部分をOSLで書くとこうなります。

shader SphereCloud(
    vector in_vector = vector(0, 1, 0),
    float R = 1.0,
    output vector out_vector = vector(0, 1, 0)
)
{
    float r = R - 1.0;
    float z = in_vector[2];
    float t = sqrt(r * r * z * z - r * r + R * R) - r * z;
    out_vector = in_vector * t;
}

そしてOSLを有効にしてスクリプトノードを使うとグラフもこんなにシンプルに。

f:id:c5h12:20141210052458p:plain

OSLをエクスプレッションのように使うと、複雑にならなくていい感じになることもあるので意外と便利です。

ちなみにこれらが何をやっているのか、xz平面の2次元で図を描いてみます。

何もしないのものは単純に半径1の球でテクスチャをサンプリングします。

f:id:c5h12:20141210232950p:plain

zで割るのは高さを1に揃えるということです。相似な図形の問題ですから簡単ですね!

f:id:c5h12:20141210233003p:plain

最後のややこしいのは中心をずらして上側を1に合わせた半径Rの球上をサンプリングしています。 下の図では下の方にあるグレーの点がずらした球の中心です。

f:id:c5h12:20141210233015p:plain

ベクトルが使えれば楽ですが三平方の定理を知っていれば式も求められると思うので気晴らしにでもどうぞ。

最後にこの例のBlendファイルを置いておきます。 それぞれのセッティング毎にシーンにわけてありますので興味があれば。

以上かんたんな空のメソッドでした。

明日のBlender Advent Calender 2014Minamo173さんです。

それでは!