忍者ブログ
場所取り そのうち引っ越すかも http://maglog.jp/gltest/
[8] [7] [6] [5] [4] [3] [2] [1]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

gltestss35.jpg gltestss36.jpg

asteroid.png


自然に見えるアステロイドを自動生成する方法を考えてみた。

最も簡単な実装は、経緯線で区切った球体メッシュの頂点をランダムにオフセットするというものだが、このランダムに一様乱数を使うと近隣の頂点との相関がないためにギザギザなアステロイドになってしまう。この方法は土星の環の粒子の描画などで用いていた。

画像のようなある程度の滑らかさを持つアステロイドを生成するために、二次元の 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

コメント


コメントフォーム
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字


トラックバック
この記事にトラックバックする:


忍者ブログ [PR]
カレンダー
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
フリーエリア
最新コメント
最新トラックバック
プロフィール
HN:
gltest
性別:
非公開
自己紹介:
バーコード
ブログ内検索
アクセス解析