ドメインワーピング
https://gyazo.com/d3648ef759db03e53ff91193889a3bf6
https://scrapbox.io/files/64a5361411d6fd001b978d5f.png
コード
code:Main.cpp
# include<Siv3D.hpp> // OpenSiv3D v0.6.10
void Main()
{
PerlinNoise noise;
while(System::Update())
{
double t = Scene::Time() * 5;
for (Vec2 p : step(Scene::Size() / 8))
{
Vec2 q{ noise.normalizedOctave2D0_1(p.x / 8.0 + t, p.y / 8.0 + t, 8),
noise.normalizedOctave2D0_1(p.x / 8.0 + t * 1.2, p.y / 8.0 + t * 1.5, 8) };
double v = noise.normalizedOctave2D0_1(p.x / 10 + q.x, p.y / 10 + q.y, 8);
RectF{ p.x * 8, p.y * 8, 8 }.draw(HSV(200, 0.5, v * 1.3));
}
}
}
説明
2番目に表示されている画像は、PerlinNoiseによって生成されたノイズです。このノイズをさらにPerlinNoiseによって歪ませることで流体のような動作が得られます。これは、ドメインワーピングと呼ばれる手法です。ただし、画面全体に対する処理をC++で愚直に書いているので重いです。ちなみに、このPerlinNoiseはRandom()のように呼び出す度に異なる結果が得られるのではなく、同じ引数を指定したらループの中で何度呼び出しても同じ値が得られます。
パラメータは適当です。
追記
normalizedOctave2D0_1の3つめの引数を8から4とかにするだけでパフォーマンスは落とさずにだいぶ軽くなると思います
キーワード
PerlinNoise, Fractal brown motion(FBM), Domain warping
作者
たのれん