gpt4 book ai didi

c++ - 制作随机柏林噪声时如何避免模式

转载 作者:太空狗 更新时间:2023-10-29 23:06:03 27 4
gpt4 key购买 nike

我正在制作一个 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 平面中的切片):

Perlin noise with undesired pattern

奇怪的是,这给了我一个模式。显然,我不知道自己在做什么。我虽然应用了一些奇怪的 xor 值并将比特移入随机种子会给我一个随机数。显然我错了。

从坐标创建随机值而不产生图案的最佳方法是什么?

最佳答案

只是为了给可能有同样问题的其他人一个答案。我找到了一个产生了相当不错的结果。我什至不需要 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 的十六进制值只是我随机敲定的。据我所知,它们不是素数。查看结果:

Not bad huh?

关于c++ - 制作随机柏林噪声时如何避免模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17074646/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com