ドメインワープで雲を作る(2020.03.19)

作品解説

 この作品は、つぶやき Processing で、 もう少し絵画的な表現ができないものかと試行錯誤したものでした。 描きこむとコード量が多くなり、結果として 1 ツィートに収めることができませんでした。

 プログラムとしては、これまで雲の表現で使っていなかった ドメインワープという技法を使っています。 簡単な解説は次のセクションに記します。

ソースコードと解説

 この作品のソースコードを以下に示します:

def setup():
    size(500,500,P3D)
    noStroke()
    hint(DISABLE_DEPTH_TEST)

def draw():
    background(235)

    # 塀の線
    stroke(0)
    line(124,264,120,500); line(433,246,470,500)

    # 青空
    f=frameCount*.02
    rotateX(-.8)
    rotateZ(-.1)
    translate(0,-100,0)
    fill(100,140,255)
    rect(0,0,500,500)

    # 雲の描画処理
    noStroke()
    for iy in range(100):
        for ix in range(100):
            t=noise(ix*.1+f,iy*.1+f,noise(iy*.5+f,ix*.2,f))-0.5
            fill(255,t*800)
            circle(ix*5+5,iy*5,10)
    filter(BLUR,1)

 ソースコード中の、

t=noise(ix*.1+f,iy*.1+f,noise(iy*.5+f,ix*.2,f))-0.5

という部分がドメインワープの部分です。

ドメインワープとは何か?

 ドメインワープの説明の前に、用語の説明をします。 ある関数 f があり、例えば x の値により高さ y が定まる、 なんていう場合は y=f(x) という式を使ったりします。

このとき、x の動く範囲を「定義域」と呼び、これを英語で domain (ドメイン)と呼びます。

ちなみに、x がドメイン中を動き回って様々な y の値が得られる訳ですが、 この y が変動する範囲を「値域」と呼び、英語では range (レンジ)と呼ばれています。

 ドメインワープというテクニックは、 文字通りドメインをワープさせる(=歪ませる)という手法です。

上に示した t を決めている式では、 noise 関数の引数として、さらに noise 関数を使った値が利用されています。

単に noise(u,v) とするのではなく、 例えば noise(noise(u),v) とか noise(u,noise(v)) などの様に、 noise 関数への入力(=引数)に noise 関数の結果を使うことをドメインワープと呼びます。

もちろん、 これはどちらか 1 つの引数を歪ませなければならないというわけではなく、 noise(noise(u),noise(v)) などとしても問題ありません。

とにかく、関数への入力を歪ませる=ワープさせる、という手法を ドメインワープと呼んでいます。

 手法が異なると、表現も変わってきます。 空と雲については、これまでいくつかの作品を発表してますので、 もしよかったら見比べてみて下さい。