4

3D パーリン ノイズ ジェネレーターを作成しています。毎回同じランダム値が得られるように、座標がシードであることが重要です (ノイズが保存されることはありません)。これは、座標であるシードに基づいてランダムな値を生成するための私の関数です:

__forceinline float getRandomField(const vec3& Position) const
{
    uint32_t seed = uint32_t(Position.x);
    seed <<= 8;
    seed ^= 0xE56FAA12;
    seed |= uint32_t(Position.y);
    seed <<= 8;
    seed ^= 0x69628a2d;
    seed |= uint32_t(Position.z);
    seed <<= 8;
    seed ^= 0xa7b2c49a;

    srand(seed);

    return (float(int(rand()%2001) -1000)/1000.0f);
}

結果 (x,y 平面のスライス):

望ましくないパターンのパーリン ノイズ

奇妙なことに、これは私にパターンを与えます。明らかに、私は自分が何をしているのかわかりません。私はそれがいくつかの奇妙なxor値を適用し、ランダムシードにビットシフトすると乱数が得られると思います。どうやら私が間違っていたようです。

パターンにならずに座標からランダムな値を作成する最良の方法は何ですか?

4

1 に答える 1

2

同じ問題を抱えている可能性のある他の人に答えを与えるだけです。かなり良い結果をもたらすものを見つけました。rand() 関数も必要ありませんでした。

__forceinline float getRandomField(const vec3& Position) const
{
    uint32_t seed = uint32_t(Position.x)*1087;
    seed ^= 0xE56FAA12;
    seed += uint32_t(Position.y)*2749;
    seed ^= 0x69628a2d;
    seed += uint32_t(Position.z)*3433;
    seed ^= 0xa7b2c49a;

    return (float(int(seed%2001) -1000)/1000.0f);
}

重要なのは、各軸に素数を掛けることです。ウィキペディアでこれらを見つけました: 1087,2749,3433. xor'ed の 16 進値は、私がランダムに叩きつけたものです。私の知る限り、それらは素数ではありません。結果を確認してください:

悪くないでしょ?

于 2013-06-12T21:23:16.473 に答える