プロシージャルなコンテンツ生成アルゴリズムを試してみたいので、ノイズ (パーリン、値など) から始めることにしました。
そのために、一般的なn次元ノイズ関数が必要です。そのために、指定された次元のノイズ生成関数を返す関数を作成しました。
small_primes = [1, 83, 97, 233, 61, 127]
def get_noise_function(dimension, random_seed=None):
primes_list = list(small_primes)
if dimension > len(primes_list):
primes_list = primes_list * (dimension / len(primes_list))
rand = random.Random()
if random_seed:
rand.seed(random_seed)
# random.shuffle(primes_list)
rand.shuffle(primes_list)
def noise_func(*args):
if len(args) < dimension:
# throw something
return None
n = [a*b for a, b in zip(args, primes_list)]
n = sum(n)
#n = (n << 13) ** n
n = (n << 13) ^ n
nn = (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff
return 1.0 - (nn / 1073741824.0)
return noise_func
問題は、計算にあると思います。コードは次の 2 つの記事に基づいています。
- Hugo Elias の値ノイズの実装(ページの最後)
- libnoise ドキュメント
私のテストの例:
f1 = get_noise_function(1, 10)
print f1(1)
print f1(2)
print f1(3)
print f1(1)
より高い次元や異なるシードであっても、常に -0.281790983863 を返します。
問題は、C/C++ では一部の計算でオーバーフローが発生し、すべてが機能することだと思います。Pythonでは、巨大な数を計算するだけです。
これを修正するにはどうすればよいですか、可能であれば、シードされた後、特定の入力に対して常に同じ値を返す疑似乱数関数を生成するにはどうすればよいですか。
[編集] コードを修正しました。今では動作します。