|
場所取り そのうち引っ越すかも http://maglog.jp/gltest/
× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。 自然に見えるアステロイドを自動生成する方法を考えてみた。 最も簡単な実装は、経緯線で区切った球体メッシュの頂点をランダムにオフセットするというものだが、このランダムに一様乱数を使うと近隣の頂点との相関がないためにギザギザなアステロイドになってしまう。この方法は土星の環の粒子の描画などで用いていた。 画像のようなある程度の滑らかさを持つアステロイドを生成するために、二次元の Perlin Noise を試してみた。 Perlin Noise とは、 Ken Perlin が開発した”自然に見えるノイズ”で、簡単な実装で雲、炎、木目のテクスチャーなどが生成できることで重宝されている技術である。ちなみに Ken Perlin は映画「 Tron 」のためにこの技術を発明したことで映画芸術科学アカデミーから賞を受賞したらしい(英語 Wikipedia の記事)。 3DCGの分野ではテクスチャーに使われることが多いこの技術だが、ここでは空間的位置を操作するために使ってみた。生成したノイズはオフセットマップとして使い、経度と緯度で決まる頂点ごとに球の中心からの距離を変化させている。 ただし、普通の Perlin Noise では北極と南極の付近で経線の間隔が狭くなるために、見かけの粗さが変わってしまう。これを回避するため、赤道付近から極にかけて連続的にノイズの振幅を減らしていくようにした。 こうしてできたオフセットマップが3枚目の画像である。 以下はオフセットマップを生成する関数である。
#define OCTAVES 4
#define SLICES 32
#define STACKS 16
static void sphere_perlin_noise(double field[SLICES][STACKS+1], long seed){
int octave;
static const int octaves = OCTAVES;
struct random_sequence rs;
double buf[OCTAVES][SLICES][STACKS+1];
int xi, yi, s, t;
init_rseq(&rs, seed);
for(octave = 0; octave < octaves; octave++){
int cell = 1 << octave;
int k;
for(xi = 0; xi < SLICES / cell; xi++) for(yi = 0; yi < (STACKS+1) / cell; yi++){
int base;
buf[octave][xi][yi] = (drseq(&rs) - .5) /*/ (octaves - octave)*/;
}
}
for(xi = 0; xi < SLICES; xi++) for(yi = 0; yi < (STACKS+1); yi++){
int xj, yj;
double sum = 0;
for(octave = 0; octave < octaves; octave++){
int cell = 1 << octave;
for(xj = 0; xj <= 1; xj++) for(yj = 0; yj <= 1; yj++){
sum += (double)buf[octave][(xi / cell + xj) % (SLICES / cell)][(yi / cell + yj) % ((STACKS+1) / cell)]
* (xj ? xi % cell : (cell - xi % cell - 1)) / (double)cell
* (yj ? yi % cell : (cell - yi % cell - 1)) / (double)cell;
}
}
field[xi][yi] = yi == 0 || yi == STACKS ? 1. :
(1. - ((yi - STACKS / 2.) * (yi - STACKS / 2.)) / (STACKS / 2.) / (STACKS / 2.)) * (sum / octaves) * 2.5 + 1.;
}
}
3次元パーリンノイズの動画:PR
|
カレンダー
フリーエリア
最新コメント
最新記事
(10/03)
(09/16)
(07/12)
(06/11)
(06/01)
最新トラックバック
ブログ内検索
最古記事
(09/09)
(09/17)
(09/27)
(10/11)
(02/20)
アクセス解析
|
